gpt4 book ai didi

python - 如何将进度条连接到函数?

转载 作者:太空狗 更新时间:2023-10-29 21:12:56 27 4
gpt4 key购买 nike

我正在尝试将进度条连接到我的项目的功能。

这是我目前所拥有的,但我很确定它什么也没做:

def main():
pgBar.start()
function1()
function2()
function3()
function4()
pgBar.stop()

如果有帮助的话,这是我制作进度条的代码:

pgBar = ttk.Progressbar(window, orient = HORIZONTAL, length=300, mode = "determinate")
pgBar.place(x=45, y=130)

我一直在做一些研究,了解到 tkinter 窗口在运行函数或类似的东西时会卡住。有没有一种方法可以在主函数内部调用的每个函数末尾“解冻”窗口?

最佳答案

由于 tkinter 是单线程,您需要另一个线程来执行您的main 函数而不卡住 GUI。一种常见的方法是工作线程将消息放入同步对象(如 Queue ),GUI 部分使用此消息,更新进度条。

下面的代码是基于一个完整详细的example在 ActiveState 上:

import tkinter as tk
from tkinter import ttk
import threading
import queue
import time


class App(tk.Tk):

def __init__(self):
tk.Tk.__init__(self)
self.queue = queue.Queue()
self.listbox = tk.Listbox(self, width=20, height=5)
self.progressbar = ttk.Progressbar(self, orient='horizontal',
length=300, mode='determinate')
self.button = tk.Button(self, text="Start", command=self.spawnthread)
self.listbox.pack(padx=10, pady=10)
self.progressbar.pack(padx=10, pady=10)
self.button.pack(padx=10, pady=10)

def spawnthread(self):
self.button.config(state="disabled")
self.thread = ThreadedClient(self.queue)
self.thread.start()
self.periodiccall()

def periodiccall(self):
self.checkqueue()
if self.thread.is_alive():
self.after(100, self.periodiccall)
else:
self.button.config(state="active")

def checkqueue(self):
while self.queue.qsize():
try:
msg = self.queue.get(0)
self.listbox.insert('end', msg)
self.progressbar.step(25)
except Queue.Empty:
pass


class ThreadedClient(threading.Thread):

def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

def run(self):
for x in range(1, 5):
time.sleep(2)
msg = "Function %s finished..." % x
self.queue.put(msg)


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

original example在 ActiveState 上有点困惑 IMO(ThreadedClientGuiPart 结合得很好,并且控制从 GUI 生成线程的时间之类的东西并不像它们那么简单可能是),我重构了它并添加了一个按钮来启动新线程。

关于python - 如何将进度条连接到函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com