Tkinter Indeterminate Progress Bar

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.