Python Forum
drawing textvariable from Button inside canvas
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
drawing textvariable from Button inside canvas
#1
In the top left and right I am trying to draw a circle that a button will exist in that will change as certain keys are pressed.

import tkinter as tk
from tkinter import *
#import PIL.ImageTk
#import image
#import PIL
#import PIL.Image
import tkinter.ttk as ttk
import datetime as dt
import time
import os
from tkinter import messagebox
from collections import deque
from itertools import islice
from threading import Thread
from playsound import playsound

#
# global variables will be declared here
GUN = ""

# 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 = 20
# sets text string for ammo/temp/low ammo status button
STATUS = ""

COOLED = 20

# end global variables section
#
# This is the initial screen that loads and then disappears after 8 seconds 
# I used 3 images to make the main deal.  The issue was that pygame allowed for line draws
# tkinter only allows for drawing of boxes.  
# should this change I will change from using images.


# this defines the splash frame 
class SplashFrame(tk.Toplevel):
    def __init__(splash, *args, **kwargs):
        super().__init__(*args, **kwargs)
        splash.geometry('512x256')
        splash.title("Inititaling")
        splash.configure(background='black')
        splash.overrideredirect(True)
        splash.after(3000, splash.destroy)
        tk.Grid.rowconfigure(splash, 0, weight=1, uniform='a')
        tk.Grid.rowconfigure(splash, 1, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 2, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 3, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 4, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 5, weight=1, uniform='b')
        tk.Grid.rowconfigure(splash, 6, weight=1, uniform='b')

        tk.Grid.columnconfigure(splash, 0, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 1, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 2, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 3, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 4, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 5, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 6, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 7, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 8, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 9, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 10, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 11, weight=1, uniform='d')
        tk.Grid.columnconfigure(splash, 12, weight=1, uniform='d')
        styled = ttk.Style()
#('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
        styled.theme_use('default')
        styled.configure("TLabel", background='black', darkcolor='black', bordercolor='black', relief='none', lightcolor='black', highlightcolor='black', throughcolor='black', foreground='black', shiftrelief=-5, highlightthickness=0, width=0, anchor="NSEW")
        styled.configure("Horizontal.TProgressbar", foreground = 'black', background = 'yellow', bordercolor='black', darkcolor='black', throughcolor='black', lightcolor='black')
        loadingbar = ttk.Progressbar(splash, style="Horizontal.TProgressbar", orient="horizontal", length = 50, mode='indeterminate', maximum=100)
        loadingbar.grid(row=4, column=4, columnspan=2, sticky="NEW")
        loadingbar.start([48])
        tk.Label(splash, text="SYSTEM INITIALIZING", bg='black', fg='yellow', font="sentryTerminalfi 6").grid(row=3, column=4, columnspan=2, sticky="SEW")
        tk.Button(splash, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', highlightthickness=0, bd=0, borderwidth=0, justify=tk.CENTER, text="UA 571-C \n REMOTE SENTRY WEAPON SYSTEM", font="sentryTerminalfi 12").grid(row=2, column=2, columnspan=6, sticky="NEWS")        
        splash.canvas = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvas.create_line(5,5,50,5, fill='yellow')
        splash.canvas.create_line(5,5,5,50, fill='yellow')
        splash.canvas.grid(row=0, column=0, rowspan=2, columnspan=2) 

        splash.canvasright = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasright.create_line(5,5,45,5, fill='yellow')
        splash.canvasright.create_line(45,5,45,45, fill='yellow')
        splash.canvasright.grid(row=0, column=11, rowspan=2, columnspan=2) 

        splash.canvasbotright = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasbotright.create_line(5,45,45,45, fill='yellow')
        splash.canvasbotright.create_line(45,5,45,45, fill='yellow')
        splash.canvasbotright.create_text(22,27, fill='yellow', text="  28R \n LM 12", justify=tk.RIGHT, font="sentryTerminalfi 8")
        splash.canvasbotright.grid(row=5, column=11, rowspan=2, columnspan=2) 

        splash.canvasbotleft = tk.Canvas(splash, width=50, height=50, bg='black', highlightthickness=0)
        splash.canvasbotleft.create_line(5,45,45,45, fill='yellow')
        splash.canvasbotleft.create_line(5,5,5,45, fill='yellow')
        splash.canvasbotleft.create_text(25, 35, text="V5.48", fill='yellow', font="sentryTerminalfi 6")
        splash.canvasbotleft.grid(row=5, column=0, rowspan=2, columnspan=2) 

#
# End of splash screen defined class and related functions
#




#------------begin select screen------------------------------
# Begin select menu defined class and related functions
# This is the script's core window so more code will be present here than in other sections
#  
# This is the next screen to load after the initial splash screen
class TkApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.title("Select Screen")
        self.configure(bg='black') 
        self.gun = tk.StringVar()
        self.gun.set(GUN)
        # Specify Grid 
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        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.rowconfigure(self, 9, weight=1, uniform='b')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 1, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 2, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 3, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 4, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 5, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 6, weight=1, uniform='d')
        tk.Grid.columnconfigure(self, 7, weight=1, uniform='d')


        button_1 = tk.Button(self, justify=tk.CENTER, text="AUTO-REMOTE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_2 = tk.Button(self, justify=tk.CENTER, text="HARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_3 = tk.Button(self, justify=tk.CENTER, text="SEMIHARD", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        button_4 = tk.Button(self, justify=tk.CENTER, text="SOFT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        sbutton_1 = tk.Button(self, justify=tk.CENTER, text="BIO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        sbutton_2 = tk.Button(self, justify=tk.CENTER, text="INERT", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_1 = tk.Button(self, justify=tk.CENTER, text="MULTI SPEC", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_2 = tk.Button(self, justify=tk.CENTER, text="INFRA RED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        tsbutton_3 = tk.Button(self, justify=tk.CENTER, text="UV", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        wsbutton_1 = tk.Button(self, justify=tk.CENTER, text="SAFE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        wsbutton_2 = tk.Button(self, justify=tk.CENTER, text="ARMED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_1 = tk.Button(self, justify=tk.CENTER, text="SEARCH", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_2 = tk.Button(self, justify=tk.CENTER, text="TEST", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_3 = tk.Button(self, justify=tk.CENTER, text="ENGAGED", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        isbutton_4 = tk.Button(self, justify=tk.CENTER, text="INTERROGATE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        trbutton_1 = tk.Button(self, justify=tk.CENTER, text="AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        trbutton_2 = tk.Button(self, justify=tk.CENTER, text="SELECTIVE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        smman = tk.Button(self, justify=tk.CENTER, text="MAN-OVERRIDE", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        smauto = tk.Button(self, justify=tk.CENTER, text="SEMI-AUTO", bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        # displays gun id on top left and right of screen
        gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')
     #   self.canvasgun1.create_text(10, 10, fill='yellow', anchow=W text=self.gun)
        self.canvasgun1.create_window(28, 28, window=gun_1)
        gun_2 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun)
        headernew = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=0, justify=CENTER, text="UA         571-C \n REMOTE SENTRY WEAPON SYSTEM")
        syst = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SYSTEM MODE")
        weap = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="WEAPON STATUS")
        iff = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="IFF STATUS")
        test = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TEST ROUTINE")
        target = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET PROFILE")
        spectral = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="SPECTRAL PROFILE")
        ts = tk.Button(self, bg='black', state=tk.DISABLED, fg='yellow', disabledforeground='yellow',highlightbackground='yellow', borderwidth=2, justify=CENTER, text="TARGET SELECT")
        gun_1.grid(row=0, column=0, sticky=W)
        gun_2.grid(row=0, column=7, ipadx=2, ipady=2, padx=2, pady=2, sticky=E)
        headernew.grid(row=0, column=1, columnspan=6, sticky="NSEW")
        button_1.grid(row=2, column=0, columnspan=2, sticky="NSEW")
        button_2.grid(row=9, column=0, columnspan=3, sticky="NSEW")
        button_3.grid(row=8, column=0, columnspan=3, sticky="NSEW")
        button_4.grid(row=7, column=0, columnspan=3, sticky="NSEW")
        sbutton_1.grid(row=7, column=3, columnspan=2, sticky="NSEW")
        sbutton_2.grid(row=8, column=3, columnspan=2, sticky="NSEW")
        tsbutton_1.grid(row=7, column=5, columnspan=3, sticky="NSEW")
        tsbutton_2.grid(row=8, column=5, columnspan=3, sticky="NSEW")
        tsbutton_3.grid(row=9, column=5, columnspan=3, sticky="NSEW")
        wsbutton_1.grid(row=2, column=2, columnspan=2, sticky="NSEW")
        wsbutton_2.grid(row=3, column=2, columnspan=2, sticky="NSEW")
        isbutton_1.grid(row=2, column=4, columnspan=2, sticky="NSEW")
        isbutton_2.grid(row=3, column=4, columnspan=2, sticky="NSEW")
        isbutton_3.grid(row=4, column=4, columnspan=2, sticky="NSEW")
        isbutton_4.grid(row=5, column=4, columnspan=2, sticky="NSEW")
        trbutton_1.grid(row=2, column=6, columnspan=2, sticky="NSEW")
        trbutton_2.grid(row=3, column=6, columnspan=2, sticky="NSEW")
        smman.grid(row=3, column=0, columnspan=2, sticky="NSEW")
        smauto.grid(row=4, column=0, columnspan=2, sticky="NSEW") 
        syst.grid(row=1, column=0, columnspan=2, sticky="NSEW")
        weap.grid(row=1, column=2, columnspan=2, sticky="NSEW")
        iff.grid(row=1, column=4, columnspan=2, sticky="NSEW")
        test.grid(row=1, column=6, columnspan=2, sticky="NSEW")
        target.grid(row=6, column=0, columnspan=3, sticky="NSEW")
        spectral.grid(row=6, column=3, columnspan=2, sticky="NSEW")
        ts.grid(row=6, column=5, columnspan=3, sticky="NSEW")
        # 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")
        self.bind('<KeyPress-Down>', self.on_down)
        self.bind("<Up>", self.on_up)
        self.bind("<Left>", self.on_left)
        self.bind("<Right>", self.on_right)
        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-q>", self.on_keypress_q)
        tk.Button(self, text='SecondFrame', command=self.on_button, bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow').grid(row=9, column=0, sticky="SW")
        self.create_splashframe()
        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
        self.group1 = deque((button_1, smman, smauto))
        self.group2 = deque((wsbutton_1, wsbutton_2))
        self.group3 = deque((isbutton_1, isbutton_2, isbutton_3, isbutton_4))
        self.group4 = deque((trbutton_1, trbutton_2))
        self.group5 = deque((button_4, button_3, button_2))
        self.group6 = deque((sbutton_1, sbutton_2))
        self.group7 = deque((tsbutton_1, tsbutton_2, tsbutton_3))
        self.header_group = deque(((syst, self.group1), (weap, self.group2),(iff, self.group3), (test, self.group4),(target, self.group5), (spectral, self.group6),(ts, self.group7)))
        self.start_with_first_selected(False)
        self.toggle_header_group(self.header_group) 
 
    def toggle_button_group(self, button_group):
        button_group[0].config(foreground='black', background='yellow', relief='sunken')
        for button in islice(button_group, 1, None):
            button.config(foreground='yellow', background='black', relief='raised')
 
 
    def toggle_header_group(self, header_group):
        header_group[0][0].config(disabledforeground='black', background='yellow', relief='sunken')
        for button in islice(self.header_group, 1, None): 
            button[0].config(disabledforeground='yellow',background='black', relief='raised')
 
 
    def start_with_first_selected(self, first_selected=False):
        if first_selected:
           toggle_button_group(self.group1)
           toggle_button_group(self.group2)
           toggle_button_group(self.group3)
           toggle_button_group(self.group4)
           toggle_button_group(self.group5)
           toggle_button_group(self.group6)
           toggle_button_group(self.group7)
        else:
        # set last of each group to selected
           self.group1.rotate(1)
           self.group2.rotate(1)
           self.group3.rotate(1)
           self.group4.rotate(1)
           self.group5.rotate(1)
           self.group6.rotate(1)
           self.group7.rotate(1)
        

 
    def on_down(self, evet):
       group = self.header_group[0][1]
       group.rotate(-1)
       self.toggle_button_group(group)
       playsound("click1.mp3")
  
    def on_up(self, evet):
       group = self.header_group[0][1]
       group.rotate(1)
       self.toggle_button_group(group)
       playsound("click1.mp3")
 
    def on_left(self, evet):
       self.header_group.rotate(1)
       self.toggle_header_group(self.header_group)
       playsound("click1.mp3")
  
    def on_right(self, evet):
       self.header_group.rotate(-1)
       self.toggle_header_group(self.header_group)
       playsound("click1.mp3")





 # this appears to launch the initial window
    def create_splashframe(self):
        splashframe = SplashFrame(self)
        self.withdraw()
        self.wait_window(splashframe)
        self.deiconify()
# this launches the next screen, the fire select screen 
    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()

    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()

    def on_keypress_k(self, evet):
        print("k pressed")
        self.kudos()
        playsound("click1.mp3")
    # these work
    def on_keypress_a(self, evet):
        which_gun = self.gun.get()
        which_gun = "A"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_b(self, evet):
        which_gun = self.gun.get()
        which_gun = "B"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_c(self, evet):
        which_gun = self.gun.get()
        which_gun = "C"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_d(self, evet):
        which_gun = self.gun.get()
        which_gun = "D"
        self.gun.set(which_gun) 
        playsound("click1.mp3")

# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.quit()
        playsound("click1.mp3")
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()
        self.__init__()
        playsound("click1.mp3")



#
#
#
#
# this is the third fire screen
class SecondFrame(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.configure(bg='black')
        self.title("Fire status screen")
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
        tk.Button(self, text='Close', command=self.destroy, bg='black', fg='yellow', highlightbackground='yellow', highlightcolor='black',activebackground='yellow').grid(row=8, column=1, sticky="NSEW")
         # 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)
        #
        self.cooldown = tk.IntVar()
        self.stat.set(COOLED)

        self.gun = tk.StringVar()
        self.gun.set(GUN)

        # 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.Button(self, borderwidth=7,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        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,textvariable=self.gun)
        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)
        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-q>", self.on_keypress_q)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
    def coolbar(self):
        temperature_count = self.temperature.get()
        if temperature_count >= 21:
          temperature_count = self.temperature.get()
          temperature_count = temperature_count-1 or TEMP_INITIAL      
          self.temperature.set(temperature_count)
          print("key not pressed", temperature_count)
          self.after(300, self.coolbar)
    

    def overheat(self):
        rmcount_count = self.rmcount.get()
        rmcount_count = 0
        self.rmcount.set(rmcount_count)
        state_stat = self.stat.get()
        state_stat = "OVERHEAT"
        self.stat.set(state_stat)
        playsound("warning1.mp3")
        time.sleep(0.7)

    def critical(self):
        counter_value = self.counter.get()
        if counter_value <= 50:
          counter_value = self.counter.get()
          state_stat = self.stat.get()
          state_stat = "CRITICAL"
          self.stat.set(state_stat)
          playsound("warning1.mp3")
          counter_value = self.counter.get()
          print("ammo CRIT", counter_value) 

    def out(self):
        counter_value = self.counter.get()
        if counter_value == 1:
          state_stat = self.stat.get()
          state_stat = "OUT"
          self.stat.set(state_stat)
          playsound("warning1.mp3")
          counter_value = self.counter.get()
          print("ammo CRIT", counter_value) 

    def reload(self):
        counter_value = self.counter.get()
        if counter_value >= 1:
          state_stat = self.stat.get()
          state_stat = ""
          self.stat.set(state_stat)
          counter_value = self.counter.get()
          print("ammo CRIT", counter_value)


    # 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)
        counter_value = self.counter.get()
        # this is logic to try and get ammo warnings
        counter_value = self.counter.get()

        self.reload()
        self.critical()
        self.out()

 
        # 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)
        if temperature_count == 90:
          self.coolbar()
          self.overheat()
        else:
          state_stat = self.stat.get()
          state_stat = ""
          self.stat.set(state_stat)

    def on_keyrelease_f(self, evet):
        #this adds logic to say rate is zero if not firing
        #this automatically turns off rate bar moment key is released fixing a logic issue
        rmcount_count = self.rmcount.get()
        rmcount_count = 0
        self.rmcount.set(rmcount_count)
        temperature_count =  self.temperature.get()
        if temperature_count >= 20:
          self.coolbar()

 # this appears to launch the initial window
 #   def create_splashframe(self):
  #      splashframe = SplashFrame(self)
   #     self.withdraw()
    #    self.wait_window(splashframe)
     #   self.deiconify()
# this launches the next screen, the fire select screen 
    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()



    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()


    def on_keypress_k(self, evet):
        print("k pressed")
        self.kudos()
        playsound("click1.mp3")
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()
        self.create_splashframe 
        playsound("click1.mp3")
# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.destroy()
        self.quit()
        playsound("click1.mp3")

    # 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):
        which_gun = self.gun.get()
        which_gun = "A"
        self.gun.set(which_gun)

        playsound("click1.mp3")

    def on_keypress_b(self, evet):
        which_gun = self.gun.get()
        which_gun = "B"
        self.gun.set(which_gun)

        playsound("click1.mp3")

    def on_keypress_c(self, evet):
        which_gun = self.gun.get()
        which_gun = "C"
        self.gun.set(which_gun)

        playsound("click1.mp3")

    def on_keypress_d(self, evet):
        which_gun = self.gun.get()
        which_gun = "D"
        self.gun.set(which_gun)

        playsound("click1.mp3")


#
#
# End fire menu class and related functions
#
#
#Begin secret credits(kudos) screen
#
#

class KudosFrame(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.geometry('512x256')
        self.title("Secret credits screen")
        tk.Grid.rowconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 0, weight=1, uniform='a')
        tk.Grid.rowconfigure(self, 1, weight=1, uniform='a')
        tk.Grid.columnconfigure(self, 1, weight=1, uniform='a')

        r0c0 = tk.Button(self, text='Close', command=self.destroy, bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r0c0.grid(row=0, column=0, sticky="NSEW")
        r1c0 = tk.Label(self, text ='Alienslegacy.com Credits \n knoxvilles_joker aka gabriel vos new script  \n martinr1000 font and some coding help \n MLR 2007 for original flash script \n Facebook.com  theuscm \n youtube.com/channel/UC4KYYScA5WcdCZeiU6lcjdA \n cobra_shipwreck channel aka knoxvilles_joker', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r1c0.grid(row=1, column=0, sticky="NSEW")
        r1c1 = tk.Label(self, text =' ', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r1c1.grid(row=1, column=1, sticky="NSEW")
        r0c1 = tk.Label(self, text ='Python-forum.io credits \n Yoriz coding pointers and help \n ndc85430 coding critique \n ', bg='black', fg='yellow',highlightbackground='yellow', highlightcolor='black', activebackground='yellow')
        r0c1.grid(row=0, column=1, sticky="NSEW")

        # These are the bind key definitions
        self.bind("<KeyPress-r>", self.on_keypress_r)
        self.bind("<KeyPress-space>", self.on_keypress_space)
        self.bind("<KeyPress-k>", self.on_keypress_k)
        self.bind("<KeyPress-q>", self.on_keypress_q)

    def on_button(self):
        secondframe = SecondFrame(self)
        self.withdraw()
        self.wait_window(secondframe)
        self.deiconify()
    def kudos(self):
        kudosframe = KudosFrame(self)
        self.withdraw()
        self.wait_window(kudosframe)
        self.deiconify()
# this reloads the game, you have to click it to make it the active window again
    def on_keypress_r(self, evet):
        self.destroy()         
        self.create_splashframe # this appears to launch the initial window        
    def on_keypress_r(self, evet):
        print("r pressed")        
        self.destroy()
  #      self.create_splashframe 
        playsound("click1.mp3")
    def on_keypress_k(self, evet):
        print("k pressed")        
        self.kudos()
        playsound("click1.mp3")
# this launches you to window three, the fire select window
    def on_keypress_space(self, evet):
        print("space pressed")
        self.on_button()
        playsound("click1.mp3")
# this quits and closes the window by hitting a single key
    def on_keypress_q(self, evet):
        self.destroy()
        self.quit()
        playsound("click1.mp3")
#
# End secret credits(kudos) screen
#
#
#
# The below two commands run the entire script
#  
tk_app = TkApp()
tk_app.mainloop()

The code within the code that is at question is right here:


gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')
     #   self.canvasgun1.create_text(10, 10, fill='yellow', anchow=W text=self.gun)
        self.canvasgun1.create_window(28, 28, window=gun_1)
        gun_1.grid(row=0, column=0, sticky=W)
When I try text option of canvas itself that does not allow the variablestring to be display and just yields an LVAR on screen.

When I goto gun_1.grid and remove sticky=W I no longer see the variable text.

Just to put it in reference this is the movie thing I am trying to recreate:
https://www.youtube.com/watch?v=HQDy-5IQvuU

This was one of our group members implementations of the program in an older programming language:
https://www.youtube.com/watch?v=MVObH7wHK4Y
Reply
#2
It does not look like you can use textvariable with canvas.create_text
It looks like you set the initial text value using text parameter and to change it use canvas.itemconfigure method.

https://anzeljg.github.io/rin2/book2/240..._text.html Wrote:Tkinter 8.5 reference: a GUI for Python
8.14. Canvas text objects
You can display one or more lines of text on a canvas C by creating a text object:

id = C.create_text(x, y, option, ...)
This returns the object ID of the text object on canvas C. Options include:

text
The text to be displayed in the object, as a string. Use newline characters ('\n') to force line breaks.

To replace the text in an item with object ID I on a canvas C with the text from a string S, call
C.itemconfigure(I, text=S)
Reply
#3
(Apr-24-2021, 04:53 PM)Yoriz Wrote: It does not look like you can use textvariable with canvas.create_text
It looks like you set the initial text value using text parameter and to change it use canvas.itemconfigure method.

https://anzeljg.github.io/rin2/book2/240..._text.html Wrote:Tkinter 8.5 reference: a GUI for Python
8.14. Canvas text objects
You can display one or more lines of text on a canvas C by creating a text object:

id = C.create_text(x, y, option, ...)
This returns the object ID of the text object on canvas C. Options include:

text
The text to be displayed in the object, as a string. Use newline characters ('\n') to force line breaks.

To replace the text in an item with object ID I on a canvas C with the text from a string S, call
C.itemconfigure(I, text=S)

so in this case self.vanvasgun.itemconfigure is used to call the self.gun text variable

It is decleared as a class definition variable:
self.gun = tk.StringVar()
        self.gun.set(GUN)
with GUN being declared a global script variable.

No matter how I vary it I still get nothing for text input and the button works without issue displaying the input letter.

now based on what you stated and was stated on the website, I should not be using the text option in the create_text I use the itemconfigure instead to display the text.

I have tried every variant of self.gun, GUN, gun and can not get the stringvar to display in the circle. Which is my goal here.

gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')
        self.canvasgun1.create_text(10, 10, fill='yellow')        
        self.canvasgun1.itemconfigure('self.gun', text=self.gun)
        self.canvasgun1.create_window(28, 28, window=gun_1)
Reply
#4
This is a short example that demonstrates why you cannot do what you are trying to do.
import tkinter as tk

root = tk.Tk()
stringvar = tk.StringVar()
a = 'AAAAA'
stringvar.set(a)
button = tk.Button(root, textvariable=stringvar)
print(a, stringvar.get())
print(id(a), id(stringvar.get()))
Output:
AAAAA AAAAA 1925086754992 1925089589232
Even though "a" and "stringvar.get()" both reference a str "AAAAA", the two are different objects. "a" references some str object 1925086754992 while "stringvar.get() references a completely different str object 192508958923. So even if you could change the letters in str object 1925086754992 those changes would not be seen by stringvar and would not change the button text.

But the point is moot because str is an immutable type. You cannot change a str. I can make "a" reference a different string object, but "stringvar" does not know about that string, nor does it know about "a", so any change to "a" is not going to change the text in my button.

If you want to change the text in the button you have to do one of these:
stringvar.set('new string')
button['text'] = 'new string'
button.configure(text='new string')
That's it. There are no other ways.
Reply
#5
(Apr-25-2021, 12:18 AM)deanhystad Wrote: This is a short example that demonstrates why you cannot do what you are trying to do.
import tkinter as tk

root = tk.Tk()
stringvar = tk.StringVar()
a = 'AAAAA'
stringvar.set(a)
button = tk.Button(root, textvariable=stringvar)
print(a, stringvar.get())
print(id(a), id(stringvar.get()))
Output:
AAAAA AAAAA 1925086754992 1925089589232
Even though "a" and "stringvar.get()" both reference a str "AAAAA", the two are different objects. "a" references some str object 1925086754992 while "stringvar.get() references a completely different str object 192508958923. So even if you could change the letters in str object 1925086754992 those changes would not be seen by stringvar and would not change the button text.

But the point is moot because str is an immutable type. You cannot change a str. I can make "a" reference a different string object, but "stringvar" does not know about that string, nor does it know about "a", so any change to "a" is not going to change the text in my button.

If you want to change the text in the button you have to do one of these:
stringvar.set('new string')
button['text'] = 'new string'
button.configure(text='new string')
That's it. There are no other ways.

Thanks for the pointer, that helps! The master has taught the student. I assume that these little caveats and that bit of knowledge has a very long story attached in how you uncovered that.

Though I Am seeing that some folks are writing companion libraries that address some of these deficiencies and even ttk is an improvement over tk in ease of use and functionality options even if they did change how you have to structure some of the arguments. But I have learned through many pains and struggles, you stick to the standards, you stick to the common things and you will find parts and help waaaaay more plentiful rather than if you are using a one off.

I learned that the hard way with the wiimote library I used in my predator cannon armature lights/sounds/movement script. The library development was basically dead. The new wiimotes would not work as Nintendo changed the protocols. I hated to do it but I had to order units out of china as the newer 2-n-1 units were not compatible. It took me three months just to hash out how on bloody earth to make things work with libraries out there and I then find out later that adafruit in august or there abouts wrote an updated nunchuck library, but even it had the i2c clock stretching issue and the only fix for that is to use alternate pins and use software i2c. Something to do with the BCM2835? chipset and a flaw in the ability to handle stretched clock cycles in the communications protocol. Soo instead of a nunchucky with the raspberry pi I went with a wiimote over Bluetooth and it worked after I trusted the device (not paired or any other option) via the bluetoothctl control interface.
Reply
#6
I am going through the code and I think I am already employing the methodology to which you are specifying.
the key bindings
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)
the button and canvas configs

        gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')

        which_gun = self.gun.get()
        
        self.gun.set(which_gun) 
        self.canvasgun1['text'] = 'which_gun'
      #  self.canvasgun1.create_text(10, 10, fill='yellow', text='which_gun')        
        self.canvasgun1.itemconfigure(self.gun, text=which_gun, fill='yellow', disabledfill='yellow')
        self.canvasgun1.create_window(28, 28, window=gun_1)
        gun_2 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun)
        gun_1.grid(row=0, column=0, sticky=W)
        gun_2.grid(row=0, column=7, ipadx=2, ipady=2, padx=2, pady=2, sticky=E)



    def on_keypress_a(self, evet):
        which_gun = self.gun.get()
        which_gun = "A"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_b(self, evet):
        which_gun = self.gun.get()
        which_gun = "B"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_c(self, evet):
        which_gun = self.gun.get()
        which_gun = "C"
        self.gun.set(which_gun)
        playsound("click1.mp3")
    def on_keypress_d(self, evet):
        which_gun = self.gun.get()
        which_gun = "D"
        self.gun.set(which_gun) 
        playsound("click1.mp3")
The buttons work fine. I am trying to get the button to overlay on top of the canvas button circle so I can approximate the original script. The moment I move the button into the canvas it disappears.
Reply
#7
There was an option I was missing: lift().

I did this code and it works:

        gun_1 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun, highlightcolor = 'yellow')
        self.canvasgun1 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun1.grid(row=0, column=0)
        self.canvasgun1.create_oval(0,0,27,27,outline='yellow')
        gun_1.lift()
        gun_2 = tk.Button(self, borderwidth=0,bg='black',fg='yellow',disabledforeground='yellow',state=tk.DISABLED,textvariable=self.gun)
        self.canvasgun2 = tk.Canvas(self, width=28, height=28, bg='black', highlightthickness=0)
        self.canvasgun2.grid(row=0, column=7)
        self.canvasgun2.create_oval(0,0,27,27,outline='yellow')
        gun_2.lift()
Apparently you have to lift the button on top of the canvas as until you initiate that command set, it will stay in the back ground.
Reply
#8
deanhystad, thanks for your help on this. The text update methodology you exemplified is a great explanation. I am basically doing it, just a different way by employing a couple of method calls to get the updates to post from direct keyboard input with no input box.

In general:
The kicker I am finding with tkinter is that it is such a broad library one will overlook stuff and there are soo many examples and google results that it literally pays to sleep on things and try things another day for a few reasons:
frustration can actually hamper productive solution creation
lack of sleep prevents one from having mental clarity
google search results change by day, minute, hour, and month due to advertising prioritization
timing on searches can yield differing results as algorhythms sometimes take time to update
the above two items are why it is vital to save good information links as they are likely to disappear overnight
giving folks time to provide input and critiques/ suggestions helps
google search results are unique for everyone so it is vital folks share their linked search results especially with the coming bucket approach google is fixing to apply to replace the use of individual cookies. Unless it is a really easily found or commonly searched things that yields information saying just google it, will not provide the information discussed in many cases to get folks on the same page and level so to speak.
And providing those links when discussing things makes a 20 minute search for the other party down to just a time of reading after clicking on the link.
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020