当我尝试在切换帧时修改标签时,tkinter程序会死机

时间:2019-05-08 08:46:14

标签: python button tkinter

我正在尝试构建用于接单的工具。到目前为止,我已经尝试编写以下代码。

from tkinter import *
from tkinter import font  as tkfont
import time
import threading

class RMS_APP(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        self.title("Restaurant Management System")
        self.master = Frame(self)
        self.master.grid(row=0,column=0,sticky='nwes')
        #self.geometry("1600x800+0+0")

        self.master.grid_rowconfigure(0, weight=1)
        self.master.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (LogIn, Table,ShowTable):#,Kitchen):
            page_name = F.__name__
            frame = F(parent=self.master, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("LogIn")

    def show_frame(self, page_name,arg = None):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]


        if arg:
            frame.OnClick(arg)
            #self.label1.grid_forget()
            pass
        frame.tkraise()

class LogIn(Frame):
    #part of code left
    pass

class Table(Frame):
    def __init__(self,parent,controller):
        Frame.__init__(self,parent)
        self.controller = controller
        label = Label(self, text="Choose the table for further details ", font=controller.title_font)
        label.grid(row=0,column=0,padx=(500,10),pady=(100,10))
        No = 1

        for r in range(3):
            gridFrame = Frame(self)
            for c in range(4):
                temp = "Table_"+str(No)
                #self.temp = Button(gridFrame,text = temp,height = 5,width=10,command = lambda temp = temp: controller.show_frame('ShowTable',temp))
                self.temp = Button(gridFrame,text = temp,height = 5,width=10,command = lambda temp=temp: controller.show_frame('ShowTable',temp))
                self.temp.grid(row=r,column=c,padx=10,pady=10)
                No+=1

            gridFrame.grid(row=r+1,column=0,padx=(500,10),sticky='news')
    def test(self,txt):
        print(txt)


class ShowTable(Frame):
    def __init__(self,parent,controller):     
        Frame.__init__(self,parent)
        self.controller = controller
        label = Label(self,text = 'Table : ',font=controller.title_font)
        label.grid(row=0,column=0,padx=(10,10),pady=(10,10))
        self.label1 = Label(self,text = None,font=controller.title_font)
        self.label1.grid(row=0,column=1,padx=(10,10),pady=(10,10))

        back = Button(self,text = 'Back to Tables',height = 5,width=10,command = lambda : controller.show_frame('Table'))
        back.grid(row=1,column=0,sticky='news',padx=(500,10))

    def OnClick(self,arg):
        def callback():
            self.label1.configure(text = arg)
        t = threading.Thread(target = callback)
        t.start()
        t.join()

class Kitchen(Frame):
    pass

class BillTable(Frame):
    pass

if __name__ == "__main__":
    app = RMS_APP()
    app.mainloop()

在此之后,切换到Table框架后,我试图将argumnts传递给ShowTable框架,以了解按下了哪个表,但是当我调用标签修改时程序冻结了。之后,经过一些帖子并尝试线程化,仍然无法修复代码。

这里需要很少的帮助来找出我在做什么错误

1 个答案:

答案 0 :(得分:1)

像这样,在Tkinter中使用线程是一个坏主意。您可以通过

更改文本
def OnClick(self, arg):
    # Two different ways to configure widgets
    # self.label1['text'] = arg    
    self.label1.configure(text = arg)

如果您创建OnClick()只是为了更新标签,那么您甚至都不需要在frame.label1['text'] = arg

中简单地执行show_frame()的方法。
def show_frame(self, page_name, arg = None):
    '''Show a frame for the given page name'''
    frame = self.frames[page_name]
    if arg: 
        frame.label1['text'] = arg
    frame.tkraise()