Tkinter开发:如何在同一事件回调中区分两个输入框组件?
区分Tkinter输入框点击事件的方法
核心解决思路
Tkinter的事件处理函数会自动接收一个event参数,该参数的widget属性就是触发事件的控件本身——通过它就能直接区分是哪个输入框被操作了。
1. 修改点击事件处理函数
原来的handleEvent只能固定清空self.text,现在改成通过event.widget获取触发事件的输入框,再找到它绑定的StringVar来清空:
def handleEvent(self, event): # 获取触发点击的输入框控件 target_entry = event.widget # 获取该输入框绑定的文本变量 var = target_entry.cget("textvariable") # 清空提示文字 var.set("")
2. 修改回车事件处理函数(同理区分输入框)
原来的handleEvent2只能获取第一个输入框的内容,现在用event.widget获取当前触发回车的输入框:
def handleEvent2(self, event): target_entry = event.widget content = target_entry.get() print(content)
3. 完整修改后的代码
import tkinter as tk from tkinter import ttk class window(): def handleEvent(self, event): target_entry = event.widget var = target_entry.cget("textvariable") var.set("") def handleEvent2(self, event): target_entry = event.widget content = target_entry.get() print(content) def page0(self): self.text = tk.StringVar(None) self.text.set("Enter text here") self.efeld = ttk.Entry(fenster, textvariable=self.text) self.efeld.place(x=5, y=20) self.efeld.bind("<Button-1>", self.handleEvent) self.efeld.bind("<Return>", self.handleEvent2) self.text2 = tk.StringVar(None) self.text2.set("Enter text 2 here") self.efeld2 = ttk.Entry(fenster, textvariable=self.text2) self.efeld2.place(x=5, y=50) self.efeld2.bind("<Button-1>", self.handleEvent) self.efeld2.bind("<Return>", self.handleEvent2) fenster = tk.Tk() fenster.title("Test") fenster.geometry("500x350") fenster.resizable(False, False) window().page0() fenster.mainloop()
额外优化方案
如果需要自定义标识来区分输入框,可以给每个输入框设置name属性,通过event.widget.winfo_name()判断:
# 创建输入框时设置自定义名称 self.efeld = ttk.Entry(fenster, textvariable=self.text, name="input_box_1") # 在事件函数中判断 if event.widget.winfo_name() == "input_box_1": # 针对该输入框的逻辑处理
内容的提问来源于stack exchange,提问作者The GoodGameCrafter
相关产品推荐
相关产品推荐

