Кнопки Python tkinter не опустятся ниже ярлыков - PullRequest
0 голосов
/ 19 октября 2018

В настоящее время я работаю над простой игрой в крестики-нолики, чтобы узнать о возможностях графического интерфейса Python (я работаю с Tkinter).Я хочу разместить над кнопками надписи, как заголовок.Но когда я запускаю код, по какой-то причине кнопка появляется над ярлыками.Чтобы это исправить, я попытался изменить строку надписей так, чтобы она находилась над кнопкой ( mL row = 0, sL row = 1 и button row = 2 ), но когдаЯ сделал это, кнопка просто исчезла.

from tkinter import *    

# Create the GUI (set title)
tk = Tk()
tk.title("Tic Tac Toe")  # Create game announcer

gA = "X Goes First"
# Create Button List
buttons = []


# ---------------------------------------------------------------------------------------
# Create Board Class
class Board(Frame):
'''Creates Game Board'''

    # -----------------------------------------------------------------------------------
    # Constructor
    def __init__(self, master):
        super(Board, self).__init__(master)
        self.grid()
        self.create_widgets()

    # -----------------------------------------------------------------------------------
    # Creates Widgets (Buttons,labels,ext)
    def create_widgets(self):
        # main label
        mL = Label(text="Tic Tac Toe", font=("Comic Sans MS", "44"), padx=50, pady=50)
        mL.grid()
        # game announcer
        sL = Label(text=gA, font=("Comic Sans MS", "20"))
        sL.grid()
        # buttons
        r = 2  # row variable
        c = 0  # column variable
        self.c_button(0, r, c)

    # -----------------------------------------------------------------------------------
    # Creates the button and appends to buttons list
    def c_button(self, index, r, c):
        buttons.append(Button(self, font=("Comic Sans MS", "22"), width=5, height=1, command=lambda: self.button_press(index)))
        buttons[index].grid(row=r)
    # ------------------------------------------------------------------------------------
    # Acts when Button is pressed (for testing, changes color to red and adds text)
    def button_press(self,index):
        buttons[index].configure(bg="red",text="press")

# ---------------------------------------------------------------------------------------
# main
board = Board(tk)
tk.mainloop()

Я пытался сделать код максимально отслеживаемым.

1 Ответ

0 голосов
/ 19 октября 2018

Ваша основная проблема заключается в том, что из-за того, как вы вызываете 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()

enter image description here

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