2017-01-03 4 views
0
import tkinter as tk 

def load(event): 
    file = open(textField.GetValue()) 
    txt.SetValue(file.read()) 
    file.close() 

def save(event): 
    file = open(textField.GetValue(), 'w') 
    file.write(txt.GetValue()) 
    file.close() 


win = tk.Tk() 
win.title('Text Editor') 
win.geometry('500x500') 

# create text field 
textField = tk.Entry(win, width = 50) 
textField.pack(fill = tk.NONE, side = tk.TOP) 

# create button to open file 
openBtn = tk.Button(win, text = 'Open', command = load()) 
openBtn.pack(expand = tk.FALSE, fill = tk.X, side = tk.TOP) 

# create button to save file 
saveBtn = tk.Button(win, text = 'Save', command = save()) 
saveBtn.pack(expand = tk.FALSE, fill = tk.X, side = tk.TOP) 

Ich bekomme den Fehler load and save are missing a position argument: event. Ich verstehe den Fehler, verstehe aber nicht, wie er gelöst werden kann.Tkinter: Aufruf der Funktion, wenn die Taste gedrückt wird

+0

Wenn Sie den 'tk.Button's erstellen, sind Sie _calling_ die Funktionen, weil Sie zum Beispiel' command = load() 'statt' command = load' in der Aufrufsequenz zu dem Konstrukteur. – martineau

+0

Obwohl es kein exaktes Duplikat ist, hat Ihr Code das gleiche Problem wie der Code in dieser Frage: http://stackoverflow.com/q/5767228/7432 –

+0

@martineau Ich habe das getan. Nun heißt es, das Entry-Objekt habe kein Attribut GetValue. Was ist der Zweck, das Ereignis als Parameter in einer Funktion zu haben? – user7091463

Antwort

0

Entfernen Sie die Argumente 'event' von beiden Funktionsdefinitionen und entfernen Sie Klammern aus Ihren Befehlen.

0

Hier ist eine ausführbare Antwort. Zusätzlich zum Ändern des Schlüsselwortarguments commmand=, so dass es die Funktion nicht aufruft, wenn die tk.Button s erstellt werden, entfernte ich auch das event Argument aus den entsprechenden Funktionsdefinitionen, da tkinter keine Argumente an Widget-Befehlsfunktionen (und Ihre Funktion) übergeben brauche ich es sowieso nicht).

Sie scheinen Ereignishandler mit Widget-Befehlsfunktionshandlern zu verwirren. Die ehemaligen tun haben eine event Argument übergeben, wenn sie aufgerufen werden, aber die letzteren in der Regel nicht (es sei denn, Sie tun zusätzliche Sachen, um es geschehen zu lassen - es ist eine ziemlich häufige Sache zu müssen/tun wollen und ist manchmal bezeichnet als die The extra arguments trick).

import tkinter as tk 

# added only to define required global variable "txt" 
class Txt(object): 
    def SetValue(data): pass 
    def GetValue(): pass 
txt = Txt() 
#### 

def load(): 
    with open(textField.get()) as file: 
     txt.SetValue(file.read()) 

def save(): 
    with open(textField.get(), 'w') as file: 
     file.write(txt.GetValue()) 

win = tk.Tk() 
win.title('Text Editor') 
win.geometry('500x500') 

# create text field 
textField = tk.Entry(win, width=50) 
textField.pack(fill=tk.NONE, side=tk.TOP) 

# create button to open file 
openBtn = tk.Button(win, text='Open', command=load) 
openBtn.pack(expand=tk.FALSE, fill=tk.X, side=tk.TOP) 

# create button to save file 
saveBtn = tk.Button(win, text='Save', command=save) 
saveBtn.pack(expand=tk.FALSE, fill=tk.X, side=tk.TOP) 

win.mainloop() 
Verwandte Themen