Как сделать так, чтобы в этой программе работал менеджер размещения? - PullRequest
0 голосов
/ 10 февраля 2019

Я поэкспериментировал с примером переключения страниц. Переключение между двумя кадрами в tkinter

Я пытаюсь использовать менеджер компоновки "place ()" для сортировки виджетов настраницу, но всякий раз, когда я ее использую, они просто не появляются на странице.Важно использовать его поверх пакета и сетки для программы, которую я хочу создать, как я могу заставить их работать?

Например, в следующем коде «Добро пожаловать» не отображается на «StartTest»"страница.

import tkinter as tk
import random

title_font=("Microsoft Jhenghei UI Light", 35)

class MathsApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(StartTest)
        self.title("Maths Revision App")
        self.geometry("800x500")
        self.configure(bg="white")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class StartTest(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        #welcome label
        tk.Label(self, text="Welcome!", font=title_font, bg="white", fg="#004d99").place(x=30, y=20)
        tk.Button(self, text="Open page one",
              command=lambda: master.switch_frame(PageOne)).pack()
        tk.Button(self, text="Open page two",
              command=lambda: master.switch_frame(PageTwo)).pack()

class PageOne(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="This is page one").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
              command=lambda: master.switch_frame(StartTest)).pack()

class PageTwo(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Label(self, text="This is page two").pack(side="top", fill="x", pady=10)
        tk.Button(self, text="Return to start page",
              command=lambda: master.switch_frame(StartTest)).pack()

if __name__ == "__main__":
    app = MathsApp()
    app.mainloop()

Я пытался удалить другие кнопки на странице, но ярлык "Добро пожаловать" все еще не отображался.

1 Ответ

0 голосов
/ 10 февраля 2019

Использование place является корнем проблемы, но реальная проблема заключается в комбинации трех сделанных вами вариантов:

  1. , которые вы используете pack на кнопках вStartTest но не на ярлыке,
  2. когда вы добавляете StartTest в корневое окно, вы не говорите ему заполнить окно,
  3. вы создаете ярлык "Welcome"перед созданием кнопок, чтобы они появлялись за кнопками.

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

Это можно проиллюстрировать, переместив ярлык приветствия в верхней части кнопок.Измените __init__ так, чтобы он в последний раз создавал метку:

class StartTest(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master, background="bisque")
        tk.Button(self, text="Open page one",
              command=lambda: master.switch_frame(PageOne)).pack()
        tk.Button(self, text="Open page two",
              command=lambda: master.switch_frame(PageTwo)).pack()
        tk.Label(self, text="Welcome!, blah blah blah blah", font=title_font, bg="white", fg="#004d99").place(x=30, y=20)

Вот так будет выглядеть ваше окно (я уменьшил размер окна до 300x200, чтобы изображение было небольшим):

enter image description here

Следующая часть проблемы состоит в том, что рамки не заполняют окно.Это можно легко проиллюстрировать, придав вашему StartTest уникальный цвет, чтобы он выделялся.

Измените функцию __init__, чтобы она запускалась следующим образом (обратите внимание на использование цвета «красный» в третьей строке):

class StartTest(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master, background="red")
        ...

Когда вы запустите его, обратите внимание, что естьнигде на экране нет красного цвета.Это намек на то, что мы не можем видеть кадр.В этом случае это происходит из-за того, что он уменьшился, чтобы соответствовать кнопкам, а другие опции заставляют кнопки полностью заполнять фон (то есть: нет отступов, которые позволили бы фону просвечивать).

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

self._frame.pack(fill="both", expand=True)

Со всеми этими изменениями окно теперь выглядит так:

enter image description here

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

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