当我从tkinter小部件事件中调用函数时,我需要在函数的定义行中添加第二个参数。像onChange(self,event)或onChange(self,test)。 “事件”和“测试”是第二个参数。
赞:
def onChange(self, test):
print('Content is: ', test.widget.get())
#this also works, but only when having "test" or any other other second parameter name in the def line:
print('Content is: ', self.var.get())
作为Python / Tkinter的初学者,我的问题是我不理解第二个参数以及为什么需要它。是否有人对此有很好的解释和/或对其他资料的引用以增进我的理解?
我还想了解为什么没有第二个参数的此功能无法正常工作。
def onChange(self):
print('Content is: ', self.var.get())
一个小示例程序:
import tkinter as tk
from tkinter import ttk
class GUI:
def __init__(self):
self.window = tk.Tk()
self.create_widgets()
# The following function works with "test" or any other second parameter name in the def line:
def onChange(self, test):
print('Content is: ', test.widget.get())
#this also works, but only when having "test" or any other other second parameter name in the def line:
print('Content is: ', self.var.get())
## The following function does not work:
# def onChange(self):
# print('Content is: ', self.var.get())
def create_widgets(self):
# Makes an Entry widget:
self.string_entry = ttk.Entry(self.window,width=30)
self.string_entry.grid(row=0,column=0)
self.var = tk.StringVar()
self.var.set('Change me and press enter!')
self.string_entry["textvariable"]=self.var
self.string_entry.bind('<Key-Return>', self.onChange)
program = GUI()
program.window.mainloop()
答案 0 :(得分:0)
您已经准备好添加“额外”的变量。 您在调用签名中添加的self变量也是在调用类方法时由系统(python)填充的变量。 以相同的方式,当事件由tkinter调用回调时,tkinter将添加额外的变量,在这种情况下为事件。
事件变量包含有关为何调用回调的更多信息,这使同一回调能够处理多个不同的事件。
页面http://effbot.org/很旧,主要描述Python2代码,但在大多数情况下,它已经足够更新以了解tkinter及其工作方式。
答案 1 :(得分:0)
调用您的函数的Tk框架将一个变量传递给您的回调函数(以及使用所有方法调用的self
变量)。调用第二个方法时,它不能接受第二个参数,因此会引发TypeError。
有关绑定方法here的更多信息。
如果您不关心该参数,则可以使用varargs语法忽略传入的任何内容。
def onChange(self, *_):
print('Content is: ', self.var.get())