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

目录
  • 学习目标
  • 界面原型设计
  • 使用技术:

学习目标

根据原型设计编译自动化数据生成器,熟悉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()

运行结果如下:

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之自动化数据生成器的项目实战的文章就介绍到这了,更多相关Python wxPython自动化生成器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python自动化生成IOS的图标

    本文实例为大家分享了python自动化生成IOS的图标,供大家参考,具体内容如下 每次上架之前都要生成十几个图片感觉无聊麻烦,考虑使用脚本处理 脚本使用python 和一部分shell 处理的,python部分主要是使用PIL库处理图片,和调用shell脚本,shell 主要是操作文件 #coding=utf-8 import os ,threading from PIL import Image import subprocess import json class ImgManager(ob

  • Python自动化办公之Word文档的创建与生成

    目录 保存生成 word 生成标题 生成段落 添加图片 添加表格 分页 上几章节我们主要学习了如何读取文章,而主要任务是读取文档中的文本信息,也就是字符串,而图片本身是不可读的文件所以并没有去读取图片.从今天开始将学习如何通过 python 脚本来自动生成一个 word 文档. 保存生成 word 在学习如何生成一个 word 文档之前,我们来看看如何保存生成 word 文件,因为马上就会用到. 使用方法: document_obj.save(文件地址) ---> /home/demo.docx

  • 基于Python实现自动化生成数据报表

    目录 前言 开发工具 环境搭建 主要代码 前言 不要在用手敲生成Excel数据报表了,用Python自动生成Excel数据报表!废话不多说 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pandasxlwingsmatplotlib模块: xlwingsmatplotlib模块: matplotlib模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原始数据如下,主要有水果蔬菜名称.销售日期.销售数

  • Python自动化短视频生成脚本实现热门视频流水线生产

    目录 一.核心功能设计 二.实现步骤 1. 图片爬取 2. 图片统一格式大小 3. 视频合成 4. 截取背景音乐 5. 视频和背景音乐合并 一.核心功能设计 首先我看了网上那些视频营销号的视频,大多数都是围绕一个主题通过几张图片进行视频轮播展示并添加一些热门歌曲作为背景音乐. 知道了大概的思路,接下来我们可以通过以下几步进行实现: 通过关键字进行图片批量爬取 对爬取的图片进行筛选并批量进行大小resize统一 将统一大小的图片进行视频合成 根据选取的歌曲,截取合适的背景音乐 将视频和截取的背景音

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

    目录 学习目标 界面原型设计 使用技术: 学习目标 根据原型设计编译自动化数据生成器,熟悉wxPython的基本用法. 界面原型设计 界面原型设计分析 输入参数: 最大长度 最小长度 组成规则 多少组数据 是否生成文件 文件名及路径设置 处理方式: 确定 重置 输出结果: 显示运行结果 相关提示信息 控件选择: 文本框 复选框 按钮 消息对话框 文本框复选框按钮消息对话框 分析设计过程及涉及技术 使用面向对象的思想实现: 创建类初始化方法---定义创建所需要用到的GUI控件(app.window

  • Python自动化运维和部署项目工具Fabric使用实例

    Fabric 是使用 Python 开发的一个自动化运维和部署项目的一个好工具,可以通过 SSH 的方式与远程服务器进行自动化交互,例如将本地文件传到服务器,在服务器上执行shell 命令. 下面给出一个自动化部署 Django 项目的例子 # -*- coding: utf-8 -*- # 文件名要保存为 fabfile.py from __future__ import unicode_literals from fabric.api import * # 登录用户和主机名: env.use

  • python GUI图形化编程wxpython的使用

    一.python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是python windows 下的模块,摄像头控制(opencv),常用于外挂制作 二.wx模块的安装: C:\Users\Administrator> pip install wxpython 三.图形化介绍 -- 四.wx主要组件介绍 1.fra

  • Python编写一个验证码图片数据标注GUI程序附源码

    做验证码图片的识别,不论是使用传统的ORC技术,还是使用统计机器学习或者是使用深度学习神经网络,都少不了从网络上采集大量相关的验证码图片做数据集样本来进行训练. 采集验证码图片,可以直接使用Python进行批量下载,下载完之后,就需要对下载下来的验证码图片进行标注.一般情况下,一个验证码图片的文件名就是图片中验证码的实际字符串. 在不借助工具的情况下,我们对验证码图片进行上述标注的流程是: 1.打开图片所在的文件夹: 2.选择一个图片: 3.鼠标右键重命名: 4.输入正确的字符串: 5.保存 州

  • Python GUI自动化实现绕过验证码登录

    这篇文章主要介绍了python GUI自动化实现绕过验证码登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 获取cookies 实现代码如下: import time from selenium import webdriver class cookies_login: wd=webdriver.Chrome() def getCookies(self): wd=self.wd wd.maximize_window() #登录成功跳转后

  • Python GUI布局工具Tkinter入门之旅

    目录 图形用户界面 (GUI) 用于创建GUI的 Python 库 Tkinter 基础 Tkinter Widgets Label Button Entry Combobox Checkbutton Radio Button Scrolled Text Message Box SpinBox Geometry 组织布局 binding 函数 Images 和 Icons 计算器 APP 图形用户界面 (GUI) 图形用户界面 (GUI) 只不过是一个桌面应用程序,可帮助我们与计算机进行交互 像

  • python使用wxpython开发简单记事本的方法

    本文实例讲述了python使用wxpython开发简单记事本的方法.分享给大家供大家参考.具体分析如下: wxPython是Python编程语言的一个GUI工具箱.他使得Python程序员能够轻松的创建具有健壮.功能强大的图形用户界面的程序.它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定.而wxWidgets是用C++语言写成的. 和Python语言与wxWidgetsGUI工具库一样,wxPython是开源软件.这意味着任何人都可以免费地使用它并且可以查看和修改它的源代

  • 这可能是最好玩的python GUI入门实例(推荐)

    简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱. 如果给程序加一个图形化界面,那么普通的用户也就能用上python的脚本,极大提升工作效率,所以给python程序加上图形化界面,把自己写的脚本,提供给普通用户,的确是一件激动人心的事! 如何给python脚本加图形化界面? 作者首先考虑了通过浏览器运行python的图形化界面,为了理想的效果,python需要借助javascri

  • Python学习笔记之迭代器和生成器用法实例详解

    本文实例讲述了Python学习笔记之迭代器和生成器用法.分享给大家供大家参考,具体如下: 迭代器和生成器 迭代器 每次可以返回一个对象元素的对象,例如返回一个列表.我们到目前为止使用的很多内置函数(例如 enumerate)都会返回一个迭代器. 是一种表示数据流的对象.这与列表不同,列表是可迭代对象,但不是迭代器,因为它不是数据流. 生成器 是使用函数创建迭代器的简单方式.也可以使用类定义迭代器 下面是一个叫做 my_range 的生成器函数,它会生成一个从 0 到 (x - 1) 的数字流:

  • python用WxPython库实现无边框窗体和透明窗体实现方法详解

    wxPython是Python语言的一套优秀的GUI图形库.允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的. 下面的2个实例代码是实现wxPython窗体特殊效果演示大家可以研究下 wxPython无边框窗体实现代码如下: import wx class Frame(wx.Frame): def __init__(self):#,pos=(0,0) wx.Fr

随机推荐