【问题标题】:Tkinter dynamically resize Widgets within a Paned WindowTkinter 在窗格窗口中动态调整小部件的大小
【发布时间】:2020-05-26 20:03:03
【问题描述】:

我目前有一个带有两个 LabelPanes 的窗口。在 rightPane 中,我有三个 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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    添加每个窗格时,您需要为字符串“always”定义stretch 选项。

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

    stretch 接受以下值:

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

    此信息来自规范 tcl/tk 文档的 paneconfigure 部分。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 上面的“stretch='always'”正是我所需要的。不过,我非常感谢您在编写函数时付出的努力!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2018-03-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多