Виджеты не отображаются в графическом интерфейсе Tkinter - PullRequest
0 голосов
/ 21 ноября 2018

Я создал код для отображения сетки кнопок 3х3 для программы Tic-Tac-Toe, которую я разрабатываю.Сетка работала раньше, но когда я пытался поместить код в класс, я просто получаю пустой экран, когда пытаюсь запустить программу.Это мой код:

from tkinter import *

buttons = {".!frame.!button": 0,
           ".!frame.!button2": 1,
           ".!frame.!button3": 2,
           ".!frame.!button4": 3,
           ".!frame.!button5": 4,
           ".!frame.!button6": 5,
           ".!frame.!button7": 6,
           ".!frame.!button8": 7,
           ".!frame.!button9": 8,
           }

class GameBoard:

    def __init__(self, master):
        self.field = Frame(master)
        self.field.grid

        self.b1 = Button(self.field, text="-")
        self.b1.bind("<Button-1>", self.setfield)
        self.b1.grid(row=0, column=0)

        self.b2 = Button(self.field, text="-")
        self.b2.bind("<Button-1>", self.setfield)
        self.b2.grid(row=0, column=1)

        self.b3 = Button(self.field, text="-")
        self.b3.bind("<Button-1>", self.setfield)
        self.b3.grid(row=0, column=2)

        self.b4 = Button(self.field, text="-")
        self.b4.bind("<Button-1>", self.setfield)
        self.b4.grid(row=1, column=0)

        self.b5 = Button(self.field, text="-")
        self.b5.bind("<Button-1>", self.setfield)
        self.b5.grid(row=1, column=1)

        self.b6 = Button(self.field, text="-")
        self.b6.bind("<Button-1>", self.setfield)
        self.b6.grid(row=1, column=2)

        self.b7 = Button(self.field, text="-")
        self.b7.bind("<Button-1>", self.setfield)
        self.b7.grid(row=2, column=0)

        self.b8 = Button(self.field, text="-")
        self.b8.bind("<Button-1>", self.setfield)
        self.b8.grid(row=2, column=1)

        self.b9 = Button(self.field, text="-")
        self.b9.bind("<Button-1>", self.setfield)
        self.b9.grid(row=2, column=2)

    def setfield(self, event):
        print(buttons[str(event.widget)])



root = Tk()

board = GameBoard(root)

root.mainloop()

Может ли кто-нибудь помочь мне выяснить, почему я получаю пустой кадр при запуске программы?

1 Ответ

0 голосов
/ 21 ноября 2018

Может ли кто-нибудь помочь мне выяснить, почему я просто получаю пустой кадр при запуске программы?

Это потому, что вы не добавляете его в окно.Рассмотрим этот код:

self.field.grid

Это абсолютно ничего не делает.Чтобы окно появилось, вы должны вызвать функцию:

self.field.grid()

По моему мнению, класс никогда не должен вызывать grid или pack или place для себя.Это должна быть работа звонящего.Это хорошая привычка, потому что это способствует повторному использованию кода.

Лично я удалил бы эту строку и изменил бы пару последних строк следующим образом:

board = GameBoard(root)
board.grid() # or board.pack(...)

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

self.b1 = Button(self.field, text="-", command=lambda: setfield(1))

При этом ваш обратный вызов будет вызываться с параметром 1, и вам не нужно будет выполнять какой-либо поиск.

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