我正在尝试构建用于接单的工具。到目前为止,我已经尝试编写以下代码。
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框架,以了解按下了哪个表,但是当我调用标签修改时程序冻结了。之后,经过一些帖子并尝试线程化,仍然无法修复代码。
这里需要很少的帮助来找出我在做什么错误
答案 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()