python-3.x tkinter -如何调整帧大小

ssgvzors  于 2023-02-14  发布在  Python
关注(0)|答案(3)|浏览(222)

我想在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()
efzxgjgh

efzxgjgh1#

首先,您可以使用tab_frame.pack(fill="both", expand=1)代替.grid(),然后您不需要绑定<Configure>事件来调整tab_frame的大小。
其次,您可以使用rowconfigure()columnconfigure()使两个LabelFrame水平和垂直填充。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry('1200x800')
root.title("Test")

tab_frame = ttk.Notebook(root)
tab_frame.pack(fill="both", expand=1) # used pack() instead of grid()

s = ttk.Style()
s.configure('test_red.TFrame', background='red')
s.configure('test_green.TFrame', background='green')
s.configure('test_blue.TFrame', background='blue')

tab1 = ttk.Frame(tab_frame, style='test_red.TFrame')
tab2 = ttk.Frame(tab_frame, style='test_blue.TFrame')

tab_frame.add(tab1, text='Tab1')
tab_frame.add(tab2, text='Tab2')

# make two LabelFrames to fill horizontally
tab1.columnconfigure(0, weight=1)
# make two LabelFrames to evenly fill vertically
tab1.rowconfigure((0,1), weight=1)

### frames in tab
label_frame1 = ttk.Labelframe(tab1, text='Label1', style='test_green.TFrame')
label_frame1.grid(sticky="nsew")

label_frame2 = ttk.Labelframe(tab1, text='Label2', style='test_blue.TFrame')
label_frame2.grid(sticky="nsew")

root.mainloop()

您可以在两个LabelFrame上使用place()来实现相同的目标:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry('1200x800')
root.title("Test")

tab_frame = ttk.Notebook(root)
tab_frame.pack(fill="both", expand=1) # used pack() instead of grid()

s = ttk.Style()
s.configure('test_red.TFrame', background='red')
s.configure('test_green.TFrame', background='green')
s.configure('test_blue.TFrame', background='blue')

tab1 = ttk.Frame(tab_frame, style='test_red.TFrame')
tab2 = ttk.Frame(tab_frame, style='test_blue.TFrame')

tab_frame.add(tab1, text='Tab1')
tab_frame.add(tab2, text='Tab2')

### frames in tab
label_frame1 = ttk.Labelframe(tab1, text='Label1', style='test_green.TFrame')
label_frame1.place(x=0, y=0, relwidth=1, relheight=0.5)

label_frame2 = ttk.Labelframe(tab1, text='Label2', style='test_blue.TFrame')
label_frame2.place(x=0, rely=0.5, relwidth=1, relheight=0.5)

root.mainloop()
l7mqbcuq

l7mqbcuq2#

这是一个简化的可调整大小的笔记本,有两个labelframes,每个button包含一个button
您遇到的问题是由于网格管理器默认值不可调整大小,这与其他管理器不同。
解决方法是使用函数flexx
flexx是使栅格对象具有灵活性的必要函数。
flexx始终应用于labelframesframesrootmaster小部件等容器
grid是一个方便函数
您应该能够使用任意数量的小部件填充每个notebook选项卡。
需要记住的是,像labelframe这样的容器必须包含一些小部件才能存在。
为了使Tk或' Toplevel窗口灵活,将flexx应用到root至关重要。

import tkinter as tk
from tkinter import ttk, Tk

def flexx( o, r = 0, c = 0, rw = 1, cw = 1 ):
    '''flexx will control grid manager static|dymanic growth'''
    if r != None:
        o.rowconfigure( r, weight = rw )
    if c != None:
        o.columnconfigure( c, weight = cw )

def grid( r = 0, c = 0, s = 'nsew', rs = 1, cs = 1 ) ->'Grid manager settings':
    '''grid( r = 0, c = 0, s = nsew, rs = 1, cs = 1 )'''
    return dict( row=r, column=c, rowspan=rs, columnspan=cs, sticky=s )

root = Tk()
root.geometry('568x427')
root.title("Test")
flexx( root ) # essential for other objects to resize

tab_frame = ttk.Notebook(root)
tab_frame.grid( grid() )

def closer( ev = None ):
    root.destroy( )

root.bind( '<Escape>', closer )

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 objects
label_frame1 = ttk.Labelframe( tab_frame, labelanchor= 'n', text='Label1', style='test_green.TFrame')
label_frame1.grid( grid( ) )
flexx( label_frame1 )
tk.Button( label_frame1, text = 'button_1' ).grid( grid() )
tab_frame.add(label_frame1, text='Tab1')
tk.Button( label_frame1, text = 'button_2' ).grid( grid(r=1) )
flexx( label_frame1, r=1 )

# Tab2 objects
label_frame2 = ttk.Labelframe( tab_frame, labelanchor= 'n', text='Label2', style='test_blue.TFrame')
label_frame2.grid( grid( ) )
flexx( label_frame2 )
tk.Button( label_frame2, text = 'button_3' ).grid( grid() )
tab_frame.add(label_frame2, text='Tab1')
tk.Button( label_frame2, text = 'button_4' ).grid( grid(r=1) )
flexx( label_frame2, r=1 )
tab_frame.add(label_frame2, text='Tab2')

root.mainloop()
b5lpy0ml

b5lpy0ml3#

只是关注了@TheLizzard的评论并写下了答案。

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()

def conf(event):
    tab_frame.config(height=root.winfo_height(), width=root.winfo_width())
    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.pack(fill="x")
tab2 = ttk.Frame(tab_frame, height=100, width=100, style='test_blue.TFrame')
tab2.pack(fill="both")

tab_frame.add(tab1, text='Tab1')
tab_frame.add(tab2, text='Tab2')

label_frame1 = ttk.Labelframe(tab1, text='Label1', width=100, height=100, style='test_green.TFrame')
label_frame1.pack(fill="x")

label_frame2 = ttk.Labelframe(tab1, text='Label2', width=100, height=100, style='test_blue.TFrame')
label_frame2.pack(fill="both", expand=True)

root.mainloop()

如果这解决了你的问题,然后标记为答案!

相关问题