我正在寻找一种方法让Tkinter Frames在调整大小时表现得有点像这样:
from Tkinter import *
w = Tk()
w.aspect(1,1,1,1)
w.mainloop()
所以我想在这里使用这段代码:
import Tkinter as tk
from Tkconstants import *
r=tk.Tk()
content_frame=tk.Frame(r,borderwidth=5,relief=GROOVE)
content_frame.grid(row=0,column=0,sticky=(N,S,E,W))
tk.Label(content_frame,text='content').pack()
pad_frame=tk.Frame(r,borderwidth=5,relief=GROOVE)
pad_frame.grid(row=1,column=0,sticky=(N,S,E,W))
tk.Label(pad_frame,text='-pad-').pack()
r.rowconfigure(0, weight=1)
r.rowconfigure(1, weight=1)
r.columnconfigure(0, weight=1)
r.mainloop()
它基本上创建了2个帧,一个应该保存一些内容(在我的应用程序中,这个帧包含一个可以调整大小的mathplotlib图),一个只是用于填充。
按照以下规则调整大小:
有什么想法吗?我已经阅读了一段时间的手册,似乎找不到合适的东西。
-Daniel
答案 0 :(得分:4)
至少有几种方法可以解决这个问题。最简单的IMO是让您的填充小部件成为内容小部件的容器,然后使用place
显式设置内容小部件的宽度和高度。这是place
优先于grid
或pack
的边缘情况之一。
在下面的示例中,我创建了一个函数,可以传入内容框架,填充框架和宽高比。然后,它通过宽高比和容器的大小来约束内容框架的大小。它将使内容窗口在X维度中填充容器,然后适当地设置高度。如果生成的窗口太高而不可见,则将最大高度设置为容器的高度,然后调整宽度。
我试图保持问题中的大部分代码完好无损,即使这并不是我通常会选择编码的方式。我给小部件设置了不同的颜色,因此更容易看到发生了什么。
import Tkinter as tk
from Tkconstants import *
r=tk.Tk()
def set_aspect(content_frame, pad_frame, aspect_ratio):
# a function which places a frame within a containing frame, and
# then forces the inner frame to keep a specific aspect ratio
def enforce_aspect_ratio(event):
# when the pad window resizes, fit the content into it,
# either by fixing the width or the height and then
# adjusting the height or width based on the aspect ratio.
# start by using the width as the controlling dimension
desired_width = event.width
desired_height = int(event.width / aspect_ratio)
# if the window is too tall to fit, use the height as
# the controlling dimension
if desired_height > event.height:
desired_height = event.height
desired_width = int(event.height * aspect_ratio)
# place the window, giving it an explicit size
content_frame.place(in_=pad_frame, x=0, y=0,
width=desired_width, height=desired_height)
pad_frame.bind("<Configure>", enforce_aspect_ratio)
pad_frame = tk.Frame(borderwidth=0, background="bisque", width=200, height=200)
pad_frame.grid(row=0, column=0, sticky="nsew", padx=10, pady=20)
content_frame=tk.Frame(r,borderwidth=5,relief=GROOVE, background="blue")
tk.Label(content_frame,text='content').pack()
set_aspect(content_frame, pad_frame, aspect_ratio=2.0/1.0)
r.rowconfigure(0, weight=1)
r.columnconfigure(0, weight=1)
r.mainloop()
如果包含窗口小部件的内容可以轻松调整到容器的大小,这将最有效。如果内部存在复杂的小部件布局,则当窗口缩小到其自然大小以下时,如果它们不适合,则某些小部件可能会被切断。
答案 1 :(得分:2)
您可以将函数绑定到包含内容和填充框架的<Configure>
的{{1}}事件。调整窗口大小时将触发Frame
事件。使用事件的width和height属性通过使用<Configure>
和rowconfigure
容器框架中需要两行和两列才能有方形内容框架。在高大的窗口中,您需要在第二行填充。对于宽窗口,您需要在第二列填充。
一个工作示例:
columnconfigure