TStackPanelDemo 项目分析¶
项目信息¶
- 项目名称: TStackPanelDemo
- 下载链接: TStackPanelDemo.rar
- 分析时间: 2026-03-05
文件结构¶
TStackPanelDemo/
├── Extractor_Icon.ico
├── Project1.py
├── Project1.xml
├── Unit1.py
├── Unit1.pydfm
├── Unit1.sct
├── Unit1.sfm
主程序文件: Project1.py¶
from glcl import *
from Unit1 import *
def main():
Application.Initialize()
Application.Title = 'Project1'
Application.MainFormOnTaskbar = True
Application.Icon.LoadFromFile(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Extractor_Icon.ico"))
MainForm = Form1(Application)
MainForm.Show()
FreeConsole()
Application.Run()
MainForm.Free()
if __name__ == '__main__':
main()
单元文件: Unit1.py¶
import os
from glcl import *
class Form1(Form):
def __init__(self, owner):
self.Panel1 = Panel(self)
self.grpOrientation = RadioGroup(self)
self.Panel2 = Panel(self)
self.grpControlPositioning = RadioGroup(self)
self.trkSpacing = TrackBar(self)
self.lblSpacing = Label(self)
self.grpPositioning = RadioGroup(self)
self.lstControls = ListBox(self)
self.lblPadding = Label(self)
self.trkPadding = TrackBar(self)
self.lblControlOverride = Label(self)
self.StackPanel1 = StackPanel(self)
self.Label1 = Label(self)
self.Edit1 = Edit(self)
self.Button1 = Button(self)
self.Memo1 = Memo(self)
self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pydfm"))
self.grpPositioning.OnClick = self.grpPositioningClick
self.grpControlPositioning.OnClick = self.grpControlPositioningClick
self.grpOrientation.OnClick = self.grpOrientationClick
self.lstControls.OnClick = self.lstControlsClick
self.trkPadding.OnChange = self.trkPaddingChange
self.trkSpacing.OnChange = self.trkSpacingChange
# 设置默认宽高
self.DefaultLabel1Width = self.Label1.Width
self.DefaultEdit1Width = self.Edit1.Width
self.DefaultButton1Width = self.Button1.Width
self.DefaultMemo1Width = self.Memo1.Width
self.DefaultLabel1Height = self.Label1.Height
self.DefaultEdit1Height = self.Edit1.Height
self.DefaultButton1Height = self.Button1.Height
self.DefaultMemo1Height = self.Memo1.Height
# 设置初始选中
self.lstControls.ItemIndex = 0
# 定义方向和位置列表
self.orientation = [spoVertical, spoHorizontal]
self.hp = [sphpDefault, sphpLeft, sphpCenter, sphpRight, sphpFill]
self.vp = [spvpDefault, spvpTop, spvpCenter, spvpBottom, spvpFill]
# 刻度条间距改变事件
def trkSpacingChange(self, Sender):
# 根据刻度条设置间距
self.StackPanel1.Spacing = self.trkSpacing.Position
# 刻度条边距改变事件
def trkPaddingChange(self, Sender):
# 设置左上右下边距
P = self.trkPadding.Position
self.StackPanel1.Padding.SetBounds(P, P, P, P)
# 列表框点击事件
def lstControlsClick(self, Sender):
# 判断当前选中的方向
if self.StackPanel1.Orientation == spoVertical:
# 设置单选组合框选中项
self.grpControlPositioning.ItemIndex = self.hp.index(self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].HorizontalPositioning)
else:
self.grpControlPositioning.ItemIndex = self.vp.index(self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].VerticalPositioning)
# 方向单选组点击事件
def grpOrientationClick(self, Sender):
# 设置方向
self.StackPanel1.Orientation = self.orientation[self.grpOrientation.ItemIndex]
# 如果是纵向
if self.StackPanel1.Orientation == spoVertical:
# 设置相关属性
self.grpPositioning.Caption = 'Horizontal Positioning'
self.grpPositioning.Items.Clear()
self.grpPositioning.Items.Add('sphpLeft')
self.grpPositioning.Items.Add('sphpCenter')
self.grpPositioning.Items.Add('sphpRight')
self.grpPositioning.Items.Add('sphpFill')
self.grpPositioning.ItemIndex = self.hp.index(self.StackPanel1.HorizontalPositioning) - 1
self.grpControlPositioning.Items.Clear()
self.grpControlPositioning.Items.Add('sphpDefault')
self.grpControlPositioning.Items.Add('sphpLeft')
self.grpControlPositioning.Items.Add('sphpCenter')
self.grpControlPositioning.Items.Add('sphpRight')
self.grpControlPositioning.Items.Add('sphpFill')
self.grpControlPositioning.ItemIndex = -1
else: # 横向
# 设置相关属性
self.grpPositioning.Caption = 'Vertical Positioning'
self.grpPositioning.Items.Clear()
self.grpPositioning.Items.Add('spvpTop')
self.grpPositioning.Items.Add('spvpCenter')
self.grpPositioning.Items.Add('spvpBottom')
self.grpPositioning.Items.Add('spvpFill')
self.grpPositioning.ItemIndex = self.vp.index(self.StackPanel1.VerticalPositioning) - 1
self.grpControlPositioning.Items.Clear()
self.grpControlPositioning.Items.Add('spvpDefault')
self.grpControlPositioning.Items.Add('spvpTop')
self.grpControlPositioning.Items.Add('spvpCenter')
self.grpControlPositioning.Items.Add('spvpBottom')
self.grpControlPositioning.Items.Add('spvpFill')
self.grpControlPositioning.ItemIndex = -1
# 重置控件属性函数
def ResetControl(self):
# 获取并设置控件默认的宽高
self.Label1.Width = self.DefaultLabel1Width
self.Label1.Height = self.DefaultLabel1Height
self.Edit1.Width = self.DefaultEdit1Width
self.Edit1.Height = self.DefaultEdit1Height
self.Button1.Width = self.DefaultButton1Width
self.Button1.Height= self.DefaultButton1Height
self.Memo1.Width = self.DefaultMemo1Width
self.Memo1.Height = self.DefaultMemo1Height
# 控件位置单选组点击事件
def grpControlPositioningClick(self, Sender):
self.StackPanel1.DisableAlign()
try:
self.ResetControl() # Revert width / height of all controls.
if self.StackPanel1.Orientation == spoVertical:
self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].HorizontalPositioning = self.hp[self.grpControlPositioning.ItemIndex]
else:
self.StackPanel1.ControlCollection[self.lstControls.ItemIndex].VerticalPositioning = self.vp[self.grpControlPositioning.ItemIndex]
finally:
self.StackPanel1.EnableAlign() # restart align with new parameter.
# 位置单选组点击事件
def grpPositioningClick(self, Sender):
# 取消对齐
self.StackPanel1.DisableAlign()
try:
# 重置控件宽高
self.ResetControl()
# 在位置单选组中没有sphpDefault/spvpDefault。下标+1跳过sphpDefault/spvpDefault
if self.StackPanel1.Orientation == spoVertical:
self.StackPanel1.HorizontalPositioning = self.hp[self.grpPositioning.ItemIndex + 1]
else:
self.StackPanel1.VerticalPositioning = self.vp[self.grpPositioning.ItemIndex + 1]
finally:
# 启用对齐
self.StackPanel1.EnableAlign()
设计文件: Unit1.sct¶
def trkSpacingChange(Sender):
def trkPaddingChange(Sender):
def lstControlsClick(Sender):
def grpOrientationClick(Sender):
def grpControlPositioningClick(Sender):
def grpPositioningClick(Sender):
设计文件: Unit1.sfm¶
object Form1: TForm
Left = 0
Top = 0
Caption = 'TStackPanel'
ClientHeight = 386
ClientWidth = 594
Color = clBtnFace
Constraints.MinHeight = 425
Constraints.MinWidth = 610
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
Position = poScreenCenter
TextHeight = 13
object Panel1: TPanel
Left = 0
Top = 0
Width = 594
Height = 113
Align = alTop
BevelOuter = bvNone
TabOrder = 0
object lblSpacing: TLabel
Left = 16
Top = 51
Width = 37
Height = 13
Caption = 'Spacing'
end
object lblPadding: TLabel
Left = 16
Top = 83
Width = 38
Height = 13
Caption = 'Padding'
end
object grpOrientation: TRadioGroup
Left = 260
Top = 8
Width = 325
Height = 41
Caption = 'Orientation'
Columns = 2
ItemIndex = 0
Items.Strings = (
'Vertical'
'Horizontal')
TabOrder = 2
OnClick = grpOrientationClick
end
object trkSpacing: TTrackBar
Left = 70
Top = 47
Width = 159
Height = 26
Max = 20
Position = 2
TabOrder = 0
TickMarks = tmBoth
TickStyle = tsNone
OnChange = trkSpacingChange
end
object grpPositioning: TRadioGroup
Left = 260
Top = 55
Width = 325
Height = 42
Caption = 'Positioning'
Columns = 4
ItemIndex = 0
Items.Strings = (
'sphpLeft'
'sphpCenter'
'sphpRight'
'sphpFill')
TabOrder = 3
OnClick = grpPositioningClick
end
object trkPadding: TTrackBar
Left = 70
Top = 79
Width = 159
Height = 24
Max = 20
Position = 5
TabOrder = 1
TickMarks = tmBoth
TickStyle = tsNone
OnChange = trkPaddingChange
end
end
object Panel2: TPanel
Left = 0
Top = 113
Width = 169
Height = 273
Align = alLeft
BevelOuter = bvNone
TabOrder = 1
object lblControlOverride: TLabel
Left = 16
Top = 8
Width = 134
Height = 13
Caption = 'Override Control Positioning'
end
object grpControlPositioning: TRadioGroup
Left = 16
Top = 127
Width = 137
Height = 137
Caption = 'Positioning Override'
ItemIndex = 0
Items.Strings = (
'sphpDefault'
'sphpLeft'
'sphpCenter'
'sphpRight'
'sphpFill')
TabOrder = 1
OnClick = grpControlPositioningClick
end
object lstControls: TListBox
Left = 16
Top = 31
Width = 137
Height = 74
ItemHeight = 13
Items.Strings = (
'Label1'
'Edit1'
'Button1'
'Memo1')
TabOrder = 0
OnClick = lstControlsClick
end
end
object StackPanel1: TStackPanel
AlignWithMargins = True
Left = 179
Top = 123
Width = 405
Height = 253
Margins.Left = 10
Margins.Top = 10
Margins.Right = 10
Margins.Bottom = 10
Align = alClient
ControlCollection = <
item
Control = Label1
end
item
Control = Edit1
end
item
Control = Button1
end
item
Control = Memo1
end>
Padding.Left = 5
Padding.Top = 5
Padding.Right = 5
Padding.Bottom = 5
TabOrder = 2
object Label1: TLabel
Left = 6
Top = 6
Width = 31
Height = 13
Caption = 'Label1'
end
object Edit1: TEdit
Left = 6
Top = 21
Width = 96
Height = 21
TabOrder = 0
Text = 'Edit1'
end
object Button1: TButton
Left = 6
Top = 44
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
end
object Memo1: TMemo
Left = 6
Top = 71
Width = 136
Height = 55
Lines.Strings = (
'Memo1')
TabOrder = 2
end
end
end
其他文件¶
- Extractor_Icon.ico
- Project1.xml
详细分析¶
功能概述¶
GUI组件演示
使用的组件¶
- Form1 (TForm)
- Panel1 (TPanel)
- lblSpacing (TLabel)
- lblPadding (TLabel)
- grpOrientation (TRadioGroup)
- trkSpacing (TTrackBar)
- grpPositioning (TRadioGroup)
- trkPadding (TTrackBar)
- Panel2 (TPanel)
- lblControlOverride (TLabel)
- grpControlPositioning (TRadioGroup)
- lstControls (TListBox)
- StackPanel1 (TStackPanel)
- Label1 (TLabel)
- Edit1 (TEdit)
- Button1 (TButton)
- Memo1 (TMemo)
技术特点¶
- 包含17个GUI组件
- 定义6个事件处理
窗体属性¶
- caption: Button1
- height: 386
- width: 594
代码分析¶
导入的模块: - import os - from glcl import *
定义的类: - Form1
定义的方法: - init - trkSpacingChange - trkPaddingChange - lstControlsClick - grpOrientationClick - ResetControl - grpControlPositioningClick - grpPositioningClick
事件绑定: - self.grpPositioning.OnClick = self.grpPositioningClick - self.grpControlPositioning.OnClick = self.grpControlPositioningClick - self.grpOrientation.OnClick = self.grpOrientationClick - self.lstControls.OnClick = self.lstControlsClick - self.trkPadding.OnChange = self.trkPaddingChange - self.trkSpacing.OnChange = self.trkSpacingChange