Python-GUI wxPython之自动化数据生成器的项目实战

作者:BetterFate! 时间:2021-06-08 14:43:18 

学习目标

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

界面原型设计

Python-GUI wxPython之自动化数据生成器的项目实战

界面原型设计分析

输入参数

  • 最大长度

  • 最小长度

  • 组成规则

  • 多少组数据

  • 是否生成文件

  • 文件名及路径设置

处理方式

  • 确定

  • 重置

输出结果

  • 显示运行结果

  • 相关提示信息

控件选择

  • 文本框

  • 复选框

  • 按钮

  • 消息对话框

文本框复选框按钮消息对话框

分析设计过程及涉及技术 使用面向对象的思想实现:

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

运行结果如下:

Python-GUI wxPython之自动化数据生成器的项目实战

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()

运行结果如下:

Python-GUI wxPython之自动化数据生成器的项目实战

来源:https://blog.csdn.net/weixin_42297382/article/details/124769965

标签:Python,wxPython,自动化生成器
0
投稿

猜你喜欢

  • Christopher Schmitt 谈学习CSS的益处

    2008-07-13 14:15:00
  • Python获取网页上图片下载地址的方法

    2021-01-22 13:15:26
  • Python实现对adb命令封装

    2022-07-07 23:41:13
  • mysql8.0.11客户端无法登陆的解决方法

    2024-01-17 18:57:52
  • python 哈希表实现简单python字典代码实例

    2023-12-28 06:11:32
  • 将pymysql获取到的数据类型是tuple转化为pandas方式

    2024-01-26 11:26:18
  • Bootstrap 表单验证formValidation 实现表单动态验证功能

    2024-04-22 12:51:36
  • aspJpeg图片水印有杂点的完美解决方法

    2011-02-05 10:55:00
  • MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM

    2024-01-27 16:55:14
  • 基于Python os模块常用命令介绍

    2023-09-09 01:53:43
  • 仅用几行Python代码就能复制她的U盘文件?

    2021-11-20 15:12:19
  • 启动Atom并运行python文件的步骤

    2023-12-22 02:26:11
  • python pandas写入excel文件的方法示例

    2022-02-27 05:04:14
  • 用python处理图片之打开\\显示\\保存图像的方法

    2021-03-16 11:37:08
  • 流动的线条 —— 中国汉字书法之美

    2009-10-30 18:15:00
  • Python提取Word中图片的实现步骤

    2022-11-07 20:25:10
  • python如何通过闭包实现计算器的功能

    2023-10-04 06:08:06
  • 为你的网页添加背景音乐

    2007-02-03 11:39:00
  • 用Javascript 获取页面元素的位置的代码

    2024-04-18 09:33:31
  • ie6下实现position-fixed效果

    2009-06-05 18:47:00
  • asp之家 网络编程 m.aspxhome.com