首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自类外部的Tkinter函数立即被调用

来自类外部的Tkinter函数立即被调用
EN

Stack Overflow用户
提问于 2022-06-24 22:14:49
回答 1查看 78关注 0票数 0

我有一些问题,让这些功能正常工作为我的tkinter应用程序。我有两个文件,一个包含主窗口类,另一个包含我试图连接到一个按钮命令的函数。问题是,按钮在主窗口中,而我与其关联的函数"click“没有更新,似乎只执行了一次。

以下是我的两个文件: main.py

代码语言:javascript
复制
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()

我从其中导入的另一个文件是size.py:

代码语言:javascript
复制
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

我怀疑这个问题可能与.get()取消add_size函数有关,因为如果我在Window类内的main.py中运行这个函数,它就会工作并使用组合框选择的任何选项更新标签值。

下面是一个屏幕截图,说明它在运行一次时的样子,并且由于它被设置为“随机”,if语句只执行一次,作为它的值,并且不会在另一个按钮单击后更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 22:47:27

在这一行中,您明确要求调用add_size

代码语言:javascript
复制
size_command = add_size(size_combobox, display_size)

您需要将其更改为使用lambda或functools.partial:

代码语言:javascript
复制
size_command = lambda: add_size(size_combobox, display_size)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72749871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档