从pickle文件加载GUI界面时遇到一些问题。
我能够做我想做的事,但它不能完全按照我的预期工作,我不确定这是正确的方法。
这是基本gui的简化示例(您不必阅读它并理解它的深度,这不是主要问题):
tableRel = {}
master = Tk()
tableOrders = pickle.load(open(r"\\VIERNES7-3\Documentos c\sharedTableOrders.p","rb"))
count = 0
lOfKeys = tableOrders.keys()
numOfTables = len(lOfKeys)
for rowN in range((numOfTables /10)+1):
for colN in range(10):
if count == numOfTables:
break
tableN = (colN+1)+(10*(rowN))
f = Frame(master,height=600,width=200, bd=1, relief=SUNKEN)
f.grid(row=rowN, column=colN, pady=15, padx= 0)
Label(f, text="Mesa: " + str(lOfKeys[count])).pack(side = TOP)
scrollbar = Scrollbar(f, orient=VERTICAL)
listbox = Listbox(f, yscrollcommand=scrollbar.set, width=19)
tableRel[listbox] = lOfKeys[count]
scrollbar.config(command=listbox.yview)
scrollbar.pack(side=RIGHT, fill=Y)
listbox.pack(side=TOP)
listbox.bind("<Double-Button-1>", hideOrder)
listbox.bind("<Return>", hideOrder)
index = 0
listbox.delete(0, END)
for y in tableOrders[lOfKeys[count]]["orders"]:
#print tableOrders[x]
if (y["kitchen"] == "si" or y["category"] != "Bebidas") and y["ready"] == "no":
listbox.insert(END, y["name"])
#ordersByIndex[index] = y["name"]
if y["canceled"] == "si":
listbox.itemconfig(index, bg="red")
#tablesByIndex[index] = x
index += 1
count += 1
loadFile()
mainloop()
现在这是我困惑的部分,我不能正确理解mainloop()
这个无限循环的概念。
它到底做了什么?
让我感到困扰的是,如果我在文件的任何地方放置一个print语句,它就不会反复打印,所以它不会重新执行文件的代码。
我基本上要做的是,经过一段时间后,gui重新加载,如果picke文件有变化,那么gui会更新。
我能够通过将我的代码放入函数(让我们称之为updateGUI
)并执行master.after(5000, updateGUI)
来实现这一目标。
这似乎不是最好的解决方案,因为所有内容都会突然改变(列表框和滚动条中的选定选项),但我想这可以通过记住状态并强加它来解决。
但是我想知道是否有一些方法可以利用mainloop并在文件发生变化时使gui“更新”(它不必查找文件中的更改,它必须每10次更新一次)大约几秒钟,然后重新绘制屏幕。)
我尝试了update
和update_idletasks
但似乎没有人重新加载泡菜并根据泡菜中的新信息重新绘制。
答案 0 :(得分:3)
主循环是您的根小部件侦听并响应输入和其他事件的位置,例如鼠标单击,按键和来自操作系统的信号。使用after
, 利用mainloop每隔 n 秒调用更新过程。
另外你可以做的是跟踪界面空闲的时间(没有鼠标或键盘事件)。如果它处于空闲状态且显示有更改,则可以立即更新。如果它没有空闲,请为用户提供一个指示器和一种手动触发更新的方法,直到它再次变为空闲状态。这样,用户的工作不会被更新中断。
这是一个计时器的快速示例,可以在鼠标移动或击键时重置。
import Tkinter as tk
class App():
def __init__(self, tick):
self.tick = tick
self.idle_time = 0
self.root = tk.Tk()
frame = tk.Frame(self.root, width=100, height=100)
frame.bind_all("<Motion>", self.reset_idle)
frame.bind_all("<Key>", self.reset_idle)
frame.pack()
self.root.after(self.tick, self.update_timer)
self.root.mainloop()
def update_timer(self):
print('Idle for %sms' % self.idle_time)
self.idle_time += self.tick
self.root.after(self.tick, self.update_timer)
def reset_idle(self, event):
self.idle_time = 0
app = App(1000)