Не могу добавить кнопку с сеткой в ​​список в tkinter - PullRequest
0 голосов
/ 01 декабря 2018

Я хотел бы расположить такие кнопки с помощью tkinter: Screenshot

Это работает со следующим кодом:

from tkinter import *

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

btn = []

def btnClicked (btnNum):
    print(btnNum)

b=0
for a in range(9):
    if(a%3 == False):
        b = b+1
    btn.append(Button(root, text="", command = lambda c=a: btnClicked(c), height = 10, width = 20).grid(row = a-3*(b-1), column=b))

root.mainloop()

Однако для выполнениядействие над этими кнопками, мне нужно упаковать их, например:

from tkinter import *

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

btn = []

def btnClicked (btnNum):
    print(btnNum)
    btn[btnNum]["text"] = "X"

b=0
for a in range(9):
    if(a%3 == False):
        b = b+1
    btn.append(Button(root, text="", command = lambda c=a: btnClicked(c), height = 10, width = 20).grid(row = a-3*(b-1), column=b))
    btn[a].pack()

root.mainloop()

Когда я запускаю этот код, я получаю следующую ошибку:

AttributeError: объект 'NoneType'не имеет атрибута 'pack'

Пока этот код работает, как мне хотелось бы, когда я не размещаю кнопки в сетке, например:

from tkinter import *

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

btn = []

def btnClicked (btnNum):
    print(btnNum)
    btn[btnNum]["text"] = "X"

b=0
for a in range(9):
    if(a%3 == False):
        b = b+1
    btn.append(Button(root, text="", command = lambda c=a: btnClicked(c), height = 10, width = 20))
    btn[a].pack()

root.mainloop()

Как можноЯ избавляюсь от ошибки во втором примере кода или выравниваю кнопки в сетке в третьем примере соответственно?

1 Ответ

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

Вот проблемы с вашим кодом и их решения.

  1. Вам не нужно использовать две переменные a и b ,Вы можете сделать это только с одним, используя модуль (a // 3) и остаток (a% 3).

  2. Если вы когда-либораспечатав список btn, вы сразу поймете проблему.Он состоит из None только потому, что вы добавляете после выполнения операции grid на кнопках, которая возвращает None.Вам нужно сначала добавить виджет, а затем «сетку» его.

Итак, вот рабочий код.

from tkinter import *

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

btn = []

def btnClicked(btnNum):
    print(btnNum)
    btn[btnNum]["text"] = "X"

for a in range(9):
    btn.append(Button(root, text="", command = lambda c=a: btnClicked(c), height = 10, width = 20))
    btn[-1].grid(row = a%3, column=a//3)

root.mainloop()

enter image description here

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