Ваша основная проблема заключается в том, что из-за того, как вы вызываете Label
и Button
, иногда вы добавляете элемент в создаваемый Frame
, а иногда добавляете его в окно верхнего уровня:
mL = Label(text="Tic Tac Toe", ...)
sL = Label(text=gA, ...)
Button(self, font=("Comic Sans MS", "22"), ...)
Все они должны начинаться одинаково:
mL = Label(self, text="Tic Tac Toe", ...)
sL = Label(self, text=gA, ...)
Button(self, font=("Comic Sans MS", "22"), ...)
Ниже приведена моя переработка вашего кода с этим изменением, а также некоторые другие модификации, чтобы избавиться от глобальных интерфейсов интерфейса и сделать ихчасть объекта:
from tkinter import *
TITLE_FONT = ("Comic Sans MS", "44")
BUTTON_FONT = ("Comic Sans MS", "22")
ANNOUNCER_FONT = ("Comic Sans MS", "20")
# Create Board Class
class Board(Frame):
''' Create Tic-Tac-Toe Game Board '''
# Constructor
def __init__(self, master):
super().__init__(master)
self.buttons = [None] * 9
self.sL = None
self.create_widgets()
self.pack()
# Create Widgets (buttons, labels, etc.)
def create_widgets(self):
# main label
Label(self, text="Tic Tac Toe", font=TITLE_FONT, padx=50, pady=50).grid(row=0, columnspan=3)
# game announcer
self.sL = Label(self, text="X Goes First", font=ANNOUNCER_FONT)
self.sL.grid(row=1, columnspan=3)
# buttons
for r in range(3): # row variable
for c in range(3): # column variable
self.c_button(r * 3 + c, r + 2, c)
# Create the button and appends to buttons list
def c_button(self, index, r, c):
self.buttons[index] = Button(self, font=BUTTON_FONT, width=5, height=1, command=lambda: self.button_press(index))
self.buttons[index].grid(row=r, column=c)
# Act when Button is pressed (for testing, changes color to red and adds text)
def button_press(self, index):
self.buttons[index].configure(bg="red", text="press")
self.sL['text'] = index
# Create the GUI
tk = Tk()
tk.title("Tic Tac Toe")
board = Board(tk)
tk.mainloop()