Skip to content

DBGridAndDataDemo 项目分析

项目信息

文件结构

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