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