当前位置: 首页 > 知识库问答 >
问题:

tkinter-如何调整框架大小

壤驷瑾瑜
2023-03-14

我想在tkinter中创建由笔记本框架和每个选项卡内的几个框架组成的简单图形用户界面。假设我想在笔记本的每个选项卡内创建两个标记的框架,跨越100%的窗口宽度和50%的窗口高度。

屏幕布局

我将有更多的帧/元素,我想采取窗口宽度/高度的x%。

我读到tkintergui应该自动调整窗口大小时,但我不能让它工作。

  1. 如何设置帧以获取100%的窗口宽度和(例如)50%的窗口高度?
  2. 如何使框架居中,使其不粘在左上角?

我不知道如何做它与网格布局管理器和留档说,它应该被用于包。

我的代码示例:

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个答案

慕兴平
2023-03-14

跟随@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()

如果这解决了你的问题,那么把它标记为答案!

公良阳波
2023-03-14

这是一个简化的可调整大小的笔记本,有两个标签框,每个标签框都包含一个按钮。

与其他管理器不同,您遇到的问题是由于网格管理器默认值无法调整大小。

解决方案是使用函数flexx

flexx是使网格对象灵活的必要函数。

flex始终应用于容器,如labelframesframesrootmaster小部件

网格是一个方便的函数

您应该能够用任意数量的小部件填充每个笔记本选项卡。

需要记住的是,像labelframe这样的容器必须包含一些小部件才能存在。

为了使Tk或'Toplevel窗口灵活,将flexx应用于根目录是必不可少的。

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()
孟成文
2023-03-14

首先,您可以使用tab_frame.pack(填充="两者",扩展=1)代替. rid(),然后您不需要绑定

其次,可以使用rowconfigure()columnconfigure()使两个LabelFrames水平和垂直填充。

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

 类似资料:
  • 大佬们,如果我想修改wordpress的页面布局,有做过类似的吗? 1、从左右结构修改为上下结构,并且显隐部分功能 2、新增一些自定义功能模块,展示一些流量数据 目前网上相关资料较少,期望有大神指点迷津

  • 问题内容: 我有一个程序,该程序创建一个窗口,其中根据复选框显示一条消息。 显示消息而不显示消息时,如何使窗口大小恒定? 问题答案: 此代码使窗口具有用户无法更改窗口尺寸的条件,并且还禁用了最大化按钮。 在程序中,您可以使用@Carpetsmoker的答案或通过以下方式更改窗口尺寸: 将其实现到代码中应该很容易。:)

  • 问题内容: 由于由于Tk /Tkinter的限制,我无法水平滚动Treeview列,因此我想使其具有粘性,以便将其连接到框架。 问题是用户可以手动调整Treeview列的大小,这会以某种方式弄乱我的界面。是否可以禁用此类功能? 用户可以拖动鼠标来调整列的大小。我要禁用此功能。 设置为某个值可以防止列缩小,但是仍然可以将其调整为更大的宽度。我想我可以对更改宽度做出反应并将其恢复为原始宽度,但是必须有

  • 问题内容: 我编写了一个应用程序,该应用程序基于固定像素位置自定义绘制paint()中的所有内容。然后我禁用了调整框架的大小,使其始终可见。 但是,现在我希望能够调整它的大小,但是我不想更改我的绘图代码。我希望我可以在所有绘制代码​​之后抓取Graphics g对象的300x300正方形并将其大小调整为JFrame当前大小,但是我不知道自己在做什么。 这里是示例代码。在此,我希望将100x100正

  • 我有一个窗口与列表框,调整大小与彼此。我用网格来做这个。列表框下面有一排按钮,它们当前正在随着窗口移动和调整大小。我希望按钮保持原位,并在窗口和列表框调整大小时保持一致的大小(所以按钮总是保持在列表框的左下角)。 有简单的方法吗?我今天才开始使用Tkinter,所以我可能只是在文档中错过了它,或者可能只是在网格布局上感到困惑。 按钮设置如下: 我已经尝试了所有粘性组合,但那些不调整按钮大小的组合仍

  • 我把列和行按1:4的比例分开。在调整窗口大小时,它会保持比例,但我希望避免调整黑色和红色边框的大小。因此,基本上,当我调整大小时,黑色和红色框架不应该增长或收缩,但所有的变化都发生在白色窗口中。我怎样才能做到这一点? 代码-