tkinter>>如何获取按钮引用?

2024-03-29 11:07:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python和tkinter创建一个战舰游戏。 我需要声明100个按钮(一个玩家可以发射的每个点对应一个),我发现我可以这样做,将它们放在一个10x10的网格中,同时还可以用变量button-dict存储对它们的引用

from tkinter import *
from tkinter import ttk

root = Tk()
board_frame = ttk.Frame(root, padding=5)
board_frame.grid(column=0,row=0)

COORDS_LIST = []
buttons_dict = {}

for r in range(1,11):
    for c in range(1,11):
        coord = str(r)+"_"+str(c)
        COORDS_LIST.append(coord)
        buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2")
        buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c)

root.mainloop()

这个代码创建了100个按钮,完全按照我的需要显示。当我想给他们每个人一个命令时,问题就开始了。我想要的是一个通用函数(对于这个问题,我们可以称之为“fire_here”),每次按下其中一个按钮时都会调用它,但我需要传递1个或2个参数: 它可以是创建该按钮时附加到“坐标”列表的值,也可以是按钮的“列”和“行”值。 那么,我该怎么做呢?或者,一旦一个按钮被放置了,我如何得到它的行/列??在


Tags: fromimportboardtkintercolumnrootcoords按钮
1条回答
网友
1楼 · 发布于 2024-03-29 11:07:20

我想你想要这样的东西:

from tkinter import *
from tkinter import ttk

root = Tk()
board_frame = ttk.Frame(root, padding=5)
board_frame.grid(column=0,row=0)

COORDS_LIST = []
buttons_dict = {}

###########################################
def fire_here(x, y):
    print("column:{}, row:{}".format(x, y))
###########################################

for r in range(1,11):
    for c in range(1,11):
        coord = str(r)+"_"+str(c)
        COORDS_LIST.append(coord)
        buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2")
        ###########################################################################
        buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y)
        ###########################################################################
        buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c)

root.mainloop()

我添加的所有内容都在评论框中。然而,重要的是:

^{pr2}$

基本上,它做两件事:

  1. 使用^{},它为当前按钮的command选项创建一个函数。此函数将在单击按钮时调用。

  2. 它接受当前的列和行(按钮在网格上的坐标)并将它们设置为函数的xy参数的默认值。此外,当函数被调用时,这些值将被发送到fire_here进行处理。


同样,你可以把它写在上面的行上,如下所示:

buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2", command=lambda x=c, y=r: fire_here(x, y))

不过,我把它放在自己的行中以提高代码的清晰度。在

相关问题 更多 >