脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Python-GUI wxPython之自动化数据生成器的项目实战

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

2023-02-08 12:05BetterFate! Python

本文主要介绍了Python-GUI wxPython之自动化数据生成器实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

学习目标

根据原型设计编译自动化数据生成器,熟悉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,      # 定义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,      # 窗口中创建一个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之自动化数据生成器的项目实战

到此这篇关于Python-GUI wxPython之自动化数据生成器的项目实战的文章就介绍到这了,更多相关Python wxPython自动化生成器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42297382/article/details/124769965

延伸 · 阅读

精彩推荐
  • Python用Python写一个模拟qq聊天小程序的代码实例

    用Python写一个模拟qq聊天小程序的代码实例

    今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友...

    wdz306ling6642021-06-05
  • Pythonpython实现员工管理系统

    python实现员工管理系统

    这篇文章主要介绍了python实现员工管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    脚本之家6822021-01-04
  • PythonPython补齐字符串长度的实例

    Python补齐字符串长度的实例

    今天小编就为大家分享一篇Python补齐字符串长度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    橙子伟7082021-04-20
  • PythonPython 多个图同时在不同窗口显示的实现方法

    Python 多个图同时在不同窗口显示的实现方法

    今天小编就为大家分享一篇Python 多个图同时在不同窗口显示的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    非典型废言10742021-08-03
  • PythonPython中内置的日志模块logging用法详解

    Python中内置的日志模块logging用法详解

    Python的logging模块提供了记录程序运行情况的日志功能,类似于Apache的log4j,很好很强大,这里我们就来看一下Python中内置的日志模块logging用法详解...

    Kevin_Yang2832020-09-01
  • PythonPython实现弹球小游戏

    Python实现弹球小游戏

    这篇文章主要介绍了Python实现弹球小游戏的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    吃着东西不想停8172020-08-01
  • PythonPython常用库推荐

    Python常用库推荐

    本文给大家推荐的是在Python学习使用中经常需要用到的第三方库和工具,非常的实用,有需要的小伙伴可以参考下...

    脚本之家7882020-09-13
  • Python将python代码和注释分离的方法

    将python代码和注释分离的方法

    下面小编就为大家分享一篇将python代码和注释分离的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    枫奇11572021-02-03