当我点击登录或注册的任何按钮时,我想更改变量,以便打开正确的tkinter窗口以创建一个要求登录或注册的窗口。当我运行此代码并单击注册时,它不会更改变量的值。我做错了什么? 此外,如果有更好的方式询问用户该做什么,请提及它。
x=3
def vall():
global x
x=0
def valr():
global x
x=1
main=Tk()
main.title("Karren")
row=Frame(main)
l=Button(main,text="Login",command=(lambda *args:vall))
l.pack(side=LEFT, padx=50, pady=50)
r=Button(main,text="Register",command=(lambda *args:valr))
r.pack(side=LEFT, padx=50, pady=50)
main.mainloop()
if x==1:
if __name__ == '__main__':
root = Tk()
root.title("Register")
ents = makeform(root, fields)
root.bind('<Return>', (lambda event, e=ents: fetch(e)))
b1 = Button(root,fg="orange",bg="white", text='Show', command=(lambda
e=ents: fetch(e)))
b1.bind("<Enter>",turnRed)
b1.pack(side=LEFT, padx=5, pady=5)
b2 = Button(root,fg="orange",bg="white", text='Quit',
command=root.destroy)
b2.bind("<Enter>",turnRed)
b2.pack(side=LEFT, padx=5, pady=5)
root.mainloop()
P.S.-如果你想查看这个gui课程的完整代码或登录和注册课程,请告诉我。
答案 0 :(得分:0)
您的代码存在一些问题。
第一个是如何设置按钮命令。您不需要为此实例使用lambda,因为您所做的只是调用函数。你不是想传递论据。
因此您需要更改命令:
l=Button(main,text="Login",command=(lambda *args:vall))
r=Button(main,text="Register",command=(lambda *args:valr))
要:
l=Button(main,text="Login",command=vall)
r=Button(main,text="Register",command=valr)
第二个问题与您如何设置if
语句有关。目前,if
语句仅在程序开始时运行一次。因此,您需要做的是将if语句移动到自己的函数中,并在变量x
更改后运行该函数。
这样的事情应该做:
def check_and_start():
if x==1:
main.destroy() # added to remove the other window before you start a new tkinter instance.
if __name__ == '__main__':
root = Tk()
root.title("Register")
ents = makeform(root, fields)
root.bind('<Return>', (lambda event, e=ents: fetch(e)))
b1 = Button(root,fg="orange",bg="white", text='Show', command=(lambda
e=ents: fetch(e)))
b1.bind("<Enter>",turnRed)
b1.pack(side=LEFT, padx=5, pady=5)
b2 = Button(root,fg="orange",bg="white", text='Quit',
command=root.destroy)
b2.bind("<Enter>",turnRed)
b2.pack(side=LEFT, padx=5, pady=5)
root.mainloop()
话虽如此,您需要更改功能vall()
和valr
才能调用该功能。
应该是这样的:
def vall():
global x
x=0
check_and_start() # runs the check function needed to read the updated x variable.
def valr():
global x
x=1
check_and_start()
你所有的代码应该是这样的:
from tkinter import *
x=3
def check_and_start():
if x==1:
main.destroy()
if __name__ == '__main__':
root = Tk()
root.title("Register")
ents = makeform(root, fields)
root.bind('<Return>', (lambda event, e=ents: fetch(e)))
b1 = Button(root,fg="orange",bg="white", text='Show', command=(lambda
e=ents: fetch(e)))
b1.bind("<Enter>",turnRed)
b1.pack(side=LEFT, padx=5, pady=5)
b2 = Button(root,fg="orange",bg="white", text='Quit',
command=root.destroy)
b2.bind("<Enter>",turnRed)
b2.pack(side=LEFT, padx=5, pady=5)
root.mainloop()
def vall():
global x
x=0
check_and_start()
def valr():
global x
x=1
check_and_start()
main=Tk()
main.title("Karren")
row=Frame(main)
l=Button(main,text="Login",command=vall)
l.pack(side=LEFT, padx=50, pady=50)
r=Button(main,text="Register",command=valr)
r.pack(side=LEFT, padx=50, pady=50)
main.mainloop()
请记住if
语句中的一些内容由于缺少代码而无法验证(ents = makeform(root, fields)
)但是此示例应该足以指向正确的方向。