Python 3 - Создать глобальную кнопку с именем из строки Tkinter - PullRequest
0 голосов
/ 17 декабря 2018

Хорошо, поэтому я начал программировать Сапер.Для этого мне нужно переменное количество кнопок (или я должен использовать что-то другое).Итак, я получил две петли, которые должны создать кнопку с именем.Но мне нужны кнопки, конечно, чтобы иметь другие имена.Итак, первая кнопка = 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()

1 Ответ

0 голосов
/ 17 декабря 2018

Вы никогда не должны создавать такие переменные.Это делает ваш код очень трудным для чтения, очень сложным для отладки.

Вместо этого сохраняйте виджеты в списке или словаре.Поскольку вы хотите ссылаться на них по имени, лучше всего работает словарь:

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 (или grid или place) в отдельном операторе, из которого вы создаете кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...