初始化一个充满 StringVar() 的板并使用 Tkinter 更新变量,Python

Initialise a board filled with StringVar() and update variables using Tkinter, Python

我正在实施十五岁的游戏,我意识到棋盘需要用字符串变量构建,以便稍后我可以更新它。我尝试使用以下内容: d 是用户输入的尺寸(比如 3-> 3x3)

board = []
def initialize():
    numbers = d * d - 1
    global board
    blankx = d - 1
    blanky = d - 1

    # Fill board with stringvars
    v = tk.StringVar()
    for j in range(d):
        row = []
        for i in range(d):
            v.set(str(numbers))
            row.append(v)
            numbers -= 1
            if numbers == 0:
                v.set('_')
        board.append(row) 

我得到的是全零板,它应该是这样的:

8 7 6

5 4 3

2 1 _

有什么建议吗?另外,关于更新这些变量?

您的问题是您只创建了一个 StringVar。您的问题陈述是您想要板上每个 space 一个,因此您需要在循环内创建变量:

for j in range(d):
    v = tk.StringVar()
    ...

通常,您会使用一个按钮,在按下时向一个常用函数发送某种标识,然后更新它以及您想要执行的任何其他操作。一个简单的例子。

"""store the variable in a dictionary whose key is the 
   row and column number
"""
import sys
if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
else:
    import tkinter as tk     ## Python 3.x

from functools import partial

root=tk.Tk()

def callback(key):
    if variables_dict[key].get() == "_":
        variables_dict[key].set("Pushed")
    else:
        variables_dict[key].set("Error")

variables_dict={}
for j in range(3):
    for k in range(5):
        v = tk.StringVar()

        ## send same key to the callback function and use as
        ## dictionary's key
        key="%02d-%02d" % (j, k) 
        ## no need to keep a reference to the Button's class
        ## instance & all of not used modules within it
        tk.Button(root, textvariable=v,
                  command=partial(callback, key)).grid(row=j,
                  column=k, sticky="nsew")
        variables_dict[key]=v
        v.set('_')

root.mainloop()