Tkinter:按下按钮时调用函数

新手上路,请多包涵
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)

我收到错误 load and save are missing a position argument: event 。我理解错误,但不明白如何解决它。

原文由 user7091463 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 629
1 个回答

这是一个可运行的答案。除了更改 commmand= 关键字参数使其在创建 tk.Button 时不调用函数外,我还从相应的参数中删除了 eventtkinter 以来的函数定义不会将任何参数传递给小部件命令函数(并且您的函数不需要它,无论如何)。

您似乎将事件处理程序与小部件命令函数处理程序混淆了。前者 确实 有一个 event 参数在它们被调用时传递给它们,但后者通常没有(除非你做额外的事情来实现它 - 这是需要/想要的相当普遍的事情做并且有时被称为 额外参数技巧)。

 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()

原文由 martineau 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题