Home > Mobile >  Tkinter functions from outside of class being immediately called
Tkinter functions from outside of class being immediately called

Time:06-28

I am having some issues getting these functions to work properly for my tkinter app. I have two files, one containing the main Window class and the other containing a function that I am trying to connect to a button command. The issue is the button is in the main Window and the function I am associating with its "click" is not updating and just seems to execute the function once through.

Here are my two files: main.py

import customtkinter as ctk
from size import *

class Window(ctk.CTk):
WIDTH = 700 
HEIGHT = 600

def __init__(self) -> None:
    super().__init__()
    
    self.geometry(f"{Window.WIDTH}x{Window.HEIGHT}")
    self.title("Test")

#Setup Frames-----#
        #Configure grid layout (2x1)
        self.grid_columnconfigure(1, weight=1)
        self.grid_rowconfigure(0, weight=1)
        #Configure left frame
        self.frame_left = ctk.CTkFrame(master=self,width=180,corner_radius=0)
        self.frame_left.grid(row=0, column=0, sticky="nswe", padx=10,pady=10)
        #Configure right frame
        self.frame_right = ctk.CTkFrame(master=self)
        self.frame_right.grid(row=0, column=1, sticky="nswe", padx=10, pady=10)
        #Far Left Frame
        self.frame_left.grid_rowconfigure(0, minsize=10)

#Labels-----#
        #Left Frame Labels
        size_label = ctk.CTkLabel(master=self.frame_left, text="Size Option:")
        monster_name_label = ctk.CTkLabel(master=self.frame_left, text="Monster Name:")
        #Right Frame Labels
        display_monster_name = ctk.CTkLabel(master=self.frame_right, text='')
        display_size = ctk.CTkLabel(master=self.frame_right, text='')
        
#Comboboxes-----#
        #Size
        size_combobox = ctk.CTkComboBox(master=self.frame_left, values=size_options_combobox)
        size_combobox.set("Random")

#Functions-----#
        #Size 
        size_command = add_size(size_combobox, display_size)

#Buttons-----#
        #Size
        add_size_btn = ctk.CTkButton(master=self.frame_left,command=size_command, text=" ", width=30)
        
#Grid Layout-----#
#Left frame grid layout
        #Row 1 
        size_label.grid(row=1, column=0)
        size_combobox.grid(row=1, column=1)
        add_size_btn.grid(row=1, column=2, sticky = "W")

#Right frame grid layout
        #Row 1
        display_size.grid(row=1,column=1)


    

if __name__ == "__main__":
    window = Window()
    window.mainloop()

The other file I am importing from is size.py:

from main import *
import customtkinter as ctk
import random

def add_size(size_combobox, display_size):
size_choice = StringVar()
size_choice = size_combobox.get() #Suspect this maybe the issue
random_size = random.choice(size_options_label)
if size_choice == "Random":
    display_size['text'] = random_size
else:
    display_size['text'] = size_choice

I am suspecting that the issue may lie with the .get() call off of the add_size function because if I run this in the main.py within the Window class, it works and updates the Labels value with whatever the combobox choice is.

Here is a screen shot of what it looks like when it runs once through and since it is set to "Random" the if statement executes once through with that as its value and won't update after another button click.

Size Error

CodePudding user response:

You're explicitly asking for add_size to be called in this line:

size_command = add_size(size_combobox, display_size)

You need to change it to use lambda or functools.partial:

size_command = lambda: add_size(size_combobox, display_size)
  • Related