Как динамически настроить размер окна в tkinter, чтобы «автоподбор» его содержимого? - PullRequest
0 голосов
/ 29 октября 2018

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

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

Код работает так, что метод show_frame допускает изменение между двумя определенными кадрами.

from tkinter import *


class WindowController(Tk):

    def __init__(self, *args, **kwargs):

        Tk.__init__(self, *args, **kwargs)

        container = Frame(root)
        container.grid()

        self.frames = {}

        for F in (FirstWindow, SecondWindow):
            frame = F(parent=container, controller=self)

            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(FirstWindow)

        self.destroy()

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class FirstWindow(Frame):

    def __init__(self, parent, controller):

        self.controller = controller
        self.parent = parent

        Frame.__init__(self, parent)

        # Widgets:

        # "Do Nothing" Button
        self.Title0 = Button(self, text='Do nothing')
        self.Title0.grid(row=0, column=0)

        # "Do Nothing" Button
        self.Title1 = Button(self, text='Do Nothing')
        self.Title1.grid(row=1, column=0)

        # Change Frame Button
        self.Title2 = Button(self, text='To Second Window', command=lambda: self.controller.show_frame(SecondWindow))
        self.Title2.grid(row=2, column=0)


class SecondWindow(Frame):

    def __init__(self, parent, controller):

        self.controller = controller
        self.parent = parent

        Frame.__init__(self, parent)

        # Widgets:

        # "Do Nothing" Button
        self.Title0 = Button(self, text='Do nothing')
        self.Title0.grid(row=0, column=0)

        # "Do Nothing" Button
        self.Title1 = Button(self, text='Do Nothing')
        self.Title1.grid(row=0, column=1)

        # Change Frame Button
        self.Title2 = Button(self, text='To First Window', command=lambda: self.controller.show_frame(FirstWindow))
        self.Title2.grid(row=0, column=2)



if __name__ == "__main__":
    root = Tk()
    root.resizable(width=False, height=False)
    app = WindowController()
    app.mainloop()

Кажется, моя проблема похожа на проблему в здесь , но она не была решена.

Это мой первый вопрос здесь, поэтому критику очень ценят.

1 Ответ

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

Ответ находится в вопросе Изменение размера кадра Tkinter : Поскольку оба кадра имеют сетку, окно расширится и будет содержать их оба.

Чтобы окно изменило размер, вам нужно иметь только один кадр за раз.

Чтобы удалить рамку из окна и все еще запомнить ее атрибуты, используйте:

frame.grid_remove()

Чтобы снова отобразить кадр, используйте:

frame.grid()  # Will remember grid settings

Этот код работает, но вы, вероятно, можете улучшить его красоту:

class WindowController(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(root)
        container.grid()
        self.frames = {}

        for F in (FirstWindow, SecondWindow):
            frame = F(parent=container, controller=self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
            frame.grid_remove()     # Remove all frames

        self.show_frame(FirstWindow)
        self.destroy()

    def show_frame(self, cont):
        for fme in self.frames:     # Remove all frames
            self.frames[fme].grid_remove()
        frame = self.frames[cont]
        frame.grid()        # Display frame
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...