Кадр Tkinter, отображаемый за пределами родительского кадра

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

class Window:
def __init__(self, root):
    #configure the window as root
    self.root = root

    #create a canvas
    self.canvas = Canvas(self.root, bg="white", width=500, height=300).grid(row=0, column=0, rowspan=2)

    #create two frames to the right of the canvas for entering letters and displaying wrong guesses
    self.wrong_guess_frame = Frame(self.root, bg="red", width=150, height=150).grid(row=0, column=1)
    self.entry_frame = Frame(self.root, bg="green", width=150, height=150).grid(row=1, column=1)

    #create a title label for the wrong answers and a frame in which to sit it
    self.wrngguess_title_frame = Frame(self.wrong_guess_frame, bg="blue",width = 100).grid()
    self.wrngguess_title = Label(self.wrong_guess_frame, text="Wrong Guesses:").grid()

Последние две строки - вот с чем у меня проблемы. self.wrngguess_title появляется не в wrong_guess_frame но в нижней части окна, и я не могу понять, что является причиной этого.

Любая помощь будет оценена. ТИА

2 ответа

self.wrong_guess_frame НЕ относится ни к какому кадру; эта переменная на самом деле None, возвращаемое значение .grid() метод, который вы применили к кадру после того, как вы его создали. А также None, как первый параметр любого конструктора виджета, интерпретируется как ссылка на корневое окно.

Вы должны сделать создание виджета и grid/pack как два отдельных оператора, если вы хотите, чтобы переменная ссылалась на виджет:

self.wrong_guess_frame = Frame(self.root, bg="red", width=150, height=150)
self.wrong_guess_frame.grid(row=0, column=1)

Кажется, что на основании того, что вы указали в вопросе, все, что вам нужно сделать, это указать row и column быть такой же как рамка, вот так:

    self.wrngguess_title = Label(self.wrong_guess_frame, text="Wrong Guesses:").grid(row=0, column=1)
    self.wrngguess_title_frame = Frame(self.wrong_guess_frame, bg="blue",width = 100).grid(row=0, column=1)

Предыдущий код дает следующий результат: Результат

Но если вы хотите немного сдвинуть строку, используйте следующий фрагмент:

self.wrngguess_title_frame = Frame(self.wrong_guess_frame, bg="blue",width = 100).grid(row=0, column=1, pady=(25,10))

Который дает этот результат: Результат

Надеюсь, это поможет вам. Это то, что я понял, вы хотели от вашего вопроса.

Другие вопросы по тегам