Python使用tkinter类结构时如何在类外获取__init__内的输入框值并打印
tkinter类式结构跨类获取输入框内容的实现方法
问题根源
原有代码无法实现跨类取值,核心是几个常见的开发逻辑问题:
- 类内写的
target_ip = self.targetIP是__init__方法的局部变量,仅在方法执行的生命周期内存在,类外完全无法访问。 - 即使能访问这个变量,它存的也是Entry控件对象本身,不是输入框内的文本内容,要取文本必须调用Entry控件原生的
get()方法。 - 测试代码里的
print(target_ip)写在root.mainloop()之后,而mainloop是阻塞执行的,只有窗口完全关闭后,这行print才会运行,此时既没有类外的变量作用域支撑,也抓不到实时输入的内容。 - 原代码里
tk.Entry(self.Ipconfig)存在未定义父容器的bug,self.Ipconfig没有预先初始化,实际运行会直接报错。
具体实现步骤
- 修正类内的基础代码
把Entry控件固定为类的公开实例属性(原代码已经写了self.targetIP = tk.Entry(...),这一步逻辑是对的,只需要把不存在的父容器改成实际可用的self,删掉没用的局部变量赋值即可)class PseudostreamWidget(tk.Frame): def __init__(self, master=None, **kw): tk.Frame.__init__(self, master, **kw) # 修正Entry的父容器,删掉无效的局部变量赋值 self.targetIP = tk.Entry(self) self.targetIP.configure(background='black', font='{Lato} 12 {}', foreground='white', highlightbackground='black') self.targetIP.configure(highlightcolor='black', justify='left', relief='raised') _text_ = '''Friend's Public IP Here''' self.targetIP.delete('0', 'end') self.targetIP.insert('0', _text_) self.targetIP.grid(column='1', row='0') - 根据使用场景实现取值逻辑
场景1:交互触发取值(GUI开发最常用)
给界面加个按钮,绑定触发方法,点击时直接读取输入框内容打印:- 在类内新增取值方法,通过Entry的
get()拿文本 - 把方法绑定到按钮的
command属性上
# 在__init__方法里追加按钮代码 self.fetch_btn = tk.Button(self, text="获取输入的IP", command=self.print_current_ip) self.fetch_btn.grid(column=1, row=1) # 类内新增取值打印方法 def print_current_ip(self): input_content = self.targetIP.get() print(f"当前输入的IP内容:{input_content}")场景2:窗口关闭时自动取值
绑定窗口关闭事件,在窗口销毁前提取输入内容,不用额外加按钮:if __name__ == '__main__': root = tk.Tk() widget = PseudostreamWidget(root) widget.pack(expand=True, fill='both') # 定义窗口关闭时的回调逻辑 def on_window_close(): # 直接通过实例的公开属性拿Entry对象,调用get()取值 final_content = widget.targetIP.get() print(f"窗口关闭时的最终输入内容:{final_content}") root.destroy() # 把回调绑定到窗口关闭事件上 root.protocol("WM_DELETE_WINDOW", on_window_close) root.mainloop() - 在类内新增取值方法,通过Entry的
注意事项
- 别混淆控件对象和控件内容:
self.targetIP是Entry控件实例,不是输入框里的文字,必须调用.get()方法才能拿到文本字符串。 - 类内定义的变量如果不加
self.前缀,都是方法运行时生成的临时局部变量,方法跑完就被销毁了,类外根本找不到,想让类外能访问的内容,必须挂成self.xxx的实例属性。 - 不要把取值逻辑写在
root.mainloop()后面,mainloop会阻塞后续代码执行,只有窗口关闭后才会往下走,无法实现实时交互取值。
内容的提问来源于stack exchange,提问作者Vardhan Mahajan
相关产品推荐
相关产品推荐

