【tkGo】推拉窗(Panedwindow)的使用案例

1 背景

当我们在tkinter-GUI编程时,需要考虑如下场景的需求:用户需要动态调整子窗口的大小,以改变信息的可见范围。

这时候,就需使用到推拉窗组件,Panedwindow。

推拉窗根据推拉方向不同分为水平推拉窗和垂直推拉窗两种,并支持嵌套。

2 环境

Python 3.7.3 64-bit

3 水平方向推拉窗

from tkinter import NSEW, HORIZONTAL
from tkinter import ttk
from text.scrolled_text import EScrolledText
from frame.frame import EFrame


class FrameOutput(EFrame):

    TEXT_STDOUT_NAME = "OUTPUT - stdout"
    TEXT_STDERR_NAME = "OUTPUT - stderr"

    def __init__(self, master=None, **kw):
        
        super().__init__(master=master, **kw)  # Frame初始化
        
        self.rowconfigure(0, weight=1)  # 设置行权重
        self.columnconfigure(0, weight=1)  # 设置列权重
        
        # 添加水平方向(HORIZONTAL)的推拉窗组件
        self.paned_win_h = ttk.Panedwindow(self, orient=HORIZONTAL)  
        # 采用GRID布局,推拉窗放置在第1行第1列,如果有其他组件,可放置在其他行或者其他列
        self.paned_win_h.grid(row=0, column=0, sticky=NSEW)  
        
        self.text_stdout = EScrolledText(  # 创建text组件
            master=self.paned_win_h,  # master为上面创建的水平推拉窗  
            height=self.conf.TEXT_OUTPUT_HEIGHT,  # 设置text组件的高度
            )
        self.text_stdout.stdout(self.TEXT_STDOUT_NAME)  # 在text组件中输出初始化信息
        self.paned_win_h.add(self.text_stdout, weight=2)  # 往推拉窗中添加text组件,并设置权重

        self.text_stderr = EScrolledText(  # 创建text组件
            master=self.paned_win_h,  # master为上面创建的水平推拉窗   
            height=self.conf.TEXT_OUTPUT_HEIGHT  # 设置text组件的高度
            )
        self.text_stderr.stdout(self.TEXT_STDERR_NAME)  # 在text组件中输出初始化信息
        self.paned_win_h.add(self.text_stderr, weight=1)  # 往推拉窗中添加text组件,并设置权重

注:

设置master的行列权重后,sticky=NSEW(向东南西北四个方向对齐,即最大范围填充)才会生效;

权重(weight)高代表占用的布局空间大

演示效果:

【tkGo】推拉窗(Panedwindow)的使用案例_第1张图片

4 垂直方向推拉窗

import tkinter as tk
from tkinter import ttk
from tkinter import NSEW, VERTICAL
from frame.frame import EFrame
from frame.frame_text_main import FrameTextMain
from frame.frame_button_main import FrameButtonMain
from frame.frame_output import FrameOutput


class FrameMain(EFrame):

    FRAME_TEXT_MAIN_NAME = "Text Main"

    def __init__(self, master=None, cnf={}, **kw):

        super().__init__(master=master, cnf=cnf, **kw)  # Frame初始化

        self.columnconfigure(0, weight=1)  # 设置列权重

        self.frame_button_main = FrameButtonMain(master=self, cnf=cnf, **kw)  # 创建放置按钮的Frame
        self.frame_button_main.grid(row=0, column=0, sticky=NSEW)  # 设置GRID布局,放置在第1行第1列
        
        self.rowconfigure(1, weight=1)  # 设置行权重
        self.paned_win_v = ttk.Panedwindow(self, orient=VERTICAL)  # 添加垂直方向(VERTICAL)的推拉窗组件
        self.paned_win_v.grid(row=1, column=0, sticky=NSEW)  # 设置GRID布局,放置在第2行第1列
        
        self.frame_output = FrameOutput(  # 创建放置output的Frame
            master=self.paned_win_v,  # master为上面创建的垂直推拉窗  
            cnf=cnf, **kw  # 传入其他参数
            )  
        self.paned_win_v.add(self.frame_output, weight=1)  # 往推拉窗中添加frame_output组件,并设置权重

        self.frame_text_main = FrameTextMain(  # 创建放置text_main的Frame
            master=self.paned_win_v,  # master为上面创建的垂直推拉窗  
            text=self.FRAME_TEXT_MAIN_NAME  # 设置frame text
            )
        self.paned_win_v.add(self.frame_text_main, weight=1000)  # 往推拉窗中添加frame_output组件,并设置权重

演示效果:【tkGo】推拉窗(Panedwindow)的使用案例_第2张图片

5 完整代码

项目代码在github上:https://github.com/TheUncleWhoGrowsBeans/tkGo

你可能感兴趣的:(#,tkGo,python,Panedwindow,tkGo,tkinter,GUI)