我想在tkinter中创建一个简单的图形用户界面,它由笔记本框架和每个标签页内的几个框架组成,假设我想在每个标签页内创建2个标签框架,跨越100%的窗口宽度和50%的窗口高度。
Screen layout
我将有更多的框架/元素内,我想采取x%的窗口宽度/高度。
我读到tkinter gui应该在调整窗口大小时自动调整大小,但我无法让它工作。
1.如何将框架设置为100%的窗口宽度和(例如)50%的窗口高度?
1.我如何使框架居中,这样它就不会粘在左上角?
我不知道如何用网格布局管理器和文档说,它应该使用过包。
我的代码示例:
import tkinter as tk
from tkinter import ttk, Tk
root = Tk()
root.geometry('1200x800')
root.title("Test")
tab_frame = ttk.Notebook(root)
tab_frame.grid()
####### change Notebook size in case main window changes
def conf(event):
tab_frame.config(height=root.winfo_height(), width=root.winfo_width())
# without this you cannot resize frames of the notebook by grid(sticky) or width/height !
return
root.bind("<Configure>",conf)
#######
s1 = ttk.Style()
s1.configure('test_red.TFrame', background='red')
s2 = ttk.Style()
s2.configure('test_green.TFrame', background='green')
s3 = ttk.Style()
s3.configure('test_blue.TFrame', background='blue')
tab1 = ttk.Frame(tab_frame, height=100, width=100, style='test_red.TFrame')
tab1.grid()
tab2 = ttk.Frame(tab_frame, height=100, width=100, style='test_blue.TFrame')
tab2.grid()
tab_frame.add(tab1, text='Tab1')
tab_frame.add(tab2, text='Tab2')
### frames in tab
label_frame1 = ttk.Labelframe(tab1, text='Label1', width=100, height=100, style='test_green.TFrame')
label_frame1.grid()
#label_frame.grid(sticky='e') # sticky does not work in any combination
label_frame2 = ttk.Labelframe(tab1, text='Label2', width=100, height=100, style='test_blue.TFrame')
label_frame2.grid()
root.mainloop()
3条答案
按热度按时间efzxgjgh1#
首先,您可以使用
tab_frame.pack(fill="both", expand=1)
代替.grid()
,然后您不需要绑定<Configure>
事件来调整tab_frame
的大小。其次,您可以使用
rowconfigure()
和columnconfigure()
使两个LabelFrame
水平和垂直填充。您可以在两个LabelFrame上使用
place()
来实现相同的目标:l7mqbcuq2#
这是一个简化的可调整大小的笔记本,有两个
labelframes
,每个button
包含一个button
。您遇到的问题是由于网格管理器默认值不可调整大小,这与其他管理器不同。
解决方法是使用函数
flexx
。flexx
是使栅格对象具有灵活性的必要函数。flexx
始终应用于labelframes
、frames
和root
或master
小部件等容器grid
是一个方便函数您应该能够使用任意数量的小部件填充每个
notebook
选项卡。需要记住的是,像
labelframe
这样的容器必须包含一些小部件才能存在。为了使
Tk
或'Toplevel
窗口灵活,将flexx
应用到root
至关重要。b5lpy0ml3#
只是关注了@TheLizzard的评论并写下了答案。
如果这解决了你的问题,然后标记为答案!