Tkinter问题:无法从独立函数获取StringVar()的值
问题解决:Tkinter无法获取输入框StringVar值及GUI启动问题
一、按钮命令绑定错误(核心问题)
你代码中按钮绑定命令的写法错误,导致函数在初始化时就被执行,而非点击按钮触发:
# 错误写法:直接调用函数,初始化时就执行login_func self.login_button['command'] = self.login_func() # 正确写法:绑定函数对象,点击按钮才执行 self.login_button['command'] = self.login_func
原代码中self.login_func()会在窗口初始化时立刻执行,此时用户还未输入内容,所以get()返回空字符串。
二、替换全局变量为实例属性(优化实践)
全局变量属于不良编码习惯,直接将StringVar设为类的实例属性即可实现跨方法访问:
修改__init__方法中的变量声明与绑定:
def __init__(self): super().__init__() # ... 其他代码省略 ... # 去掉global声明,改用实例属性 self.username_verify = tk.StringVar() self.password_verify = tk.StringVar() # 输入框绑定实例属性 self.u_entry = Entry(self.root, textvariable=self.username_verify) self.u_entry.grid(row = 1, column=1, pady=2) self.p_entry = Entry(self.root, textvariable=self.password_verify) self.p_entry.grid(row = 2, column=1, pady=2) # ... 其他代码省略 ...
修改login_func方法获取值的方式:
def login_func(self): connection = sqlite3.connect("horizon_cinemas.db") cursor = connection.cursor() print(self.username_verify.get())
三、GUI启动问题(编辑部分)
Tkinter的mainloop()只需要在顶层的Tk实例上调用一次,针对你的场景有两种处理方式:
- 直接启动登录窗口(测试有效):
if __name__ == "__main__": app = LoginScreen() app.mainloop()
- 集成到Main类中:
如果必须从Main类启动,需确保Main是Tk实例,并在其内部创建LoginScreen(建议用Toplevel作为子窗口),示例如下:
class Main(tk.Tk): def __init__(self): super().__init__() # 先隐藏主窗口,显示登录窗口 self.withdraw() self.login_window = LoginScreen() # 可在登录成功后销毁登录窗口,显示主窗口 if __name__ == "__main__": app = Main() app.mainloop()
内容的提问来源于stack exchange,提问作者user17221554
相关产品推荐
相关产品推荐

