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 循环中并不是一件好事。
我一直在研究 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 循环中并不是一件好事。