【问题标题】:Tkinter: Error in Terminal, possibly from my key bind?Tkinter:终端错误,可能来自我的键绑定?
【发布时间】:2016-12-20 19:13:05
【问题描述】:

我是 SO 新手,也是编程新手。我目前正在尝试使用 Tkinter 和 Python 来创建 GUI。

我的问题与我在程序继续不间断运行时在终端中收到的错误消息有关。

我的相关代码如下:

class LoginWindow(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.grid()

        self.label1 = tk.Label(master, text='User Login')
        self.label1.grid(column=0, row=0, columnspan=3)
        self.label2 = tk.Label(master, text='User Name:')
        self.label2.grid(column=0, row=1, sticky=tk.E)
        self.label3 = tk.Label(master, text='Password:')
        self.label3.grid(column=0, row=2, sticky=tk.E)

        self.entry1 = tk.Entry(master)
        self.entry1.focus_set()
        self.entry1.grid(column=1, row=1, columnspan=2, padx=10, pady=5)
        self.entry2 = tk.Entry(master)
        self.entry2.config(show='*')
        self.entry2.grid(column=1, row=2, columnspan=2, padx=10, pady=5)

        self.button1 = tk.Button(master, text='New User', command=self.new_user_clicked)
        self.button1.grid(column=0, columnspan=2, row=3, padx=(20,0), pady=5)
        self.button2 = tk.Button(master, text='Login', command=self.login_clicked)
        master.bind('<Return>', self.login_clicked)
        self.button2.grid(column=2, row=3, padx=(0,20), pady=5)

此代码工作正常,成功登录后我销毁登录窗口并打开主应用程序窗口。但是我注意到,如果我在主窗口打开时按回车键(由于某种原因两次),我会在终端中收到此消息:

2016-12-20 10:43:31.718 Python[1053:71521] IMKInputSession    
presentFunctionRowItemTextInputViewWithEndpoint:completionHandler: : *NO* NSRemoteViewController to client    
NSError=Error Domain=NSCocoaErrorDomain Code=4099 "The connection from pid 0 was invalidated from this process."    
serInfo={NSDebugDescription=The connection from pid 0 was invalidated from this process.}, com.apple.inputmethod.EmojiFunctionRowItem

我注意到,在我构建的其他示例 GUI 中,以相同的方式按 Enter 不会给我这个错误。我怀疑我的键绑定做错了什么。此错误是否表明我的代码有任何问题?或者这只是我不应该担心的事情吗?我的主应用程序是从一个单独的类 App(tk.Frame) 运行的,这个登录窗口是一个 Toplevel() 小部件。

我不确定这是否重要,但我在 Mac 上运行它。

感谢您的帮助! 谢谢!

【问题讨论】:

  • 您已将Return 绑定到login_clicked,因此当您已经登录时可能会出错...我会用另一个检查用户是否是的函数替换绑定函数在尝试之前登录login_checked
  • 我不太确定我能否让它发挥作用。 login_clicked 有我的代码,用于针对我的数据库中的内容运行输入的凭据。我不确定如何在登录之前创建一个函数来查看我是否已登录。我想我可以重写我的代码运行方式。你有一个你想到的例子吗?绑定背后的想法是让它点击登录按钮,而不是移动到用鼠标点击。
  • 我认为self.login_clicked 的代码可能与这个问题有关,这肯定看起来不像普通的 python 回溯,所以它绝对不是源自您的 tkinter 代码。

标签: python tkinter


【解决方案1】:

问题可能是关键事件仍被记录并尝试运行self.login_clicked,即使您已经登录。

要解决此问题,您可以在 __init__ 中创建一个变量,如下所示:

self.is_logged_in = False

并且在self.login_clicked 方法中,您现在可以在按下按钮时检测用户是否已经登录。

if self.is_logged_in:
    print("You are already logged in")
else: 
    # code to execute when the user logs in
    self.is_logged_in = True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2017-01-29
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多