Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将tkinter中的窗口大小动态调整为;“自动调整”;它的内容?_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 如何将tkinter中的窗口大小动态调整为;“自动调整”;它的内容?

Python 如何将tkinter中的窗口大小动态调整为;“自动调整”;它的内容?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我目前正在使用tkinter开发GUI,它允许用户在不同的框架之间导航。我的代码结构基于 我现在的问题是当一个框架被改变时,自动调整tkinter的窗口以适应它的内容。我希望窗口的边框与和中红色箭头后面的小部件相匹配(下面示例代码的输出),这样每个帧中就没有这样的“空白” 代码的工作方式是,方法show_frame允许在两个定义的帧之间进行更改 from tkinter import * class WindowController(Tk): def __init__(self,

我目前正在使用tkinter开发GUI,它允许用户在不同的框架之间导航。我的代码结构基于

我现在的问题是当一个框架被改变时,自动调整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()
我的问题似乎与中的问题相似,但没有解决


这是我在这里的第一个问题,因此非常感谢批评。

答案就在这个问题上:由于两个框架都是网格化的,所以窗口将扩展以包含这两个框架

要使窗口改变大小,一次只需对一帧进行网格化

要从窗口中删除框架并仍记住其属性,请使用:

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

这对我来说很有效,我现在理解了这个问题。非常感谢您的回复。