gpt4 book ai didi

python - 运行过程中进度条不更新

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

在我将文件上传到互联网的 python 程序中,我使用 GTK 进度条来显示上传进度。但是我面临的问题是在上传完成之前进度条不显示任何事件,然后突然显示上传完成。我正在使用 pycurl 发出 http 请求...我的问题是 -我是否需要一个多线程应用程序来上传文件并同时更新图形用户界面?还是我犯了其他错误?

提前致谢!

最佳答案

我要引用 PyGTK FAQ :

You have created a progress bar inside a window, then you start running a loop that does some work:

while work_left:
...do something...
progressbar.set_fraction(...)

You will notice that the window doesn't even show up, or if it does the progress bar stays frozen until the end of the task. The explanation is simple: gtk is event driven, and you are stealing control away from the gtk main loop, thus preventing it from processing normal GUI update events.

The simplest solution consists on temporarily giving control back to gtk every time the progress is changed:

while work_left:
...do something...
progressbar.set_fraction(...)
while gtk.events_pending():
gtk.main_iteration()

Notice that with this solution, the user cannot quit the application (gtk.main_quit would not work because of new loop [gtk.main_iteration()]) until your heavy_work is done.

Another solution consists on using gtk idle functions, which are called by the gtk main loop whenever it has nothing to do. Therefore, gtk is in control, and the idle function has to do a bit of work. It should return True if there's more work to be done, otherwise False.

The best solution (it has no drawbacks) was pointed out by James Henstridge. It is taking advantage of python's generators as idle functions, to make python automatically preserve the state for us. It goes like this:

def my_task(data):
...some work...
while heavy_work_needed:
...do heavy work here...
progress_label.set_text(data) # here we update parts of UI
# there's more work, return True
yield True
# no more work, return False
yield False

def on_start_my_task_button_click(data):
task = my_task(data)
gobject.idle_add(task.next)

The 'while' above is just an example. The only rules are that it should yield True after doing a bit of work and there's more work to do, and it must yield False when the task is done.

关于python - 运行过程中进度条不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496814/

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