了解将StringVar绑定到tkinter小部件如何与事件一起使用

时间:2019-08-22 08:12:36

标签: python-3.x tkinter

当我从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()

2 个答案:

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