【问题标题】:Tkinter button command argumentTkinter 按钮命令参数
【发布时间】:2015-11-29 01:55:30
【问题描述】:

我一直在研究 tkinter 和 python,因为我对 GUI 非常感兴趣,并认为这将是一个很好的起点。我经历了一些很好的教程,比如新波士顿系列和一两个那里来掌握基础知识。现在我正试图通过一个按钮传递一个“参数”,以便我的程序继续执行我的 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()

【问题讨论】:

    标签: python-3.x tkinter tk


    【解决方案1】:

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

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

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

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

    附: 比较字符串时,你应该说

    if selection1 == "Beer":
    

    不是

    if selection1 is "Beer":
    

    is 测试身份不相等,您想测试相等。

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

    另外由于 selection1 是函数beer 中的局部变量,它不起作用,你需要将其声明为全局变量

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

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

    【讨论】:

    • 感谢一百万的输入。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2023-02-24
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2019-05-10
    • 2021-07-08
    相关资源
    最近更新 更多