使用Tkinter(Python)中的按钮更改变量的值

时间:2017-10-24 17:29:49

标签: python variables button tkinter

当我点击登录或注册的任何按钮时,我想更改变量,以便打开正确的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课程的完整代码或登录和注册课程,请告诉我。

1 个答案:

答案 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))但是此示例应该足以指向正确的方向。