【问题标题】:Progressbar (ttk.Progressbar) with python in tkinter not showingtkinter中带有python的进度条(ttk.Progressbar)未显示
【发布时间】:2013-05-04 12:09:14
【问题描述】:

使用 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()

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

【问题讨论】:

    标签: python python-3.x tkinter progress-bar ttk


    【解决方案1】:

    为了让小部件在创建后出现,必须允许事件循环运行。这是因为小部件在屏幕上的实际绘制是重绘事件的结果。

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

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

    【讨论】:

    • FWIW,当不使用线程时,有时还需要手动调用根窗口的update() 方法来强制发生任何其他挂起的重绘事件——以移除已关闭的对话框,例如。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多