Aşağıdaki linkte, alternatif mainloopları nasıl oluşturabileceğimiz hakkında bir yazı var.
Mesela, herhangi bir kütüphane kullanmadan, hatta tk
widgetlerinin mainloop
fonksiyonunu da kullanmadan, pencereyi görünür kılabilirsiniz. Ve pencere görünür olduğu sürece de, istediğiniz işlemleri aynı anda yapabilirsiniz.
Öncelikle, eğer daha önce hiç karşılaşmadıysanız, yield
, generator
, coroutine
kavramları hakkında da araştırmalar yapmanızı tavsiye ederim.
İzninizle sizinle bir kod paylaşayım, döngüler birbirlerini engellemeden nasıl çalışıyorlar anlamaya çalışın.
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.tasks = []
self.button = tk.Button(master=self, text="Create Task", command=self.create_task)
self.button.pack()
self.protocol("WM_DELETE_WINDOW", lambda: self.tasks.clear())
def run(self):
self.tasks = [self.display()]
i = 0
while self.tasks:
index = i % len(self.tasks)
try:
self.tasks[index].send(None)
i += 1
except StopIteration:
self.tasks.pop(index)
i -= 1
def display(self):
while True:
self.update()
yield
def task(self):
pbar = ttk.Progressbar(master=self, orient="horizontal", mode="indeterminate")
pbar.pack()
pbar.start()
for i in range(1000000):
yield
pbar.stop()
pbar.destroy()
def create_task(self):
self.tasks += [self.task()]
App().run()
Task’ın işi bitince, o taskla ilgili ilerleme çubuğu kapanıyor.