欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python-GUI?wxPython之自動(dòng)化數(shù)據(jù)生成器的項(xiàng)目實(shí)戰(zhàn)

 更新時(shí)間:2022年05月19日 08:28:00   作者:BetterFate!  
本文主要介紹了Python-GUI?wxPython之自動(dòng)化數(shù)據(jù)生成器實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

學(xué)習(xí)目標(biāo)

根據(jù)原型設(shè)計(jì)編譯自動(dòng)化數(shù)據(jù)生成器,熟悉wxPython的基本用法。

界面原型設(shè)計(jì)

界面原型設(shè)計(jì)分析

輸入?yún)?shù)

  • 最大長度
  • 最小長度
  • 組成規(guī)則
  • 多少組數(shù)據(jù)
  • 是否生成文件
  • 文件名及路徑設(shè)置

處理方式

  • 確定
  • 重置

輸出結(jié)果

  • 顯示運(yùn)行結(jié)果
  • 相關(guān)提示信息

控件選擇

  • 文本框
  • 復(fù)選框
  • 按鈕
  • 消息對話框
文本框復(fù)選框按鈕消息對話框

分析設(shè)計(jì)過程及涉及技術(shù) 使用面向?qū)ο蟮乃枷雽?shí)現(xiàn):

創(chuàng)建類
初始化方法---定義創(chuàng)建所需要用到的GUI控件(app、window、panel、所需其他控件)
控件布局方法---控件布局設(shè)置
平行---一般來說逐行進(jìn)行布局排列
垂直---最后統(tǒng)一進(jìn)行垂直布局排列
事件關(guān)聯(lián)方法---把對應(yīng)的按鈕所觸發(fā)的事件進(jìn)行綁定
事件處理方法---綁定之后要執(zhí)行的處理代碼
運(yùn)行方法---窗體加載和App的運(yùn)行

使用技術(shù):

控件:

標(biāo)簽:wx.StaticText(self.panel, label="最小長度")

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

復(fù)選框:wx.CheckBox(self.panel, label="包含大寫字母")

按鈕:wx.Button(self.panel, label="確定")

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

錯(cuò)誤提示框:

定義提示框內(nèi)容,標(biāo)題,默認(rèn)確認(rèn)按鈕,窗口類型
當(dāng)點(diǎn)擊確定按鈕之后,窗口關(guān)閉。

dlg = wx.MessageDialog(None, "最小長度不能為空!", "錯(cuò)誤信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
    dlg.Destroy()

運(yùn)行結(jié)果如下:

random:

在一個(gè)范圍內(nèi)隨機(jī)取值:random.randint(x, y)

在給定的字符串中隨機(jī)取一段任意長度的字符串:random.sample(給定字符串, 長度)

string:

大小寫字母都有:string.ascii_letters

大寫字母:string.ascii_uppercase

小寫字母:string.ascii_lowercase

數(shù)字:string.digits

符號:string.punctuation

代碼實(shí)現(xiàn)

# 使用面向?qū)ο缶幊虒?shí)現(xiàn)基于GUI框架的自動(dòng)生成測試數(shù)據(jù)的工具
# 導(dǎo)入庫文件
import wx
import string, random
import csv
 
 
# 類的定義
class GUI_CreateTestData():
    # 類的初始化定義,創(chuàng)建所有使用到的控件
    def __init__(self):
        # 初始化App
        self.app = wx.App()
        # 定義窗體
        self.window = wx.Frame(None, title="自動(dòng)創(chuàng)建測試數(shù)據(jù)工具", size=(400, 300))
        # 定義Panel
        self.panel = wx.Panel(self.window)
        # 定義標(biāo)簽
        self.lblminlen = wx.StaticText(self.panel, label="最小長度")
        # 定義文本框
        self.txtminlen = wx.TextCtrl(self.panel)
        # 定義標(biāo)簽
        self.lblmaxlen = wx.StaticText(self.panel, label="最大長度")
        # 定義文本框
        self.txtmaxlen = wx.TextCtrl(self.panel)
        # 定義復(fù)選框
        self.chkup = wx.CheckBox(self.panel, label="包含大寫字母")
        self.chklow = wx.CheckBox(self.panel, label="包含小寫字母")
        self.chknum = wx.CheckBox(self.panel, label="包含數(shù)字")
        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="保存到文件")
        # 定義標(biāo)簽
        self.lblfile = wx.StaticText(self.panel, label="文件名及路徑選擇")
        # 定義文本框
        self.txtfile = wx.TextCtrl(self.panel)
        # 定義標(biāo)簽
        self.lblcount = wx.StaticText(self.panel, label="數(shù)據(jù)總數(shù)")
        # 定義文本框
        self.txtcount = wx.TextCtrl(self.panel, value='1')  # 默認(rèn)值為1
        # 定義兩個(gè)按鈕
        self.butok = wx.Button(self.panel, label="確定")
        self.butreset = wx.Button(self.panel, label="重置")
 
    # 設(shè)置控件布局
    def layout(self):
        # 設(shè)置第一行的水平布局
        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)
        # 設(shè)置第二行的水平布局
        boxsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer2.Add(self.chkup, border=68, flag=wx.LEFT)
        boxsizer2.Add(self.chklow, border=85, flag=wx.LEFT)
        # 設(shè)置第三行的水平布局
        boxsizer3 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer3.Add(self.chknum, border=68, flag=wx.LEFT)
        boxsizer3.Add(self.chkpnu, border=109, flag=wx.LEFT)
        # 設(shè)置第四行的水平布局
        boxsizer4 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer4.Add(self.chkno, border=68, flag=wx.LEFT)
        boxsizer4.Add(self.chkrexemail, border=110, flag=wx.LEFT)
        # 設(shè)置第五行的水平布局
        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)
        # 設(shè)置第六行的水平布局
        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)
        # 設(shè)置第七行的水平布局
        boxsizer7 = wx.BoxSizer(wx.HORIZONTAL)
        boxsizer7.Add(self.butok, border=68, flag=wx.LEFT)
        boxsizer7.Add(self.butreset, border=109, flag=wx.LEFT)
        # 設(shè)置垂直布局
        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方法將字符串類型轉(zhuǎn)換為對象
        # 執(zhí)行布局設(shè)置
        self.panel.SetSizer(boxsizerFinal)
 
    # 運(yùn)行GUI整體框架
    def eventbind(self):
        # 綁定確定按鈕對應(yīng)的事件
        self.butok.Bind(wx.EVT_BUTTON, self.checkinput)
        self.butreset.Bind(wx.EVT_BUTTON, self.reset)
 
    def checkinput(self, event):
        # 對長度進(jìn)行校驗(yàn)
        # self.checklen()
        lentmp = self.checklen()
        if lentmp == 0:
            # 沒有選擇任何條件,默認(rèn)生成字母串
            chkresult = self.nonemethod()
            # print('是否勾選復(fù)選框', 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)
                # 調(diào)用測試數(shù)據(jù)的顯示
                if self.chkfile.GetValue() == False:
                    # 調(diào)用一個(gè)新窗體,進(jìn)行測試數(shù)據(jù)的顯示
                    self.showdata(strtmp)
                else:
                    # 調(diào)用保存文件方法
                    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)
                # 調(diào)用測試數(shù)據(jù)的顯示
                if self.chkfile.GetValue() == False:
                    # 調(diào)用一個(gè)新窗體,進(jìn)行測試數(shù)據(jù)的顯示
                    self.showdata(strtmp)
                else:
                    # 調(diào)用保存文件方法
                    self.savefile(strtmp)
 
    # 保存文件處理
    def savefile(self, resultdata):
        # 首先判斷文件名文本框是否輸入合法的路徑及文件名內(nèi)容
        filetmp = self.txtfile.GetValue()
        # 判斷是否為空
        if filetmp == "":
            dlg = wx.MessageDialog(None, "請輸入文件名及路徑", "錯(cuò)誤信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
                return 0
        else:
            # 路徑及文件名正確
            # 創(chuàng)建一個(gè)文件
            file = open(filetmp, 'w', newline='')
            write = csv.writer(file)
            tmp = resultdata.split("\n")
            for ele in tmp:
                write.writerow([ele])
            file.close()
 
    # 在新窗口中顯示數(shù)據(jù)
    def showdata(self, resultdata):
        self.windownew = wx.Frame(None, title="顯示測試數(shù)據(jù)", size=(400, 300))
        # 窗口中創(chuàng)建一個(gè)panel
        self.panelnew = wx.Panel(self.windownew)
        # 再定義一個(gè)多行文本框
        wx.TextCtrl(self.panelnew, value=resultdata, style=wx.TE_MULTILINE, size=(400, 300))
        self.windownew.Show(True)
 
    # 校驗(yàn)輸入的數(shù)量
    def checknum(self):
        # 判斷數(shù)量文本框是否為空
        number = int(self.txtcount.GetValue())
        if number == "" or number < 1:
            # 彈出錯(cuò)誤提示框
            dlg = wx.MessageDialog(None, "請輸入數(shù)量為大于等于1的整數(shù)!", "錯(cuò)誤信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
                return 0
        else:
            return number
 
    # 根據(jù)選擇的組成條件生成數(shù)據(jù)
    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))
        # 獲取子串,前面的條件至少選擇一個(gè)
        if strtmp != "":
            resultdata = ''.join(random.sample(strtmp, num))
        else:
            # 如果其他條件都沒有選擇,默認(rèn)調(diào)用生成字母串
            resultdata = self.createdata()
        # 添加一個(gè)序號
        if 'no' in self.chkList:
            resultdata = str(self.no) + "、" + resultdata
        if 'email' in self.chkList:
            # 任意取出一個(gè)郵箱后綴
            eml = random.choice(rexemail)
            resultdata = resultdata + eml
        # print(resultdata)
        return resultdata
 
    # 對界面輸入進(jìn)行校驗(yàn)
    def checklen(self):
        minlen = self.txtminlen.GetValue()
        maxlen = self.txtmaxlen.GetValue()
        self.minlen = minlen.strip()  # 去除左右空格方法
        self.maxlen = maxlen.strip()
        # 判斷最小長度文本框中輸入的內(nèi)容是否為空
        if self.minlen == "":
            # 給出提示,最小長度不能為空
            dlg = wx.MessageDialog(None, "最小長度不能為空!", "錯(cuò)誤信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
        # 判斷最大長度文本框中輸入的內(nèi)容是否為空
        elif self.maxlen == "":
            # 給出提示,最小長度不能為空
            dlg = wx.MessageDialog(None, "最大長度不能為空!", "錯(cuò)誤信息", 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, "最小長度不能大于最大長度!", "錯(cuò)誤信息", wx.YES_DEFAULT | wx.ICON_QUESTION)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
        else:
            return 0
        return 1
 
    # 沒有選中任何check框生成字母串
    def nonemethod(self):
        # 把check框的選項(xiàng)放入列表中
        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)
        # 判斷l(xiāng)ist列表是否為空
        if len(self.chkList) == 0:
            return 0
        else:
            return 1
 
    # 把界面所有輸入內(nèi)容清空
    def reset(self, event):
        dlg = wx.MessageDialog(None, "是否確定要清空信息?", "清空確認(rèn)信息", 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()
 
    # 創(chuàng)建測試數(shù)據(jù)
    def createdata(self):
        str = ""
        # 按照指定長度生成測試數(shù)據(jù)
        # 生成隨機(jī)數(shù)
        num = random.randint(int(self.minlen), int(self.maxlen))
        # 默認(rèn)生成字母串
        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)
        # 運(yùn)行程序
        self.app.MainLoop()
 
 
if __name__ == '__main__':
    guiObj = GUI_CreateTestData()
    guiObj.layout()
    guiObj.eventbind()
    guiObj.run()

運(yùn)行結(jié)果如下:

 到此這篇關(guān)于Python-GUI wxPython之自動(dòng)化數(shù)據(jù)生成器的項(xiàng)目實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python wxPython自動(dòng)化生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用python 爬蟲抓站的一些技巧總結(jié)

    使用python 爬蟲抓站的一些技巧總結(jié)

    這篇文章主要介紹了用 python 爬蟲抓站的一些技巧總結(jié),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python 實(shí)現(xiàn)交換矩陣的行示例

    Python 實(shí)現(xiàn)交換矩陣的行示例

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)交換矩陣的行示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python基礎(chǔ)教程之五種數(shù)據(jù)類型詳解

    python基礎(chǔ)教程之五種數(shù)據(jù)類型詳解

    這篇文章主要介紹了python基礎(chǔ)教程之五種數(shù)據(jù)類型詳解的相關(guān)資料,這里對Python 的數(shù)據(jù)類型進(jìn)行了詳細(xì)介紹,需要的朋友可以參考下
    2017-01-01
  • Python詳解argparse參數(shù)模塊之命令行參數(shù)

    Python詳解argparse參數(shù)模塊之命令行參數(shù)

    這篇文章主要介紹了Python詳解argparse參數(shù)模塊之命令行參數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考下面文章詳解
    2022-07-07
  • 使用plt.bar柱狀圖減小柱子之間的間隔問題

    使用plt.bar柱狀圖減小柱子之間的間隔問題

    這篇文章主要介紹了使用plt.bar柱狀圖減小柱子之間的間隔問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Django中Middleware中的函數(shù)詳解

    Django中Middleware中的函數(shù)詳解

    這篇文章主要介紹了Django中Middleware中的函數(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 在樹莓派2或樹莓派B+上安裝Python和OpenCV的教程

    在樹莓派2或樹莓派B+上安裝Python和OpenCV的教程

    這篇文章主要介紹了在樹莓派2或樹莓派B+上安裝Python和OpenCV的教程,主要基于GTK庫,并以Python2.7和OpenCV 2.4.X版本的安裝作為示例,需要的朋友可以參考下
    2015-03-03
  • 跟老齊學(xué)Python之玩轉(zhuǎn)字符串(2)

    跟老齊學(xué)Python之玩轉(zhuǎn)字符串(2)

    上一篇文章章中已經(jīng)講到連接兩個(gè)字符串的一種方法,本文繼續(xù)講訴連接字符串的方法2,字符串復(fù)制,字符串長度,字符大小寫的轉(zhuǎn)換,希望對大家有所幫助。
    2014-09-09
  • 自動(dòng)在Windows中運(yùn)行Python腳本并定時(shí)觸發(fā)功能實(shí)現(xiàn)

    自動(dòng)在Windows中運(yùn)行Python腳本并定時(shí)觸發(fā)功能實(shí)現(xiàn)

    講一下在Python中寫好了一個(gè)腳本之后,怎么自動(dòng)雙擊一個(gè)程序自動(dòng)就跑起來。以及,怎么在Windows 10中設(shè)計(jì)定期定時(shí)觸發(fā)并跑腳本,有需要的朋友可以參考下
    2021-09-09
  • 基于Python實(shí)現(xiàn)PPT合并小工具

    基于Python實(shí)現(xiàn)PPT合并小工具

    在日常工作和學(xué)習(xí)中,如果需要將多個(gè)PPT文件合并成一個(gè)文件,手動(dòng)操作可能會(huì)非常繁瑣和耗時(shí),所以本文將使用Python制作一個(gè)簡單的PPT合并小工具,希望對大家有所幫助
    2024-01-01

最新評論