Tkinter在窗格窗口中动态调整小部件的大小

2024-10-02 18:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个带有两个标签窗格的窗口。在右窗格中,我有三个LabelFrame。当我调整窗口大小时,最底部的LabelFrame会变大,但顶部的两个仍然是我在设置其高度时指定的大小。我想要的是,当窗口在Y轴上调整大小时,它们三个都会均匀地增长。这可能吗

import tkinter as tk
if __name__ == '__main__':
    appHeight=720
    aspectRatio=16/9
    appWidth=int(appHeight*aspectRatio)
    app=tk.Tk()
    app.title("Title")
    app.minsize(width=appWidth,height=appHeight)
    #================================================================================
    # Setup Panes
    #================================================================================
    #Create Left Pane for settings
    leftPane = tk.PanedWindow(bd=4,relief='raised',bg='red')
    leftPane.pack(fill=tk.BOTH,expand=1)
    #Add Settings Frame to Pane
    settingsFrame = tk.LabelFrame(leftPane,text='Signature Filters',padx=5,pady=5,width=int(appWidth/4))
    leftPane.add(settingsFrame)

    #Create Right Pane for charts
    rightPane = tk.PanedWindow(leftPane,orient=tk.VERTICAL,bd=4,relief=tk.SUNKEN,bg='blue')
    leftPane.add(rightPane)
    #Add Depth Frame to Pane
    depthFrame = tk.LabelFrame(rightPane,text='Depth Signature',padx=5,pady=5,height=int(appHeight/3))
    rightPane.add(depthFrame)
    #Add Velocity Frame to Pane
    velocityFrame = tk.LabelFrame(rightPane,text='Velocity Signature',padx=5,pady=5,height=int(appHeight/3))
    rightPane.add(velocityFrame)
    #Add Depth Frame to Pane
    currentFrame = tk.LabelFrame(rightPane,text='Current Signature',padx=5,pady=5,height=int(appHeight/3))
    rightPane.add(currentFrame)

app.mainloop()

Tags: totextaddappframetkintsignature
2条回答

添加每个窗格时,需要将stretch选项定义为字符串“始终”

rightPane.add(depthFrame, stretch="always")
rightPane.add(velocityFrame, stretch="always")
rightPane.add(currentFrame, stretch="always")

stretch接受以下值:

  • 始终此窗格将始终拉伸
  • 第一个只有当此窗格是第一个窗格(最左侧或最顶部)时,它才会拉伸
  • last只有当此窗格是最后一个窗格(最右侧或最底部)时,它才会拉伸。这是默认值
  • 中间只有当此窗格不是第一个或最后一个窗格时,它才会拉伸
  • 永不此窗格永远不会拉伸

这些信息来自规范的tcl/tk文档的paneconfigure部分

您需要设置窗扇位置。我编写了一些代码,当右侧窗格的大小发生变化时,使右侧的所有窗格都相等

import tkinter as tk

if __name__ == '__main__':
    appHeight=720
    aspectRatio=16/9
    appWidth=int(appHeight*aspectRatio)
    app=tk.Tk()
    app.title("Title")
    app.minsize(width=appWidth,height=appHeight)
    #================================================================================
    # Setup Panes
    #================================================================================
    #Create Left Pane for settings
    leftPane = tk.PanedWindow(bd=4,relief='raised',bg='red')
    leftPane.pack(fill=tk.BOTH,expand=1)
    #Add Settings Frame to Pane
    settingsFrame = tk.LabelFrame(leftPane, text='Signature Filters',padx=5,pady=5,width=int(appWidth/4))
    leftPane.add(settingsFrame)

    #Create Right Pane for charts
    rightPane = tk.PanedWindow(leftPane, orient=tk.VERTICAL, bd=4, relief=tk.SUNKEN, bg='blue')

    leftPane.add(rightPane)
    #Add Depth Frame to Pane
    depthFrame = tk.LabelFrame(rightPane, text='Depth Signature', padx=5, pady=5, height=int(appHeight/3))
    rightPane.add(depthFrame)
    #Add Velocity Frame to Pane
    velocityFrame = tk.LabelFrame(rightPane, text='Velocity Signature', padx=5, pady=5, height=int(appHeight/3))
    rightPane.add(velocityFrame)
    #Add Depth Frame to Pane
    currentFrame = tk.LabelFrame(rightPane, text='Current Signature', padx=5, pady=5, height=int(appHeight/3))
    rightPane.add(currentFrame)

    def set_sash(_):
        size = rightPane.winfo_height()//3
        for idx in range(len(rightPane.panes())-1):
            rightPane.sash_place(idx, 4, (idx+1)*size)
    rightPane.bind('<Configure>', set_sash)

app.mainloop()

相关问题 更多 >