在没有线程的情况下让微调器工作

时间:2018-06-07 09:27:38

标签: python-3.x tkinter

我试图让一个微调器工作,但没有使用线程(我有一个工作版本,但它给了我不稳定的行为。在线阅读后,人们告诉我,最好避免使用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也是一个复杂的函数,它改变了主根类的属性。

我仍然坚持要做的其他事情,而不是再次进入线程(上次这是一个很大的痛苦)。任何人都有建议我还能尝试让它发挥作用吗?

0 个答案:

没有答案
相关问题