You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例上调用一次,针对你的场景有两种处理方式:

  1. 直接启动登录窗口(测试有效):
if __name__ == "__main__":
    app = LoginScreen()
    app.mainloop()
  1. 集成到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:25:14