Seite 1 von 1

Button lässt sich nicht "disabled"

Verfasst: Dienstag 30. März 2021, 13:02
von Cortez
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.

Re: Button lässt sich nicht "disabled"

Verfasst: Dienstag 30. März 2021, 14:16
von Sirius3
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()

Re: Button lässt sich nicht "disabled"

Verfasst: Dienstag 30. März 2021, 15:18
von Cortez
Danke, hat mir sehr geholfen!