0

我试图让微调器工作,但不使用线程(我有一个工作版本,但它给了我不稳定的行为。在网上阅读后人们告诉我最好避免使用 tkinter 线程)。所以我想试试 after 函数。

目标是在开始某事完成之前弹出一个微调器,并在“某事”完成后让它消失。这是我所拥有的简约示例:

import tk
from time import sleep

class Spinner(tk.Toplevel):
    def __init__(self, master, text = None, barsize = 10, speed = 100, spinnerSize = 50):
        super().__init__(master = master)
        self.barsize = barsize
        self.speed = speed
        self.size = spinnerSize
        self.done = False
        self.progress = 0
        self.forward = True
        if text is None:
            self.text = 'Something is happening'
        else:
            self.text = text
        self.title(self.text)
        self.out = tk.Label(master = self,
                            text = self.spinnerCalc(),
                            height = 1,
                            borderwidth = 0,
                            width = 80,
                            bg = self['background'])
        self.out.pack()
        self.update_self()

    def update_self(self):
        print(self.progress)
        if self.forward:
            if self.progress == self.size - self.barsize:
                self.forward = False
                self.progress -= 1
            else:
                self.progress += 1
        else:
            if self.progress == 0:
                self.forward = True
                self.progress += 1
            else:
                self.progress -= 1
        self.out.config(text = self.spinnerCalc())
        if self.done:
            self.grab_release()
            self.destroy()
        else:
#            print('entered continue update')
            self.update()
#            print('step 2')
            self.grab_set()
#            print('step 3')
            self.after(self.speed, self.update_self)
#            print('step 4')

    def spinnerCalc(self):
        #returns something like |------█████--------------|
        bar = '|'
        barsize = self.barsize
        size = self.size
        for i in range (self.progress):
            bar += '-'
        for i in range (barsize):
            bar += '\u2588'
        for i in range (size-barsize-self.progress):
            bar += '-'
        bar += '|'
        return bar

    def stop(self):
        self.done = True

root = tk.Tk()
def spin():
    spinner = Spinner(root)
    a_bunch_of_stuff_happening(10)
    spinner.stop()

def a_bunch_of_stuff_happening(amount):
    count = 0
    for i in range(100000000):
        count += i
    print(count)

tk.Button(master = root,
          text = 'Press me',
          command = spin).pack()
tk.Button(master = root,
          text = 'Close me',
          command = root.destroy).pack()
root.mainloop()

问题是 update_self 没有运行。我不想对 Spinner 进行主循环,因为这会阻止我的 a_bunch_of_stuff_happening() 函数。a_bunch_of_stuff_happening 也是一个复杂的函数,它改变了主根类的属性。

我被困在没有再次进入线程的情况下尝试其他什么(上次这是一个很大的痛苦)。任何人有什么建议我可以尝试让它工作吗?

4

0 回答 0