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