【Python-GUI】wxPython之自动化数据生成器实战

目录

学习目标

界面原型设计

界面原型设计分析

分析设计过程及涉及技术

使用面向对象的思想实现:

使用技术:

代码实现


学习目标

根据原型设计编译自动化数据生成器,熟悉wxPython的基本用法。

界面原型设计

界面原型设计分析

输入参数

  1. 最大长度
  2. 最小长度
  3. 组成规则
  4. 多少组数据
  5. 是否生成文件
  6. 文件名及路径设置

处理方式

  1. 确定
  2. 重置

输出结果

  1. 显示运行结果
  2. 相关提示信息

控件选择

  1. 文本框
  2. 复选框
  3. 按钮
  4. 消息对话框

分析设计过程及涉及技术

使用面向对象的思想实现:

  1. 创建类
  2. 初始化方法---定义创建所需要用到的GUI控件(app、window、panel、所需其他控件)
  3. 控件布局方法---控件布局设置
    1. 平行---一般来说逐行进行布局排列
    2. 垂直---最后统一进行垂直布局排列
  4. 事件关联方法---把对应的按钮所触发的事件进行绑定
  5. 事件处理方法---绑定之后要执行的处理代码
  6. 运行方法---窗体加载和App的运行

使用技术:

控件:

标签:wx.StaticText(self.panel, label="最小长度")

文本框:wx.TextCtrl(self.panel)

复选框:wx.CheckBox(self.panel, label="包含大写字母")

按钮:wx.Button(self.panel, label="确定")

多行文本框:wx.TextCtrl(self.panelnew, value=resultdata, style=wx.TE_MULTILINE, size=(400, 300))

错误提示框:

定义提示框内容,标题,默认确认按钮,窗口类型
当点击确定按钮之后,窗口关闭。

dlg = wx.MessageDialog(None, "最小长度不能为空!", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
    dlg.Destroy()

运行结果如下:

random:

在一个范围内随机取值:random.randint(x, y)

在给定的字符串中随机取一段任意长度的字符串:random.sample(给定字符串, 长度)

string:

大小写字母都有:string.ascii_letters

大写字母:string.ascii_uppercase

小写字母:string.ascii_lowercase

数字:string.digits

符号:string.punctuation

代码实现

# 使用面向对象编程实现基于GUI框架的自动生成测试数据的工具
# 导入库文件
import wx
import string, random
import csv


# 类的定义
class GUI_CreateTestData():
    # 类的初始化定义,创建所有使用到的控件
    def __init__(self):
        # 初始化App
        self.app = wx.App()
        # 定义窗体
        self.window = wx.Frame(None, title="自动创建测试数据工具", size=(400, 300))
        # 定义Panel
        self.panel = wx.Panel(self.window)
        # 定义标签
        self.lblminlen = wx.StaticText(self.panel, label="最小长度")
        # 定义文本框
        self.txtminlen = wx.TextCtrl(self.panel)
        # 定义标签
        self.lblmaxlen = wx.StaticText(self.panel, label="最大长度")
        # 定义文本框
        self.txtmaxlen = wx.TextCtrl(self.panel)
        # 定义复选框
        self.chkup = wx.CheckBox(self.panel, label="包含大写字母")
        self.chklow = wx.CheckBox(self.panel, label="包含小写字母")
        self.chknum = wx.CheckBox(self.panel, label="包含数字")
        self.chkpnu = wx.CheckBox(self.panel, label="包含符号")
        self.chkno = wx.CheckBox(self.panel, label="包含序号")
        self.chkrexemail = wx.CheckBox(self.panel, label="包含邮箱后缀")
        self.chkfile = wx.CheckBox(self.panel, label="保存到文件")
        # 定义标签
        self.lblfile = wx.StaticText(self.panel, label="文件名及路径选择")
        # 定义文本框
        self.txtfile = wx.TextCtrl(self.panel)
        # 定义标签
        self.lblcount = wx.StaticText(self.panel, label="数据总数")
        # 定义文本框
        self.txtcount = wx.TextCtrl(self.panel, value='1')  # 默认值为1
        # 定义两个按钮
        self.butok = wx.Button(self.panel, label="确定")
        self.butreset = wx.Button(self.panel, label="重置")

    # 设置控件布局
    def layout(self):
        # 设置第一行的水平布局
        boxsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer1.Add(self.lblminlen, border=10, flag=wx.LEFT)
        boxsizer1.Add(self.txtminlen, border=10, flag=wx.LEFT)
        boxsizer1.Add(self.lblmaxlen, border=10, flag=wx.LEFT)
        boxsizer1.Add(self.txtmaxlen, border=10, flag=wx.LEFT)
        # 设置第二行的水平布局
        boxsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer2.Add(self.chkup, border=68, flag=wx.LEFT)
        boxsizer2.Add(self.chklow, border=85, flag=wx.LEFT)
        # 设置第三行的水平布局
        boxsizer3 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer3.Add(self.chknum, border=68, flag=wx.LEFT)
        boxsizer3.Add(self.chkpnu, border=109, flag=wx.LEFT)
        # 设置第四行的水平布局
        boxsizer4 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer4.Add(self.chkno, border=68, flag=wx.LEFT)
        boxsizer4.Add(self.chkrexemail, border=110, flag=wx.LEFT)
        # 设置第五行的水平布局
        boxsizer5 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer5.Add(self.chkfile, border=68, flag=wx.LEFT)
        boxsizer5.Add(self.lblfile, border=10, flag=wx.LEFT)
        boxsizer5.Add(self.txtfile, border=10, flag=wx.LEFT | wx.RIGHT)
        # 设置第六行的水平布局
        boxsizer6 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer6.Add(self.lblcount, border=10, flag=wx.LEFT)
        boxsizer6.Add(self.txtcount, border=10, flag=wx.LEFT | wx.RIGHT, proportion=1)
        # 设置第七行的水平布局
        boxsizer7 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer7.Add(self.butok, border=68, flag=wx.LEFT)
        boxsizer7.Add(self.butreset, border=109, flag=wx.LEFT)
        # 设置垂直布局
        boxsizerFinal = wx.BoxSizer(wx.VERTICAL)
        boxsizerFinal.Add(boxsizer1, border=20, flag=wx.TOP)
        boxsizerFinal.Add(boxsizer2, border=15, flag=wx.TOP)
        boxsizerFinal.Add(boxsizer3, border=10, flag=wx.TOP)
        boxsizerFinal.Add(boxsizer4, border=10, flag=wx.TOP)
        boxsizerFinal.Add(boxsizer5, border=10, flag=wx.TOP)
        boxsizerFinal.Add(boxsizer6, border=10, flag=wx.EXPAND | wx.TOP)
        boxsizerFinal.Add(boxsizer7, border=10, flag=wx.TOP)
        # for i in range(1, 8):
        #     box = "boxsizer" + str(i)
        #     # print(type(box))
        #     # print(type(eval(box)))
        #     boxsizerFinal.Add(eval(box))  # eval方法将字符串类型转换为对象
        # 执行布局设置
        self.panel.SetSizer(boxsizerFinal)

    # 运行GUI整体框架
    def eventbind(self):
        # 绑定确定按钮对应的事件
        self.butok.Bind(wx.EVT_BUTTON, self.checkinput)
        self.butreset.Bind(wx.EVT_BUTTON, self.reset)

    def checkinput(self, event):
        # 对长度进行校验
        # self.checklen()
        lentmp = self.checklen()
        if lentmp == 0:
            # 没有选择任何条件,默认生成字母串
            chkresult = self.nonemethod()
            # print('是否勾选复选框', chkresult)
            number = self.checknum()
            strtmp = ""
            # 返回值为0,任何条件都没有选择
            if chkresult == 0 and number != 0:
                for i in range(1, number + 1):
                    resultdata = self.createdata()
                    strtmp = strtmp + resultdata + '\n'
                print(strtmp)
                # 调用测试数据的显示
                if self.chkfile.GetValue() == False:
                    # 调用一个新窗体,进行测试数据的显示
                    self.showdata(strtmp)
                else:
                    # 调用保存文件方法
                    self.savefile(strtmp)
            elif chkresult != 0 and number != 0:
                for i in range(1, number + 1):
                    resultdata = self.createdatamethod(i)
                    strtmp = strtmp + resultdata + '\n'
                print(strtmp)
                # 调用测试数据的显示
                if self.chkfile.GetValue() == False:
                    # 调用一个新窗体,进行测试数据的显示
                    self.showdata(strtmp)
                else:
                    # 调用保存文件方法
                    self.savefile(strtmp)

    # 保存文件处理
    def savefile(self, resultdata):
        # 首先判断文件名文本框是否输入合法的路径及文件名内容
        filetmp = self.txtfile.GetValue()
        # 判断是否为空
        if filetmp == "":
            dlg = wx.MessageDialog(None, "请输入文件名及路径", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
                return 0
        else:
            # 路径及文件名正确
            # 创建一个文件
            file = open(filetmp, 'w', newline='')
            write = csv.writer(file)
            tmp = resultdata.split("\n")
            for ele in tmp:
                write.writerow([ele])
            file.close()

    # 在新窗口中显示数据
    def showdata(self, resultdata):
        self.windownew = wx.Frame(None, title="显示测试数据", size=(400, 300))
        # 窗口中创建一个panel
        self.panelnew = wx.Panel(self.windownew)
        # 再定义一个多行文本框
        wx.TextCtrl(self.panelnew, value=resultdata, style=wx.TE_MULTILINE, size=(400, 300))
        self.windownew.Show(True)

    # 校验输入的数量
    def checknum(self):
        # 判断数量文本框是否为空
        number = int(self.txtcount.GetValue())
        if number == "" or number < 1:
            # 弹出错误提示框
            dlg = wx.MessageDialog(None, "请输入数量为大于等于1的整数!", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
                return 0
        else:
            return number

    # 根据选择的组成条件生成数据
    def createdatamethod(self, number):
        strtmp = ""
        self.no = number
        rexemail = ['@51testing', '@126.com', '@163.com', '@qq.com', '@sohu.com']
        # 判断生成的是哪些条件
        if 'up' in self.chkList:
            strtmp = strtmp + string.ascii_uppercase + string.ascii_uppercase + string.ascii_uppercase + string.ascii_uppercase
        if 'low' in self.chkList:
            strtmp = strtmp + string.ascii_lowercase + string.ascii_lowercase + string.ascii_lowercase + string.ascii_lowercase
        if 'num' in self.chkList:
            strtmp = strtmp + string.digits + string.digits + string.digits + string.digits + string.digits + string.digits + string.digits + string.digits
        if 'pnu' in self.chkList:
            strtmp = strtmp + string.punctuation + string.punctuation + string.punctuation + string.punctuation + string.punctuation + string.punctuation
        num = random.randint(int(self.minlen), int(self.maxlen))
        # 获取子串,前面的条件至少选择一个
        if strtmp != "":
            resultdata = ''.join(random.sample(strtmp, num))
        else:
            # 如果其他条件都没有选择,默认调用生成字母串
            resultdata = self.createdata()
        # 添加一个序号
        if 'no' in self.chkList:
            resultdata = str(self.no) + "、" + resultdata
        if 'email' in self.chkList:
            # 任意取出一个邮箱后缀
            eml = random.choice(rexemail)
            resultdata = resultdata + eml
        # print(resultdata)
        return resultdata

    # 对界面输入进行校验
    def checklen(self):
        minlen = self.txtminlen.GetValue()
        maxlen = self.txtmaxlen.GetValue()
        self.minlen = minlen.strip()  # 去除左右空格方法
        self.maxlen = maxlen.strip()
        # 判断最小长度文本框中输入的内容是否为空
        if self.minlen == "":
            # 给出提示,最小长度不能为空
            dlg = wx.MessageDialog(None, "最小长度不能为空!", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
        # 判断最大长度文本框中输入的内容是否为空
        elif self.maxlen == "":
            # 给出提示,最小长度不能为空
            dlg = wx.MessageDialog(None, "最大长度不能为空!", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
        # 判断最小长度是否小于最大长度
        elif int(self.minlen) > int(self.maxlen):
            # 给出提示,最小长度不能大于最大长度
            dlg = wx.MessageDialog(None, "最小长度不能大于最大长度!", "错误信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
        else:
            return 0
        return 1

    # 没有选中任何check框生成字母串
    def nonemethod(self):
        # 把check框的选项放入列表中
        self.chkList = []
        # 判断check框是否没有任何选择
        if self.chkup.GetValue() == True:
            self.chkList.append('up')
        if self.chklow.GetValue() == True:
            self.chkList.append('low')
        if self.chknum.GetValue() == True:
            self.chkList.append('num')
        if self.chkpnu.GetValue() == True:
            self.chkList.append('pnu')
        if self.chkno.GetValue() == True:
            self.chkList.append('no')
        if self.chkrexemail.GetValue() == True:
            self.chkList.append('email')
        # print(self.chkList)
        # 判断list列表是否为空
        if len(self.chkList) == 0:
            return 0
        else:
            return 1

    # 把界面所有输入内容清空
    def reset(self, event):
        dlg = wx.MessageDialog(None, "是否确定要清空信息?", "清空确认信息", wx.YES_NO | wx.ICON_QUESTION)
        if dlg.ShowModal() == wx.ID_YES:
            dlg.Destroy()
            self.txtminlen.SetValue("")
            self.txtmaxlen.SetValue("")
            self.chkup.SetValue(False)
            self.chklow.SetValue(False)
            self.chknum.SetValue(False)
            self.chkpnu.SetValue(False)
            self.chkno.SetValue(False)
            self.chkrexemail.SetValue(False)
            self.txtcount.SetValue("1")
        else:
            dlg.Destroy()

    # 创建测试数据
    def createdata(self):
        str = ""
        # 按照指定长度生成测试数据
        # 生成随机数
        num = random.randint(int(self.minlen), int(self.maxlen))
        # 默认生成字母串
        str = str + string.ascii_letters + string.ascii_letters + string.ascii_letters + string.ascii_letters
        # 获取子串
        resultdata = ''.join(random.sample(str, num))
        # print(resultdata)
        return resultdata

    def run(self):
        # 激活显示窗口
        self.window.Show(True)
        # 运行程序
        self.app.MainLoop()


if __name__ == '__main__':
    guiObj = GUI_CreateTestData()
    guiObj.layout()
    guiObj.eventbind()
    guiObj.run()

运行结果如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BetterFate!

爱你哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值