【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)高代表佔用的佈局空間大

演示效果:

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組件,並設置權重

演示效果:

5 完整代碼

項目代碼在github上:https://github.com/TheUncleWhoGrowsBeans/tkGo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章