gpt4 book ai didi

python - 如何动态调整tkinter中的窗口大小为其内容 "autofit"?

转载 作者:行者123 更新时间:2023-12-01 08:51:54 25 4
gpt4 key购买 nike

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

我现在的问题是当框架更改时自动调整 tkinter 的窗口以适应其内容。我希望窗口的边框适合红色箭头后面的小部件,如 here 中所示。和 here (下面示例代码的输出),这样每个帧中就没有这样的“空白空间”。

该代码的工作方式是 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()

我的问题似乎与here中的问题类似。 ,但没有解决。

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

最佳答案

答案就在问题Tkinter Frame Resize中:由于两个框架都是网格化的,因此窗口将扩展以包含它们。

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

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

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

关于python - 如何动态调整tkinter中的窗口大小为其内容 "autofit"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53053663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com