Обновить индикатор выполнения из функции вне основного класса в Python Tkinter - PullRequest
0 голосов
/ 06 апреля 2020

Я инициализировал индикатор выполнения и хочу обновить его в соответствии с функцией / потоком, которая находится за пределами основного класса 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() 

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Вы использовали 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()
0 голосов
/ 01 мая 2020

привет, как мне заставить это работать?

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)
...