【问题标题】:Update progress bar from function outside the main class in Python Tkinter从 Python Tkinter 中主类外部的函数更新进度条
【发布时间】:2020-04-06 14:12:13
【问题描述】:

我已经初始化了一个进度条,想根据 Tkinter 主类之外的函数/线程来更新它。我已经尝试了这里出现的所有与问题类似的解决方案,但无济于事。任何帮助将不胜感激。这是我的代码:

from tkinter import ttk
import time
import tkinter as tk

def run():
    global progressBar
    progressBar['maximum'] = 100
    for i in range(0,100,25):
        time.sleep(0.05)
        progressBar["value"] = i
        progressBar.update()
        progressBar["value"] = 0
    progressBar["value"] = 100


class Main(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        buttonFrame = tk.Label(text="Progress Bar")
        buttonFrame.grid(column=0,row=0)

        progressBar = ttk.Progressbar(self, orient="horizontal", length=286,mode="determinate")
        progressBar.grid(column = 0, row = 3, pady=10)

        button1 = tk.Button(buttonFrame, text="Run Progress Bar" ,command = run)
        button1.grid(column = 0, row = 0)


app = Main()
app.mainloop() 

【问题讨论】:

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


    【解决方案1】:

    您已经使用了 OOP。您可以充分利用课程。我已经重构了您的代码(另外,您的代码中有错误):

    from tkinter import ttk
    import time
    import tkinter as tk
    
    class Main(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            self.buttonFrame = tk.Label(text="Progress Bar")
            self.buttonFrame.grid(column=0,row=0)
    
            self.progressBar = ttk.Progressbar(self, orient="horizontal", length=286,mode="determinate")
            self.progressBar.grid(column = 0, row = 3, pady=10)
    
            # this shouldn't be run() or self.run().No "()" there(Or you can use lambda if you need to pass arguments).
            self.button1 = tk.Button(self.buttonFrame, text="Run Progress Bar" ,command = self.run) 
            self.button1.grid(column = 0, row = 0)
    
        def run(self):
            self.progressBar['maximum'] = 100
            for i in range(0, 100, 25):
                time.sleep(0.05)
                self.progressBar["value"] = i
                self.progressBar.update()
                self.progressBar["value"] = 0
            self.progressBar["value"] = 100
    
    
    app = Main()
    app.mainloop()
    

    【讨论】:

    • 天哪!我尝试了同样的方法,但没有 "command = self.run" 我使用了 "command = run" 。非常感谢!
    • 当我尝试从一个名为函数的线程更新它时,程序窗口永远挂起。
    • 不知道你的代码是什么。所以我也不知道你遇到了什么问题。
    • 谢谢,我想通了。它在被调用的函数中有长时间运行的线程。这导致 Tkinter 没有响应。我使用线程调用了该函数,现在 Tkinter 主线程没有受到干扰并且正常运行。因此,进度条会被上传。
    【解决方案2】:

    你好,我该如何让它运行?

    from tkinter import ttk
    import time
    import tkinter as tk
    
    class Main(tk.Tk):
        def __init__(self, *args,**kwargs):
            tk.Tk.__init__(self,*args, **kwargs)
            self.buttonFrame = tk.Label(text="Progress Bar")
            self.buttonFrame.grid(column=0,row=0)
    
            self.progressBar = ttk.Progressbar(self, orient="horizontal", length=286,mode="determinate")
            self.progressBar.grid(column = 0, row = 3, pady=10)
    
        # this shouldn't be run() or self.run().No "()" there(Or you can use lambda if you      need to pass arguments).
            self.button1 = tk.Button(self.buttonFrame, text="Run Progress Bar" ,command = self.run)
            self.button1.grid(column = 0, row = 0)
    
         def run(self, data):
            self.progressBar['maximum'] = 100
            for i in range(data):
                time.sleep(0.05)
                self.progressBar["value"] = i
                self.progressBar.update()
                self.progressBar["value"] = 0
            self.progressBar["value"] = 100
    
    class second():
    
        def pass_it(self):
            data = 99
            Main().run(data)
    

    【讨论】:

    • 你没有调用任何函数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2018-11-02
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多