Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 功能';s If/else语句不起作用_Python_Tkinter - Fatal编程技术网

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