Начало работы блесны без резьбы - PullRequest
0 голосов
/ 07 июня 2018

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

Я застрял с чем-то еще, не пытаясь снова войти в потоки (что в прошлый раз было большой болью).У кого-нибудь есть совет, что еще я мог бы попытаться заставить это работать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...