Tkinter динамически изменяет размер виджетов в панорамированном окне - PullRequest
3 голосов
/ 26 мая 2020

Сейчас у меня есть окно с двумя LabelPanes. На правой панели у меня есть три LabelFrames. Когда я изменяю размер окна, самый нижний 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()

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Вам необходимо указать параметр stretch для строки «всегда» при добавлении каждой панели.

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

stretch принимает следующие значения:

  • всегда Эта панель всегда растягивается.
  • первая Только если эта панель является первой панелью (самой левой или самой верхней), она будет растягиваться.
  • последняя Только если эта панель является последней панелью (самой правой или самой нижней), она будет растягиваться. Это значение по умолчанию.
  • средняя Только если эта панель не первая или последняя, ​​она будет растягиваться.
  • никогда Эта панель будет никогда не растягивайте.

Эта информация взята из раздела paneconfigure канонической документации tcl / tk.

0 голосов
/ 27 мая 2020

Вам нужно будет установить позицию sa sh. Я написал код, чтобы все панели на правой стороне были равны при изменении размера правой панели.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...