当我们在tkinter-GUI编程时,需要考虑如下场景的需求:用户需要动态调整子窗口的大小,以改变信息的可见范围。
这时候,就需使用到推拉窗组件,Panedwindow。
推拉窗根据推拉方向不同分为水平推拉窗和垂直推拉窗两种,并支持嵌套。
Python 3.7.3 64-bit
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)高代表占用的布局空间大
演示效果:
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组件,并设置权重
项目代码在github上:https://github.com/TheUncleWhoGrowsBeans/tkGo