Button lässt sich nicht "disabled"

Fragen zu Tkinter.
Antworten
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Hallo zusammen,
ich habe mir einen kleinen Image-Viewer erstellt, der aus einer Liste ein paar Bilder anzeigt. Funktioniert auch alles soweit. Aber nun wollte ich erreichen, dass, wenn alle Bilder durch sind, der "forward"-Button deaktiviert wird, damit es zu keiner Fehlermeldung kommt. Klar gibt es auch andere Möglichkeiten (Zähler zurücksetzen, Messagebox usw.), aber mich würde halt mal interessieren, warum sich der Button bei mir nicht deaktivieren lässt.

Hier mal der Code:

Code: Alles auswählen

import tkinter as tk
from PIL import ImageTk
from PIL import Image

class Programm:
    def __init__(self):
        # das Hauptfenster
        self.hauptfenster = tk.Tk()
        
        #Inhalte
        
        self.number = 0
        
        self.my_img1 = ImageTk.PhotoImage(Image.open("/home//Bilder/icon.png"))
        self.my_img2 = ImageTk.PhotoImage(Image.open("/home//Bilder/icon2.png"))
        self.my_img3 = ImageTk.PhotoImage(Image.open("/home//Bilder/icon3.png"))
        self.my_img4 = ImageTk.PhotoImage(Image.open("/home//Bilder/icon4.png"))
        self.my_img5 = ImageTk.PhotoImage(Image.open("/home//Bilder/icon5.png"))
        
        self.bilderliste =[self.my_img1,self.my_img2,self.my_img3,self.my_img4,self.my_img5]
        
        self.my_label = tk.Label(self.hauptfenster,image=self.bilderliste[self.number],width=1600,height=980)
        self.my_label.grid(row=0,column=0,columnspan=3)
        
        self.button_back = tk.Button(self.hauptfenster, text="<<", command=lambda: back2())
        self.button_quit = tk.Button(self.hauptfenster, text="Exit",padx=40,pady=20, command=self.hauptfenster.destroy)
        
        self.button_einrichten()
        
        self.button_back.grid(row=1, column=0)
        self.button_quit.grid(row=1,column=1)
  
        
        
    def button_einrichten(self):
        if self.number == 2:
           self.button_forward(self.hauptfenster,text=">>", command=lambda: self.forward(),state= DISABLED)
           self.button_forward.grid(row=1,column=2)
        else:
           self.button_forward = tk.Button(self.hauptfenster, text=">>", command=lambda: self.forward())
           self.button_forward.grid(row=1,column=2)
        
    def forward(self):
        self.number +=1
        self.my_label.grid_forget()
        self.my_label=tk.Label(image=self.bilderliste[self.number],width=1600,height=900)
        self.my_label.grid(row=0,column=0,columnspan=3)
        
        
        
        
def main():
    programm = Programm()
    programm.hauptfenster.mainloop()
    
if __name__ == '__main__':
    main()
        
        
Für Hinweise danke ich.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Die my_-Präfixe sind unnötig und können weg. Statt Namen durchzunummerieren, solltest Du eine Liste verwenden.
Datentypen sollten nicht in Namen vorkommen, statt `bilderliste` einfach nur `bilder`.
back2 ist nirgends definiert. `button_einrichten` sollte keine eigene Funktion sein, sondern in __init__ stehen und dort ist number immer 1, das if also unnötig.
Es sollten auch nicht ständig neue Labels erzeugt werden, sondern einfach nur das bestehende verändert werden.
Statt lambda, benutzt man functools.partial, wenn es denn nötig wäre, bei Dir ist es nirgends nötig.
DISABLED ist nirgends definiert.

Code: Alles auswählen

import tkinter as tk
from PIL import Image, ImageTk

IMAGE_FILENAMES = ["/home//Bilder/icon.png", "/home//Bilder/icon2.png", "/home//Bilder/icon3.png", "/home//Bilder/icon4.png", "/home//Bilder/icon5.png"]

class Programm:
    def __init__(self):
        self.number = 0
        self.hauptfenster = tk.Tk()
        self.bilder = [
            ImageTk.PhotoImage(Image.open(filename))
            for filename in IMAGE_FILENAMES
        ]
        self.bilder_label = tk.Label(self.hauptfenster, image=self.bilderliste[self.number], width=1600, height=980)
        self.bilder_label.grid(row=0,column=0,columnspan=3)
        
        self.button_back = tk.Button(self.hauptfenster, text="<<", command=self.back, state=tk.DISABLED)
        self.button_back.grid(row=1, column=0)

        self.button_quit = tk.Button(self.hauptfenster, text="Exit", command=self.hauptfenster.destroy)
        self.button_quit.grid(row=1,column=1)

        self.button_forward = tk.Button(self.hauptfenster, text=">>", command=self.forward)
        self.button_forward.grid(row=1,column=2)
        
    def forward(self):
        self.number += 1
        self.update()
    
    def back(self):
        self.number -=1
        self.update()

    def update(self):
        self.bilder_label["image"] = self.bilderliste[self.number]
        self.button_back["state"] = tk.NORMAL if self.number > 1 else tk.DISABLED
        self.button_forward["state"] = tk.NORMAL if self.number < len(self.bilder) - 1 else tk.DISABLED
        
def main():
    programm = Programm()
    programm.hauptfenster.mainloop()
    
if __name__ == '__main__':
    main()
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

Danke, hat mir sehr geholfen!
Antworten