Daha iyi bir yol var mı?

Merhaba, izninizle paylaştığınız koddaki yazım yanlışlarından bahsedeyim.

  1. Button nesnesi, tk.Tk nesnesinden miras alınarak oluşturulmuş ama super class'ın __init__ metodu çağrılmamış.
class Button(tk.Tk):
    def __init__(self, x, y, name, cmd=None, change=None):
        super().__init__()
  1. Button sınıfı için, miras alınması gereken sınıfın tk.Button sınıfı olması gerekiyor.
class Button(tk.Button):
    def __init__(self, x, y, name, cmd=None, change=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
  1. Button sınıfını adeta bir fonksiyon gibi kullanmışsınız, sınıfa ait hiçbir nitelik veya metot tanımlanmamış. command metodu da __init__ metodu içinde tanımlanmış.
  2. time.sleep(1) programda donmaya neden olacağı için Thread nesnesi kullanmışsınız. time.sleep(1)'den sonraki kısmı bir fonksiyon içine alıp, bu fonksiyonu root.after(1000, fonksiyon) şeklinde çağırabilirsiniz. Yani özellikle Thread nesnesi kullanmaya gerek yok.
  3. Sınıfı, birden fazla düğme oluşturmak istediğimizde, oluşturmak istediğimiz bütün düğmeler için aynı işlevleri yerine getirecek şekilde yazmamız gerekiyor. Sizin yazdığınız sınıf, maalesef sadece güncellendi.png resmi için çalışıyor. Böyle dosya isimlerini, kullanıcının en son aşamada girmesi gerekir. Dosya ismini hardcoded yaparsanız, o sınıf başka resimler için çalışamaz.

Ben olsaydım, resmi değişebilir Button sınıfını şu şekilde yazardım:

import tkinter as tk

from PIL.ImageTk import Image, PhotoImage


class ChangeableButton(tk.Button):
    def __init__(self, images, commands, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if any(len(i) != 2 for i in [images, commands]):
            raise IndexError(
                "The length of 'images' and 'commands' "
                "arguments must be 2."
            )
        self.images = [PhotoImage(Image.open(image)) for image in images]
        self.index = 0
        self.configure(
            image=self.images[0],
            command=lambda: self.command(commands),
            borderwidth=0,
            highlightthickness=0,
            activebackground=self["bg"]
        )
        self.pack()

    def command(self, commands):
        if callable(commands[self.index]):
            commands[self.index]()
        if self.index == 1:
            self.index = 0
        else:
            self.index += 1
        self["image"] = self.images[self.index]


def main():
    root = tk.Tk()
    ChangeableButton(
        master=root, 
        images=("power-on.png", "power-off.png"),
        commands=(lambda: print("power on"), lambda: print("power off"))
    )
    ChangeableButton(
        master=root,
        images=("switch-on.png", "switch-off.png"),
        commands=(lambda: print("switch on"), lambda: print("switch off"))
    )
    ChangeableButton(
        master=root,
        images=("start.png", "stop.png"),
        commands=(lambda: print("started"), lambda: print("stopped"))
    )
    root.mainloop()


if __name__ == "__main__":
    main()

1 Beğeni