Filedialog bringt in Funktion Fehlermeldung

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

Hallo, ich wollte mal fragen, wo bei mir hier bei folgendem Code der Denkfehler liegt:

Code: Alles auswählen

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

class Programm:
    def __init__(self):
        # das Hauptfenster
        self.hauptfenster = tk.Tk()
        
       
        
        self.bilder_label = tk.Label(self.hauptfenster,image=self.bilderliste[self.number],width=1600,height=880)
        self.bilder_label.grid(row=0,column=0,columnspan=3)
        
        
       
        self.button_open = tk.Button(self.hauptfenster, text="open file", command=open)
        self.button_open.grid(row=1,column=0)
        
    def open(self):
        
        self.hauptfenster.filename = filedialog.askopenfilename(initialdir="/home/wolfgang/Bilder",title="Öffne Datei", filetypes =(("png files", "*.png"),("all files","*.*")))
        self.gewaehlt = ImageTk.PhotoImage(Image.open(self.hauptfenster.filename))
        self.bilder_label["image"] = self.gewaehlt
        
Wenn ich den Open-Button drücke, erhalte ich immer den Fehler:

Code: Alles auswählen

TypeError: Required argument 'file' (pos 1) not found
>>> 
Vielen Dank schonmal.

P.S.: Wenn ich das ganze ohne Funktion mache und den Dialog schon bei Programmbeginn anzeigen lasse, dann klappt es komischerweise...
Benutzeravatar
__blackjack__
User
Beiträge: 13133
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das passiert wenn man die eingebaute `open()`-Funktion ohne Argument(e) aufruft:

Code: Alles auswählen

In [9]: open()                                                                  
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-90d238d6e9f9> in <module>
----> 1 open()

TypeError: Required argument 'file' (pos 1) not found
Du willst da nicht die `open()`-Funktion angeben sondern die Methode `open()` von dem `Programm`-Objekt.

Der Dateiname den der Dateidialog zurück gibt, sollte nicht an das `Tk`-Objekt gebunden werden. Warum machst Du das?

Es wird auch nicht berücksichtigt, dass der Dateidialog auch geschlossen/abgebrochen werden kann ohne das der Benutzer eine Datei auswählt.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Cortez
User
Beiträge: 115
Registriert: Montag 31. Dezember 2018, 15:28

An das Tk-Objekt nicht, aber der Dateiname, den das filedialog zurückgibt, soll dann als image-attribut dem bilder_label zugewiesen werden.
Antworten