0

我正在尝试使用 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)等按钮。我很新编码并希望得到任何反馈,谢谢。

4

2 回答 2

0

欢迎来到 SO!

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

widget.bind(sequence, func, add)

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

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

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

可以在此处找到所有绑定的列表

于 2020-05-24T06:02:09.733 回答
0

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

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())
于 2020-05-24T06:04:25.240 回答