【问题标题】:Python/TkInter - Method to find which button was pressed out of a grid of buttons made by a for loopPython / TkInter - 从for循环制作的按钮网格中查找哪个按钮被按下的方法
【发布时间】:2020-09-10 21:28:11
【问题描述】:

我正在尝试使用 Tkinter 和 Python 进行一个非常简单的 Othello 迭代并有一个想法,但是我不知道一种方法来检索按下哪个按钮(通过整数?)。我使用

制作了一个按钮网格
for x in range(8):
    for y in range(8):
        btn = Button(frame)
        buttons.append(btn)
        btn.grid(column=x, row=y, sticky=N+S+E+W)
        btn.config(bg='green2')

我打算在按下时配置按钮,并通过添加和减去按钮的值来检查所有 8 个方向,以找到左侧 (-8)、右上角 (+7) 等的按钮。 我对编码很陌生,希望得到任何反馈,谢谢。

【问题讨论】:

标签: python button tkinter grid othello


【解决方案1】:

欢迎来到 SO!

您可以在 tkinter 中的任何小部件上创建绑定,语法为:

widget.bind(sequence, func, add)

因此,对于您的示例,您可以为每个按钮创建一个绑定,并传递 x 和 y 值作为参数来跟踪目标函数中的哪个按钮。像这样的:

btn.bind("<Button-1>", lambda x=x, y=y: print(x, y))

这将打印网格中每个按钮的坐标,然后您可以将打印语句替换为您想要的任何功能。

可以找到所有绑定的列表here

【讨论】:

  • 通常您不会将bind 用作按钮。该按钮有一个command 选项,用于为按钮分配功能。
  • 啊,你是对的,但我假设 command 选项只是进行绑定的快捷方式,所以我想我会尝试为任何小部件教授通用解决方案只有按钮。但是对于这个问题,最好只使用command 选项来回答,你是对的。
  • 它不仅仅绑定到按钮点击。它处理按钮按下、按钮释放以及通过键盘调用按钮。
  • 哦,好吧!这很有趣,我可以在任何地方找到更多相关信息吗?
【解决方案2】:

您不必像我所做的那样将整个应用程序包装在一个类中,甚至不必使用静态方法。关键是您有某种回调函数,当按下按钮时会触发该函数。作为回调函数调用的一部分,您还将按下的按钮对象的引用传递给回调。还有其他方法可以做到这一点,但我认为传递对按钮本身的引用是最有意义的:

import tkinter as tk


class Application(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("Buttons")
        self.resizable(width=False, height=False)

        number_of_rows = 8
        number_of_columns = 8

        for y in range(number_of_rows):
            for x in range(number_of_columns):
                button = tk.Button(self, text=f"{x}, {y}")
                button.config(command=lambda button=button: Application.on_button_click(button))
                button.grid(column=x, row=y)

    @staticmethod
    def on_button_click(button):
        button.config(bg="green")
        print(f"You clicked on {button['text']}")


def main():

    application = Application()
    application.mainloop()

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

【讨论】:

    最近更新 更多