Python 关于tkinter按钮的基本问题

Python 关于tkinter按钮的基本问题,python,user-interface,button,tkinter,Python,User Interface,Button,Tkinter,我对使用tkinter和GUI编程还不熟悉,所以这可能是一个非常基本的问题。无论如何,假设我有一组按钮供用户选择,我想要的是用户单击的所有按钮对象的列表。基本上,我想知道用户单击了哪些按钮。这里有一个很好的网站,介绍了Python事件,可以为您提供指导: 听起来你可能想要类似于复选框的东西,如果是这样的话: 在每个按钮上,您可以设置命令将其添加到已单击按钮的列表中 clicked = [] foo = Button(root, text='bar', command=lambda self:c

我对使用tkinter和GUI编程还不熟悉,所以这可能是一个非常基本的问题。无论如何,假设我有一组按钮供用户选择,我想要的是用户单击的所有按钮对象的列表。基本上,我想知道用户单击了哪些按钮。

这里有一个很好的网站,介绍了Python事件,可以为您提供指导:

听起来你可能想要类似于复选框的东西,如果是这样的话:


在每个按钮上,您可以设置命令将其添加到已单击按钮的列表中

clicked = []
foo = Button(root, text='bar', command=lambda self:clicked.append(self))

不确定语法是否正确,但这是基本思想。

下面是一个简单的示例,说明如何确定按钮是否已按下

import tkinter.ttk, functools

class Example(tkinter.Tk):

    def __init__(self, buttons):
        super().__init__()
        self.button_set = set()
        for button in range(buttons):
            button = tkinter.ttk.Button(self, text='Button '+str(button))
            button.pack()
            self.button_set.add(button)
        self.setup_buttons()
        self.bind('<Escape>', self.check_buttons)
        self.mainloop()

    def setup_buttons(self):
        for button in self.button_set:
            button['command'] = \
                functools.partial(setattr, button, 'pressed', True)
            button.pressed = False

    def check_buttons(self, event):
        for button in self.button_set:
            print('Button {} has{} been pressed.'.format(id(button),
                (' not', '')[button.pressed]))

if __name__ == '__main__':
    Example(5)
import tkinter.ttk,functools
类示例(tkinter.Tk):
定义初始化(自身,按钮):
super()。\uuuu init\uuuuu()
self.button_set=set()
对于范围内的按钮(按钮):
button=tkinter.ttk.button(self,text='button'+str(button))
button.pack()
self.button\u set.add(按钮)
self.setup_按钮()
self.bind(“”,self.check_按钮)
self.mainloop()
def设置按钮(自身):
对于self.button_集合中的按钮:
按钮['command']=\
functools.partial(设置属性,按钮“按下”,为真)
按钮按下=错误
def检查按钮(自身、事件):
对于self.button_集合中的按钮:
打印({}按钮已被按下。{})。格式(id(按钮),
('not','')【按钮按下】)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
示例(5)

运行代码时,您可以按
Escape
键在控制台中打印已按下的按钮。按下按钮会将其
pressed
属性设置为true,您可以获得已按下按钮的另一个打印输出。在编程上,您可以按照
check_buttons
方法中的示例来确定按钮是否被按下。

我通读了事件和绑定页面,我想这样做可以奏效:if myButton.bind(“”):返回按钮标签(如果有这样的方法)。但它似乎没有任何作用。有什么想法吗?我意识到我真正想要的是按钮的文本,所以我试着像这样使用lambda函数:button1.config(command=(lambda x:(clicked.append(x))(button1.cget(“text”))。这对我来说似乎很有意义,但出于某种原因,它会立即返回列表,即不等待用户单击。你知道为什么会这样吗?如果你输入的是button1.config(command=callback()),而不是button1.config(command=callback()),通常会出现这种情况。为了可读性,您可能需要取消函数的匿名性(即使其成为实际函数而不是lambda),这将有助于调试。