Python 3-创建带有字符串TKINTER名称的全局按钮



好吧,所以我开始编程扫雷器。为此,我需要一个可变数量的按钮(或者我应该使用不同的东西)。因此,我得到了两个循环,应该创建一个带有名称的按钮。但是我当然需要按钮才能有其他名称。所以F.I。:第一个按钮= button_1第二个按钮= button_2...

我的代码如此:

class test(Tk):
   def __init__(self):
      self.frame_game = Frame(self)
      for i in range(1, height):
           for j in range(1, height):
               # here i need the button to be created

我尝试了:

globals()['Button_' + str(i) + str(j)] = Button(...)

但这是不起作用的,因为我需要一个全局的按钮。

我也尝试了

vars(self)['Button_' + str(i) + str(j)] = Button(self.frame_game, text='0').pack()

我以后包装标签:

self.frame_game.pack()

它不会抛出异常。

有人有一个主意吗?

编辑:有用!!!!代码只是没有进入循环。将其更改为

for i in range(0, height):

当然,还有J。工作代码在循环中如下:

vars(self)['Button_' + str(i) + str(j)] = Button(self.frame_game, text='0').pack()
  • 您可以按以下方式声明全局按钮:
  • 设置按钮的全局变量名称
global myBtn
myBtn = Button(root, text = "This is a global button")

谢谢Mohamed Elghobary

您绝不应该创建这样的变量。它使您的代码很难阅读,很难调试。

而是将小部件存储在列表或字典中。由于您想用名称引用它们,因此词典最有效:

self.buttons = {}
for i in range(1, height):
    for j in range(1, height):
        name = "Button_{}_{}".format(i,j)
        button = Button(...)
        button.pack()
        self.buttons[name] = button

使用上述内容,您稍后可以引用self.buttons["Button_1_1"]等按钮

另外,在您的代码中,您正在做类似Button(...).pack()之类的事情。.pack()返回None,因此您将所有变量设置为None。如果要保存对按钮的引用,则需要在创建按钮的单独语句中调用pack(或gridplace)。

最新更新