Apr-15-2021, 03:21 PM
I have gotten my script farther and farther along thanks to some help here. I am now trying to get things to where the temperature bar has an automatic cool down to a set level if the keyboard is not pressed, a temperature warning and stop on further key presses until a quarter second cool down occurs and then a critical alert at 100 rounds and 0 round alert. The alerts would come from one button/label. Programatically is there a good example I can reference so I can figure this out a little more easily myself?
This is the code:
This is the code:
import tkinter.ttk as ttk
import tkinter as tk
# sets ammo count to initial value of 500
INITIAL_COUNTER_VALUE = 500
# sets initial time at 100%
INITIAL_TIMER_VALUE = 33000
# sets initial gun terminal ID
#sets gun rate
RMMAX = 0
# sets initial temparature
TEMP_INITIAL = 30
# sets text string for ammo/temp/low ammo status button
STATUS = "OK"
# initial class declaration for main body of program
class TkApp(tk.Tk):
# these arguments initialize the class and how to form arguments within
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# set screen options
self.geometry("640x400")
self.configure(bg='black')
self.title("Sentry Terminal")
# locally initialize ammo count down
self.counter = tk.IntVar()
self.counter.set(INITIAL_COUNTER_VALUE)
# locally sets the timer count down at 100%
self.timer = tk.IntVar()
self.timer.set(INITIAL_TIMER_VALUE)
# locally sets rmbar to 0%
self.rmcount = tk.IntVar()
self.rmcount.set(RMMAX)
# locally sets tempbar
self.temperature = tk.IntVar()
self.temperature.set(TEMP_INITIAL)
# locally sets text string for ammo status button
self.stat = tk.StringVar()
self.stat.set(STATUS)
# this arranges the grid row and column groupings.
tk.Grid.rowconfigure(self, 0, weight=1, uniform='c')
tk.Grid.rowconfigure(self, 1, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 2, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 3, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 4, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 5, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 6, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 7, weight=1, uniform='b')
tk.Grid.rowconfigure(self, 8, weight=1, uniform='b')
tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
tk.Grid.columnconfigure(self, 1, weight=1, uniform='a')
tk.Grid.columnconfigure(self, 2, weight=1, uniform='a')
tk.Grid.columnconfigure(self, 3, weight=1, uniform='a')
tk.Grid.columnconfigure(self, 4, weight=1, uniform='a')
tk.Grid.columnconfigure(self, 5, weight=1, uniform='a')
# these are the button and label declarations
rounds = tk.Label(self, justify=tk.CENTER, textvariable=self.counter)
rounds.grid(row=3, column=2, columnspan=1, sticky="EW")
label1 = tk.Label(self, textvariable=self.timer)
label1.grid(row=7, column=2, sticky="EW")
temp = tk.Button(self,justify=tk.CENTER,text="Temp",bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
temp.grid(row=2,column=4,sticky="NSEW")
rm = tk.Button(self,justify=tk.CENTER,text="R(M)",bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
rm.grid(row=2,column=5,sticky="NSEW")
# rounds rate bar
rmbar = ttk.Progressbar(self, orient="vertical", variable=self.rmcount)
rmbar.grid(row=3,column=5,rowspan=6, sticky="NS")
# temperature bar
tempbar = ttk.Progressbar(self, orient="vertical", variable=self.temperature)
tempbar.grid(row=3,column=4,rowspan=6,sticky="NS")
# declarative buttons
timestat = tk.Button(self,bg='black',state=tk.DISABLED, fg='yellow',disabledforeground='yellow',highlightbackground='yellow',borderwidth=2,justify=tk.CENTER,text="TIME AT 100% \n (msecs)")
timestat.grid(row=7,column=0,columnspan=2,sticky="NSEW")
roundsr = tk.Button(self,bg='black',state=tk.DISABLED, fg='yellow',disabledforeground='yellow',highlightbackground='yellow',borderwidth=2,justify=tk.CENTER,text="Rounds \n Remaining")
roundsr.grid(row=3,column=0,columnspan=2,sticky="NS")
# crit menu bar
crit = tk.Button(self,justify=tk.CENTER,textvariable=self.stat, bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow')
crit.grid(row=5,column=0,columnspan=2,sticky="NSEW")
# static center header
headernew = tk.Button(self, bg='black',state=tk.DISABLED,justify=tk.CENTER, text="UA 571-C \n REMOTE SENTRY WEAPON SYSTEM")
headernew.grid(row=0,column=1,columnspan=4,rowspan=2,sticky="NSEW")
# displays gun id on top left and right of screen
gun_1 = tk.Label(self, borderwidth=7,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,text="kp")
gun_1.grid(row=0,column=0,rowspan=2,sticky="NS")
gun_2 = tk.Button(self, borderwidth=7,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,text="kp")
gun_2.grid(row=0,column=5,rowspan=2,sticky="NS")
# this quits by clicking a button labeled q
quit = tk.Button(self, bg='black', fg='yellow', text='q', command=self.quit)
quit.grid(row=8,column=0,sticky="SW")
# these are the attachments for input from keyboard into the application
# These are the button inputs from the original flash app that were used
# I added a q as well to quit and close window in case there was a need to close
self.bind("<KeyPress-f>", self.on_keypress_f)
self.bind("<KeyRelease-f>", self.on_keyrelease_f)
self.bind("<KeyPress-a>", self.on_keypress_a)
self.bind("<KeyPress-b>", self.on_keypress_b)
self.bind("<KeyPress-c>", self.on_keypress_c)
self.bind("<KeyPress-d>", self.on_keypress_d)
self.bind("<KeyPress-r>", self.on_keypress_r)
self.bind("<KeyPress-q>", self.on_keypress_q)
self.bind("<KeyPress-space>", self.on_keypress_space)
# this defines the fire ammo count down sequence and resets
def on_keypress_f(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
# this is logic to try and get ammo warnings
if counter_value == 490:
stat_value = "OUT"
else:
stat_value = "OK"
self.stat.set(stat_value)
# this sets the time at 100%
timer_value = self.timer.get()
timer_value = timer_value-66 or INITIAL_TIMER_VALUE
self.timer.set(timer_value)
# this sets the rmbar to 40%
rmcount_count = self.rmcount.get()
rmcount_count = 40
self.rmcount.set(rmcount_count)
# this sets the temperature
temperature_count = self.temperature.get()
temperature_count = temperature_count+1
self.temperature.set(temperature_count)
def on_keyrelease_f(self, evet):
#this adds logic to say rate is zero if not firing
rmcount_count = self.rmcount.get()
rmcount_count = 0
self.rmcount.set(rmcount_count)
# this adds logic to say if not firing cool down
temperature_count = self.temperature.get()
temperature_count = temperature_count-10
self.temperature.set(temperature_count)
# this sets the gun terminal identification
# this can also be expanded to do other things if you want to alter the script
def on_keypress_a(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
def on_keypress_b(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
def on_keypress_c(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
def on_keypress_d(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
def on_keypress_space(self, evet):
counter_value = self.counter.get()
counter_value = counter_value-1 or INITIAL_COUNTER_VALUE
self.counter.set(counter_value)
# this reloads the window, you have to click it to make it the active window again
def on_keypress_r(self, evet):
self.destroy()
self.__init__()
# this quits and closes the window by hitting a single key
def on_keypress_q(self, evet):
self.quit()
# this executes the main loop and tkinter self delcared class. It declares the function then runs it in the main loop.
tk_app = TkApp()
tk_app.mainloop()
