【问题标题】:tkinter >> how to get button references?tkinter >> 如何获取按钮引用?
【发布时间】:2014-02-07 05:16:01
【问题描述】:

我目前正在尝试使用 Python 和 tkinter 创建战舰游戏。 我需要声明 100 个按钮(每个玩家可以触发的位置一个),我发现我可以这样做以将它们放在 10x10 的网格中,同时还使用变量 buttons_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 个参数: 它可以是创建该按钮时附加到 COORDS_LIST 的值,也可以是按钮的“列”和“行”值。 那么我该怎么做,或者如何在放置一个按钮后获得它的行/列??

【问题讨论】:

    标签: python button tkinter


    【解决方案1】:

    我想你想要这样的东西:

    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()
    

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

    buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y)
    

    基本上,它做了两件事:

    1. 使用lambda,它为当前按钮的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))
    

    但是,为了提高代码的清晰度,我将其单独放置。

    【讨论】:

    • 所以当您拥有 lambda x=c, y=r 时,它会永久存储 x 和 y 值吗?
    • @RSerrao - 是的,对于那个功能。我在上面向您展示的内容被认为是更“高级”的 Python 编码。不应该,因为这个概念很简单。 x=cc 设置为lambdax 参数的默认值。同样的概念适用于y=r。当函数被调用时,这些默认值被发送到fire_here
    • 谢谢!比我在事件和 event.widget 中找到的另一个解决方案要简单得多...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多