DBGridAndDataDemo 项目分析¶
项目信息¶
- 项目名称: DBGridAndDataDemo
- 下载链接: DBGridAndDataDemo.rar
- 分析时间: 2026-03-05
文件结构¶
DBGridAndDataDemo/
├── ExeOptions.ini
├── Extractor_Icon.ico
├── Project1.py
├── Project1.xml
├── Unit1.py
├── Unit1.pydfm
├── Unit1.sct
├── Unit1.sfm
├── data.xml
├── holdings.xml
├── output.xml
主程序文件: 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¶
# Powered By Python Studio, The best Python GUI IDE to download from glsite.com.
import os
from glcl import *
import time
class Form1(Form):
def __init__(self, owner):
self.Label1 = Label(self)
self.btClear = Button(self)
self.btPandas = Button(self)
self.bt10w = Button(self)
self.btEasy = Button(self)
self.DBGrid1 = DBGrid(self)
self.DataSource1 = DataSource(self)
self.ClientDataSet1 = ClientDataSet(self)
self.LoadProps(os.path.join(os.path.dirname(os.path.abspath(__file__)), "Unit1.pydfm"))
self.btPandas.OnClick = self.btPandasClick
self.btClear.OnClick = self.btClearClick
self.bt10w.OnClick = self.bt10wClick
self.btEasy.OnClick = self.btEasyClick
''' 在窗体上放置DBGrid、ClientDataSet、DataSource,并且设置DBGrid控件的
DataSource属性为DataSource1,DataSource1的DataSet属性为ClientDataSet1
'''
def btEasyClick(self, Sender):
# 加载简单数据演示
self.ClientDataSet1.FileName = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data.xml")
self.ClientDataSet1.Active = True
def bt10wClick(self, Sender):
# 记录开始时间
start_time = time.time()
self.ClientDataSet1.FileName = os.path.join(os.path.dirname(os.path.abspath(__file__)), "holdings.xml")
self.ClientDataSet1.Active = True
# 记录结束时间
end_time = time.time()
# 计算执行时间(秒)
execution_time = end_time - start_time
print(f"十万条数据加载显示时间: {execution_time:.6f} 秒")
def btClearClick(self, Sender):
# 清空表格
self.DBGrid1.DataSource.DataSet.Close()
self.DBGrid1.Refresh()
def btPandasClick(self, Sender):
'''
以下代码为AI生成,提示词:根据下面的XML,使用panda写一段代码去保存它:
<?xml version="1.0" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="aaa" fieldtype="string" WIDTH="20"/>
</FIELDS>
<PARAMS/>
</METADATA>
<ROWDATA>
<ROW RowState="4" aaa="aaa"/>
<ROW RowState="4" aaa="bbbb"/>
<ROW RowState="4" aaa="cccc"/>
</ROWDATA>
</DATAPACKET>
ClientDataSet可以读取xml文件,并将它转换成数据集,要完成这一点,根节点的
名称必须是DATAPACKET,并且版本为2.0。
METADATA用于指出字段及参数,字段用FIELDS标识出。
ROWDATA用于指出实际的数据,它必须与FIELDS中所指示的字段对应起来。
如果有更复杂的结构,可以用AI去生成相应的代码。
'''
import pandas as pd
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom import minidom
# 创建数据
df = pd.DataFrame({'aaa': ['aaa', 'bbbb', 'cccc']})
# 创建XML结构
root = Element('DATAPACKET', Version="2.0")
# METADATA部分
metadata = SubElement(root, 'METADATA')
fields = SubElement(metadata, 'FIELDS')
field = SubElement(fields, 'FIELD', attrname="aaa", fieldtype="string", WIDTH="20")
SubElement(metadata, 'PARAMS')
# ROWDATA部分
rowdata = SubElement(root, 'ROWDATA')
for value in df['aaa']:
SubElement(rowdata, 'ROW', {'RowState': '4', 'aaa': value})
# 生成XML字符串
xml_declaration = '<?xml version="1.0" standalone="yes"?>\n'
rough_string = tostring(root, 'utf-8')
reparsed = minidom.parseString(rough_string)
pretty_xml = reparsed.toprettyxml(indent=" ")
pretty_xml = pretty_xml.replace('<?xml version="1.0" ?>', xml_declaration, 1)
# 保存到文件
with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "output.xml"), 'w', encoding='utf-8') as f:
f.write(pretty_xml)
print("XML文件已保存为 output.xml")
print(pretty_xml)
# 保存完以后用DBGridj加载显示
self.ClientDataSet1.FileName = os.path.join(os.path.dirname(os.path.abspath(__file__)), "output.xml")
self.ClientDataSet1.Active = True
设计文件: Unit1.sct¶
def btEasyClick(Sender):
def DataSource1DataChange(Sender, Field):
def bt10wClick(Sender):
def btClearClick(Sender):
def btPandasClick(Sender):
设计文件: Unit1.sfm¶
object Form1: TForm
Left = 0
Top = 0
Caption = 'DBGrid'#23454#20363
ClientHeight = 394
ClientWidth = 661
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Segoe UI'
Font.Style = []
TextHeight = 20
object Label1: TLabel
Left = 16
Top = 368
Width = 604
Height = 20
Caption = #21152#36733#19981#21516#25968#25454#35201#28857#28165#31354#25353#38062#12290#22914#26524#20320#32534#20889#33258#24049#30340#20195#30721#65292#35760#24471#22312#37197#32622'EXE'#20013#38468#24102'xml'#36164#28304#25991#20214#65281
end
object DBGrid1: TDBGrid
Left = 16
Top = 16
Width = 632
Height = 312
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -15
TitleFont.Name = 'Segoe UI'
TitleFont.Style = []
end
object btEasy: TButton
Left = 16
Top = 336
Width = 131
Height = 25
Caption = #31616#21333#25968#25454#27979#35797
TabOrder = 1
OnClick = btEasyClick
end
object bt10w: TButton
Left = 160
Top = 336
Width = 123
Height = 25
Caption = #21313#19975#35760#24405#27979#35797
TabOrder = 2
OnClick = bt10wClick
end
object btPandas: TButton
Left = 296
Top = 336
Width = 139
Height = 25
Caption = #20174'Pandas'#21152#36733#25968#25454
TabOrder = 3
OnClick = btPandasClick
end
object btClear: TButton
Left = 573
Top = 336
Width = 75
Height = 25
Caption = #28165#31354
TabOrder = 4
OnClick = btClearClick
end
object ClientDataSet1: TClientDataSet
Aggregates = <>
Params = <>
Left = 480
Top = 245
end
object DataSource1: TDataSource
DataSet = ClientDataSet1
Left = 520
Top = 245
end
end
其他文件¶
- data.xml
- ExeOptions.ini
- Extractor_Icon.ico
- holdings.xml
- output.xml
- Project1.xml
详细分析¶
功能概述¶
网格组件演示
使用的组件¶
- Form1 (TForm)
- Label1 (TLabel)
- DBGrid1 (TDBGrid)
- btEasy (TButton)
- bt10w (TButton)
- btPandas (TButton)
- btClear (TButton)
- ClientDataSet1 (TClientDataSet)
- DataSource1 (TDataSource)
技术特点¶
- 包含9个GUI组件
- 定义4个事件处理
窗体属性¶
- caption: #28165#31354
- height: 394
- width: 661
代码分析¶
导入的模块: - import os - from glcl import * - import time - import pandas as pd - from xml.etree.ElementTree import Element, SubElement, tostring - from xml.dom import minidom
定义的类: - Form1
定义的方法: - init - btEasyClick - bt10wClick - btClearClick - btPandasClick
事件绑定: - self.btPandas.OnClick = self.btPandasClick - self.btClear.OnClick = self.btClearClick - self.bt10w.OnClick = self.bt10wClick - self.btEasy.OnClick = self.btEasyClick