如何制作一系列按钮,这些按钮可在使用Tkinter单击时更改文本

库尔特·皮克(Kurt Peek)

我正在尝试使用Tkinter为Tic Tac Toe的游戏实现一个简单的GUI。第一步,我试图制作一系列按钮,这些按钮从未标记变为单击时带有“ X”标记。我尝试了以下方法:

import Tkinter as tk

class ChangeButton:

    def __init__(self, master, grid=np.diag(np.ones(3))):
        frame = tk.Frame(master)
        frame.pack()
        self.grid = grid
        self.buttons = [[tk.Button()]*3]*3

        for i in range(3):
            for j in range(3):
                self.buttons[i][j] = tk.Button(frame, text="", command=self.toggle_text(self.buttons[i][j]))
                self.buttons[i][j].grid(row=i, column=j)

    def toggle_text(self, button):
        if button["text"] == "":
            button["text"] = "X"


root = tk.Tk()
root.title("Tic Tac Toe")

app = ChangeButton(root)

root.mainloop()

但是,结果窗口如下所示:

在此处输入图片说明

并且单击时按钮不会改变。任何想法为什么这不起作用?

tobias_k

主要的问题是,使用时command=self.toggle_text(self.buttons[i][j])),您将调用回调函数,并将其结果绑定command. Instead, you have to bind the function itself to命令, or alambda`,该命令将使用正确的参数来调用该函数。一个简单的方法是这样的:

command=lambda: self.toggle_text(self.buttons[i][j])  # won't work!

但这在循环内部不起作用,因为在执行函数时(即循环之后)里面的变量lambda进行求值,即并且为每个函数最后一个值。有关更详细的说明,请参见例如此处解决此问题的一种方法是将这些变量声明为的参数,同时使用循环中的当前值作为其默认值,即这样,并且在声明函数时(而不是在调用函数时)进行求值。ijlambdalambda i=i, j=j: ...ij

command然后,和周围的循环将如下所示:

    for i in range(3):
        for j in range(3):
            self.buttons[i][j] = tk.Button(frame, text="", 
                    command=lambda i=i, j=j: self.toggle_text(self.buttons[i][j]))
            self.buttons[i][j].grid(row=i, column=j)

初始化self.buttons列表的方式还有另一个问题,与第一个问题无关这样[[tk.Button()]*3]*3,该列表将包含对同一列表的三个引用,每个引用均包含对同一按钮的三个引用参见例如此处以进行更深入的讨论。同样,您完全不需要初始化列表中的按钮,因为您随后在循环中进行了设置。我建议改用嵌套的列表理解:

    self.buttons = [[None for _ in range(3)] for _ in range(3)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

单击一系列按钮以满足javascript中的条件

如何管理一系列单选按钮的事件?

单击时,如何更改一系列div中每个单独的div的类?

如何使用噪音制作一系列彩色矩形?

如何制作一系列物品

通过在Excel VBA中单击每个按钮来创建一系列动态创建的按钮

如何使用jquery更改单击时输入按钮的文本?

使用jquery单击按钮时如何更改文本颜色?

每次单击按钮时如何更改文本?

Swiftui foreach 在一系列按钮上循环

将一系列 Bootstrap 按钮居中

我正在使用 jQuery 使用按钮移动容器内的一系列 div

如何让按钮在一系列点击后恢复到原来的状态

如何在pygame中制作一系列坐标?

使用命令按钮在Excel中对一系列值/数字进行宏过滤

单击时如何更改文本和按钮图像(或按钮)

单击按钮时如何更改按钮的文本?-迅捷

在 tkinter 上复制标签并更改按钮单击时的文本?

Javascript如何为从PHP foreach循环创建的一系列按钮创建切换按钮

制作一系列方法

在python中使用Tkinter显示一系列接口

如何使用文本文件中的一系列grepped数据在gnuplot中制作一个箭头脚本

如何更改一系列绘图在ggplot中的标题?

如何更改另一个类中单击的按钮的文本?(Python-tkinter)

使用* ngFor使用materialize-css框架为angular2创建一系列单选按钮

单击按钮时如何更改按钮颜色

单击按钮时如何更改按钮的图标?

在使用dplyr :: mutate时如何编码一系列数字?

JS:如何在使用Math.random()时排除一系列值?