Python 功能';s If/else语句不起作用
如果用户和密码相等,我试图在单击登录按钮时显示“登录成功/失败”文本 我遇到的问题是,无论我们编写的用户和密码是什么,它总是显示“成功”消息,而不是失败消息 我正在使用Python 功能';s If/else语句不起作用,python,tkinter,Python,Tkinter,如果用户和密码相等,我试图在单击登录按钮时显示“登录成功/失败”文本 我遇到的问题是,无论我们编写的用户和密码是什么,它总是显示“成功”消息,而不是失败消息 我正在使用.get获取用户的输入并保存变量 这是我的密码: from tkinter import * root = Tk() label_name = Label(root, text="Username", fg="black") label_password = Label(root, text="Password", fg="b
.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()
编辑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()
我从未使用过tkinter,但我想这是因为您在初始化gui时调用了
get
方法。(name=input\u 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()
从tkinter导入*
root=Tk()
label\u name=label(root,text=“Username”,fg=“black”)
label\u password=label(root,text=“password”,fg=“black”)
输入\名称=条目(根)
输入\密码=输入(根,show=“*”)
label_name.grid(行=0,列=0,粘滞=E)
label_password.grid(行=1,列=0,粘性=E)
输入_name.grid(行=0,列=1)
输入\u password.grid(行=1,列=1)
复选框=复选按钮(root,text=“记住我”)
复选框.grid(columnspan=2,sticky=W)
登录按钮=按钮(root,text=“login”)
登录按钮.grid(行=1,列=2)
登录成功=标签(root,text=“欢迎”,fg=“黑色”)
登录失败=标签(root,text=“登录失败”,fg=“黑色”)
def登录(事件):
name=input\u name.get()
password=input_password.get()
如果名称==密码:
对于root.winfo_children()中的小部件:
widget.grid_忘记()
login\u true=Label(root,text=“欢迎”,fg=“黑色”)
login_true.grid()
elif名称!=密码:
对于root.winfo_children()中的小部件:
widget.grid_忘记()
login\u false=标签(root,text=“登录失败”,fg=“黑色”)
login_false.grid()
登录按钮。绑定(“,登录)
root.mainloop()
我从未使用过tkinter,但我想这是因为您在初始化gui时调用了get
方法。(name=input\u 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()
从tkinter导入*
root=Tk()
label\u name=label(root,text=“Username”,fg=“black”)
label\u password=label(root,text=“password”,fg=“black”)
输入\名称=条目(根)
输入\密码=输入(根,show=“*”)
label_name.grid(行=0,列=0,粘滞=E)
label_password.grid(行=1,列=0,粘性=E)
输入_name.grid(行=0,列=1)
输入\u password.grid(行=1,列=1)
复选框=复选按钮(root,text=“记住我”)
复选框.grid(columnspan=2,sticky=W)
登录按钮=按钮(root,text=“login”)
登录按钮.grid(行=1,列=2)
登录成功=标签(root,text=“欢迎”,fg=“黑色”)
登录失败=标签(root,text=“登录失败”,fg=“黑色”)
def登录(事件):
name=input\u name.get()
password=input_password.get()
如果名称==密码:
对于root.winfo_children()中的小部件:
widget.grid_忘记()
login\u true=Label(root,text=“欢迎”,fg=“黑色”)
login_true.grid()
elif名称!=密码:
对于root.winfo_children()中的小部件:
widget.grid_忘记()
login\u false=标签(root,text=“登录失败”,fg=“黑色”)
login_false.grid()
登录按钮。绑定(“,登录)
root.mainloop()
它总是返回true的原因是您在两个本地名称空间中声明了name
和password
。一个在代码主体中,一个在函数login()
中<login()
函数中的code>name和password
都相等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()
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()
在
的按钮
小部件上使用.bind()
往往是个糟糕的主意<代码>按钮小部件有一个名为命令
的内置属性,可用于在单击时调用该属性以获取回调:
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
。这可以通过如下方式实现:
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()
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()
它总是返回true的原因是您在两个本地名称空间中声明了
name
和password
。一个在代码主体中,一个在函数login()
中<login()
函数中的code>name和password
都相等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()
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()
在
的按钮
小部件上使用.bind()
往往是个糟糕的主意<代码>按钮小部件有一个名为命令
的内置属性,可用于在单击时调用该属性以获取回调:
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
。这可以通过如下方式实现:
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()
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 Th