3

在 Python 中使用ttk.Progressbar(在 tkinter GUI 中),我试图在按下按钮时出现进度条。单击 gui 上的“分析”按钮调用脚本中的分析函数,我的意思是它是一种三级火箭:

  1. grid()将进度条小部件添加到大型机,然后start()它。

  2. 进行实际计算(在我的测试运行中大约需要三秒钟)

  3. stop()进度条和grid_remove()再次向用户隐藏它,现在工作已经完成。

如果我注释掉第3步,进度条将按预期显示并启动,同时执行第2步。但是如果第三步仍然存在,那么进度条就不会首先显示。现在,由于第二步中的工作正在以任何一种方式执行,我假设它可能与网格化和删除同一函数调用中的进度条小部件有关,但因为这是我的第一个真正的 gui 项目在python中,我对如何解决这个问题有点不知所措(如果这确实是问题所在)。有没有办法解决这个问题,或者更优雅地完成同样的任务?按钮调用的函数如下:

def analyze():
    # --Step 1--
    progressbar.grid()
    progressbar.start()

    # --Step 2--
    global analysis
    analysis = analyzer.Analysis(file_path.get())
    analysis.output_to_file()

    # --Step 3--
    progressbar.stop()
    progressbar.grid_remove()

我会发布我的界面图片以进一步澄清,但由于我目前的声誉评分不允许发布图像,我希望我已经通过我的解释(和代码)使问题足够清楚。

4

1 回答 1

4

为了使小部件在创建后出现,必须允许事件循环运行。这是因为屏幕上的小部件的实际绘制是由于重绘事件而发生的。

update_idletasks在创建和启动进度条之后,您可以调用which 将允许事件循环为此类重绘事件提供服务。但是,当您的计算正在运行时,您的应用程序可能会出现冻结。同样,这是因为必须允许事件循环为事件提供服务,而在做其他事情时它不能这样做。

解决此问题的正常方法是在线程或单独的进程中运行长时间运行的计算。

于 2013-05-09T23:08:15.133 回答