【问题标题】:Function's If/else statement not working函数的 If/else 语句不起作用
【发布时间】:2017-10-18 21:51:37
【问题描述】:

如果用户和密码相同,我试图在单击登录按钮时显示“登录成功/失败”文本。

我遇到的问题是,无论我们写什么用户和密码,它总是显示“成功”消息而不是失败消息。

我正在使用.get 来获取用户的输入并保存在变量中。

这是我的代码:

from tkinter import *

root = Tk()

label_name = Label(root, text="Username", fg="black")
label_password = Label(root, text="Password", fg="black")
input_name = Entry(root)
name = input_name.get()
input_password = Entry(root, show="*")
password = input_password.get()

label_name.grid(row=0, column=0, sticky=E)
label_password.grid(row=1, column=0, sticky=E)

input_name.grid(row=0, column=1)
input_password.grid(row=1, column=1)

checkbox = Checkbutton(root, text="Remember me")
checkbox.grid(columnspan=2, sticky=W)

login_button = Button(root, text="Login")
login_button.grid(row=1, column=2)


login_success = Label(root, text="Welcome", fg="black")
login_fail = Label(root, text="login fail", fg="black")


def login(event):
    if name == password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_true = Label(root, text="Welcome", fg="black")
        login_true.grid()
    elif name != password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()


login_button.bind("<Button-1>", login)

root.mainloop()

编辑: 我也使用了“command”属性,但结果相同:

def login():
    name = input_name.get()
    password = input_password.get()
    if name == password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_true = Label(root, text="Welcome", fg="black")
        login_true.grid()
    elif name != password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()


login_button = Button(root, text="Login", command=login)
login_button.grid(row=1, column=2)


root.mainloop()

编辑2: 通过添加新条件修复

def login():

    if input_name.get() == "" or input_password.get() == "":
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()
    elif input_name.get() == input_password.get():
        for widget in root.winfo_children():
            widget.grid_forget()
        login_true = Label(root, text="Welcome", fg="black")
        login_true.grid()
    elif input_name.get() != input_password.get():
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()

【问题讨论】:

  • 恐怕我不相信你。该编辑适用于我和另一位用户。你在两个文本框中输入了什么?如果它们没有不同,它就不会失败。
  • @EthanField 是的,我错了。修复它并立即工作,感谢您的帮助。
  • 我建议进行删除“[SOLVED]”的编辑,因为 Stack Exchange 不允许这样做,see here for why

标签: python tkinter


【解决方案1】:

它总是返回 true 的原因是因为您在两个本地命名空间中声明了 namepassword。一个在代码主体中,一个在函数login() 中。 namepasswordlogin() 函数中都等于 None,因为它们从来没有赋值。这意味着它们总是相等的并且总是返回True

把函数改成下面这样:

def login():
    if input_name.get() == input_password.get():
        for widget in root.winfo_children():
            widget.grid_forget()
        login_true = Label(root, text="Welcome", fg="black")
        login_true.grid()
    elif input_name.get() != input_password.get():
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()

Button 小部件上为&lt;Button-1&gt; 使用.bind() 往往是一个糟糕的主意。 Button 小部件有一个名为 command 的内置属性,可用于在单击时调用获取回调:

from tkinter import *

root = Tk()

def login():
    print("Login triggered")

login_button = Button(root, text="Login", command=login)
login_button.pack()

root.mainloop()

附带说明,如果您需要同时传递任何参数,那么执行此操作的最简单方法是使用 Python 的匿名函数 lambda。这可以像下面这样完成:

from tkinter import *

root = Tk()

def login(variable):
    print("Login triggered")

login_button = Button(root, text="Login", command=lambda: login("variable"))
login_button.pack()

root.mainloop()

【讨论】:

  • 我也使用了“command”属性并得到了相同的结果。我将看看使用 lambda 的第二种方法,从未见过。
  • @JoãoFróis 底部的两个部分更多地用于解决您以后可能遇到的问题。我已经解释了为什么它总是在我的答案顶部返回 true。
【解决方案2】:

我从未使用过 tkinter,但我想这是因为您在初始化 gui 时调用了 get 方法。 (name = input_name.get()) 相反,您应该只在用户单击按钮时调用它,该按钮位于 login 方法内。

from tkinter import *

root = Tk()

label_name = Label(root, text="Username", fg="black")
label_password = Label(root, text="Password", fg="black")
input_name = Entry(root)
input_password = Entry(root, show="*")

label_name.grid(row=0, column=0, sticky=E)
label_password.grid(row=1, column=0, sticky=E)

input_name.grid(row=0, column=1)
input_password.grid(row=1, column=1)

checkbox = Checkbutton(root, text="Remember me")
checkbox.grid(columnspan=2, sticky=W)

login_button = Button(root, text="Login")
login_button.grid(row=1, column=2)


login_success = Label(root, text="Welcome", fg="black")
login_fail = Label(root, text="login fail", fg="black")


def login(event):
    name = input_name.get()
    password = input_password.get()
    if name == password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_true = Label(root, text="Welcome", fg="black")
        login_true.grid()
    elif name != password:
        for widget in root.winfo_children():
            widget.grid_forget()
        login_false = Label(root, text="login fail", fg="black")
        login_false.grid()


login_button.bind("<Button-1>", login)

root.mainloop()

【讨论】:

  • 我也试过了,结果一样,不管输入什么我都会得到“欢迎”的文字!
  • 它正在工作!我很愚蠢,我没有在盒子上写任何东西就点击登录,假设它会失败,因为我什么也没写。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多