Tkinter 按钮命令参数

Tkinter button command argument

我一直在研究 python 的 tkinter,因为我对 GUI 非常感兴趣,并且认为它是一个很好的起点。我学习了好几个教程,比如 The New Boston set 和一两个教程来掌握基础知识。现在我试图通过一个按钮传递一个 'argument',这样我的程序将继续我的 IF 语句,但我很不高兴。

请查找附件代码:

  try:
    from tkinter import *
except ImportError:
    from Tkinter import *
eod = 'no'
selection = []
selection1 = 'nothing'
while eod != 'yes':

    def beer():
        selection.append('Beer')
        selection1 = 'Beer'
    def wine():
        selection.append('Wine')
    def whiskey():
        selection.append('Whiskey')

    welcomeGUI = Tk()
    welcomeGUI.geometry('400x200+100+200')
    welcomeGUI.title('Drinks Despenser')

    welcomLabel1 = Label(welcomeGUI, text='Drinks-O-Matic', font='Times 22 bold').grid(row=0,column=2)
    welcomLabel2 = Label(welcomeGUI, text='Please select drink', font='Times 16 bold').grid(row=1,column=2)


    beerButton = Button(welcomeGUI, text='Beer', font='Times 16 bold',command=beer()).grid(row=6,column=1)
    wineButton = Button(welcomeGUI, text='Wine', font='Times 16 bold').grid(row=6,column=2)
    whiskeyButton = Button(welcomeGUI, text='Whiskey', font='Times 16 bold').grid(row=6,column=3)

    if selection1 is 'Beer':
        welcomeGUI.destroy()
        beerGUI = Tk()
        beerGUI.geometry('400x200+100+200')
        beerGUI.title('Beer Despenser')

        beerGUI.mainloop()


    welcomeGUI.mainloop()

好的,这里发生了很多事情,所以我有几件事我认为会对你有所帮助。

您需要将 def 移出所有函数的 while 循环。它们应该只在文件的开头定义一次。

此外,您在调用 grid 方法后将变量分配给 Button 对象。该方法 returns None 所以你不应该这样做,因为你正在分配变量 None 而不是你想要的实际按钮对象。您应该单独将变量分配给按钮对象,然后再调用 varname.grid()

最后,解决您的问题:当您编写 command=beer() 时,您再次调用函数 beer 并将其 return 值 分配给命令范围。当您使用 Tkinter 时,您必须仅将函数名称分配给命令参数,例如 command=beer。然而,如果你必须给它传递参数,你可以使用 lambda。例如:command=lambda: beer(arg1, arg2)

P.S。 比较字符串时你应该说

if selection1 == "Beer":

不是

if selection1 is "Beer":

is 测试的是同一性而不是相等性,而您想测试相等性。

编辑:您还应该取消缩进文件顶部的 try

另外因为selection1是函数中的局部变量beer不会生效,需要声明为全局变量

def beer():
    global selection1
    selection.append('Beer')
    selection1 = 'Beer'

此外,您需要销毁window,否则while 循环中的if 语句不会运行。

def beer(window):
    global selection1
    selection.append('Beer')
    selection1 = 'Beer'
    window.destroy()

然后你需要像这样将 welcomeGUI Tk 实例传递给函数

beerButton = Button(welcomeGUI, text='Beer', font='Times 16 bold',command=lambda: beer(welcomeGUI)).grid(row=6,column=1)

最后一件事。我会一起删除 while 循环,并在啤酒 window 上有一个按钮来回叫主要的欢迎词 window 因为将两个主循环放在 while 循环中并不是一件好事。