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: 12984
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.
“Most people find the concept of programming obvious, but the doing impossible.” — 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