2015-11-29 121 views
1

我一直在寻找与python tkinter,因为我对GUI的认真感兴趣,并认为这将是一个很好的起点。我经历了一些很好的教程,比如新波士顿的设置和一两个Theres来抓住基本的东西。现在我正试图通过一个“论点”来传递一个“论点”,这样我的程序就会转向我的IF语句,而我没有快乐。Tkinter按钮命令参数

随函附上代码:

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() 

回答

2

好有很多事情在这里,所以我有几件事情,我认为会帮助你。

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

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

最后,解决你的问题:当你写command=beer()您再次调用该函数啤酒及其返回值的命令参数分配。当您使用Tkinter时,您必须仅将命令参数分配给函数名称,例如command=beer。但是,如果您必须传递参数,则可以使用lambda。例如:command=lambda: beer(arg1, arg2)

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

if selection1 == "Beer": 

if selection1 is "Beer": 

is试验身份不平等和你想测试平等。

编辑:你也应该unindent try在您的文件的顶部。

也因为选择1是在功能beer它不会工作一个局部变量,需要声明一个全局的

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

此外,你需要摧毁的同时,窗口或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循环,并在啤酒窗口上有一个按钮来回调主欢迎窗口,因为在while循环中放置两个主循环不会是件好事。

+0

感谢上百万的投入。 –