我有一个带有“开始”按钮和进度条的小型GUI测试。所需的行为是:
点击开始
进度条振荡5秒钟
进度栏停止
观察到的行为是“开始”按钮冻结5秒钟,然后显示进度条(无振荡)。
到目前为止,这是我的代码:
class GUI:
def __init__(self, master):
self.master = master
self.test_button = Button(self.master, command=self.tb_click)
self.test_button.configure(
text="Start", background="Grey",
padx=50
)
self.test_button.pack(side=TOP)
def progress(self):
self.prog_bar = ttk.Progressbar(
self.master, orient="horizontal",
length=200, mode="indeterminate"
)
self.prog_bar.pack(side=TOP)
def tb_click(self):
self.progress()
self.prog_bar.start()
# Simulate long running process
t = threading.Thread(target=time.sleep, args=(5,))
t.start()
t.join()
self.prog_bar.stop()
root = Tk()
root.title("Test Button")
main_ui = GUI(root)
root.mainloop()
根据Bryan Oakley 在此提供的信息,我了解我需要使用线程。我尝试创建一个线程,但是我猜测由于该线程是从主线程中启动的,因此没有帮助。
我有想法放置在不同的类中的逻辑部分,以及从该类,类似于由A.罗达斯示例代码内实例化GUI 这里。
我的问题:
我不知道如何编码,以便此命令:
self.test_button = Button(self.master, command=self.tb_click)
调用另一个类中的函数。这是一件坏事吗,甚至有可能吗?我将如何创建可以处理self.tb_click的第二个类?我尝试遵循A. Rodas的示例代码,该示例代码运行良好。但是我无法弄清楚在按钮小部件触发动作的情况下如何实现他的解决方案。
如果我应该从单个GUI类中处理线程,那么如何创建一个不会干扰主线程的线程?