加载并修改tkinter GUI从一个pickle文件

2024-09-28 03:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

从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)来实现这一点。在

这似乎不是最好的解决方案,因为所有事情都会突然改变(列表框和滚动条中选定的选项),但我想这一切都可以通过记住状态并强制执行来解决。在

但是我想知道是否有什么方法可以利用主循环,在文件发生更改时使gui“更新”(它不必查找文件中的更改,它必须每隔10秒更新一次并重新绘制屏幕)

我尝试过update和{},但似乎没有人重新加载pickle并根据pickle中的新信息重新绘制它。在


Tags: 文件inmasterforindexcountguipickle
1条回答
网友
1楼 · 发布于 2024-09-28 03:23:06

主循环是根小部件监听并响应输入和其他事件的地方,比如鼠标单击、按键和来自操作系统的信号。通过使用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)

相关问题 更多 >

    热门问题