【问题标题】:Python - tkinter display progress bar during function processingPython - tkinter 在函数处理期间显示进度条
【发布时间】:2020-07-10 10:41:25
【问题描述】:

我需要显示一个不确定的进度条以向用户指示正在发生的事情。 我发现了很多例子,但都是通过按钮操作的,没有一个显示如何在执行功能时显示进度条。另外,我想在函数启动时显示进度条并在函数结束时消失,而用户不必按任何按钮或关闭窗口。我的主要问题是,如果我使用 mainloop() 函数,我只能显示进度条,在这种情况下,我的程序会被阻止,直到我关闭窗口。按照建议,我尝试在不同的线程中启动进度条,目前没有成功

这是我的代码:

main.py

import time
import ProgressBar

print("start")
print("sleep 5 seconds")
pb = ProgressBar.ProgBar()
time.sleep(5)
pb.stop()
print("end")

ProgressBar.py

from tkinter import *
from tkinter import ttk
from threading import thread

class ProgBar(Frame):
  def __init__(self):
    Frame.__init__(self)
    self.master.title("ProgressBar example")
    self.grid(sticky=E+W+N+S)
    self.pbar = ttk.Progressbar(self, orient="horizontal", length=300, mode="indeterminate", maximum=100)
    self.pbar.grid(row=0, column=0, pady=2, padx=2, sticky=E+W+N+S, columnspan=3)
    self.start()

  def start(self):
    def start_thread(self):
      self.pbar.start()
      self.mainloop()     
  Thread(target=start_thread, args=(self,)).start()

  def stop(self):
    self.pbar.stop()
    self.destroy()

【问题讨论】:

标签: python tkinter ttk


【解决方案1】:

您需要在与运行 tkinter 的 mainloop 的线程不同的线程中调用该函数。您可以使用 Python 的 threading 导入很容易地做到这一点:

import threading
x = threading.Thread(target=thread_function, args=(1,))
x.start()

当您启动 ProgBar 时,mainloop 将在您启动线程以执行您的函数之前阻塞。为了解决这个问题,在你开始你的主循环之前,打电话给self.after(100, self.start_thread_function)。这将使您的函数排队以启动线程,以便您的函数在 100 毫秒后发生。您可以随意调整这个时间。

最后,一旦你的函数完成,你可以简单地从函数本身调用你的stop 函数。通常,在 UI 循环之外进行的 UI 影响调用会给您带来问题,但由于 Python 中线程的工作方式,您不必在这里担心。

【讨论】:

  • 我理解您描述的逻辑,但我没有成功编写正确的代码。我在问题的ProgressBar.py中更改了函数start()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2013-05-04
  • 2021-12-22
  • 2012-09-02
相关资源
最近更新 更多