一、实现功能
版本V1:先简单实现窗体的展示,此时标签位置是挤在一起的
版本V2:将标签进行布局,通过定义一个新的方法
版本V3:按钮触发绑定事件
①点击【打开】按钮(打开按钮绑定的是选择文件)。选择文件所在目录,选择csv文件,并将csv文件名展示在文本框中。
②点击【执行】按钮(执行按钮绑定的是读取csv文件)。从文本框获取csv文件地址信息,开始读取csv文件信息,先将csv数据打印出来
版本4:实现重置按钮、退出按钮及校验文本框不为空
二、属性设计和方法设计
界面原型
(1)属性设计:将界面各个元素设为属性
属性 | 设计 | 设计 |
---|---|---|
APP | 通过wx里的APP(),定义APP | |
window | 窗体 | |
panel | 容器 | |
label_file | 静态的标签 | |
txt_file | 文本框 | |
but_open | 打开按钮 | |
but_run | 执行按钮 | |
but_clear | 清空按钮 | |
but_exit | 退出按钮 |
(2)方法设计:
动作 | 方法 |
---|---|
控件布局方法 | UI_Layout |
窗体启动方法 | UI_Show |
按钮触发绑定事件的方法 | UI_Event |
打开文件按钮的绑定事件 | OpenFile |
执行文件按钮的绑定事件 | ReadFile |
重置按钮的绑定事件 | Clear_file |
退出按钮的绑定事件 | Exit_window |
三、最终整合
#此模块设计的是用户图形界面
import csv
import os
import wx
#GUI用户界面启动类
class UI_Frame():
#初始化方法,定义窗体控件及容器
def __init__(self):
#通过wx里的APP(),定义APP
self.APP = wx.App()
#用frame定义窗体,NONE为顶级窗体
self.window =wx.Frame(None,title = "工具", size=(800,300))
#定义panel容器,窗体上一定得要加载panel容器才能添加控件,
#里面的参数是panel属于的窗体
self.panel = wx.Panel(self.window)
#定义窗体上的控件
#一般遵循从左到右,从上到下的原则
#第一个控件:静态的标签,标签文字是通过静态文本框来定义的
#要指定这个label标签属于哪个panel。这个静态标签的有名字,所以label标签为测试框架配置文件
self.label_file = wx.StaticText(self.panel,label = '测试框架配置文件')
#第二个控件:定义文件显示的文本框,并指定这个文本框的所在容器
#设置文本框为只读style = wx.TE_READONLY
self.txt_file = wx.TextCtrl(self.panel,style = wx.TE_READONLY)
#第三个控件:打开按钮
# 并指定打开按钮的所在容器。这个按钮有名字,所以需要加一个label标签,写上按钮的名字
self.but_open = wx.Button(self.panel,label = '打开')
#第四个控件:执行按钮
#并指定打开按钮的所在容器。这个按钮的名字是执行,所以需要加一个label标签,写上按钮的名字
self.but_run = wx.Button(self.panel,label = '执行')
#第五个控件:重置按钮
self.but_clear = wx.Button(self.panel,label = '重置')
#第六个控件,退出按钮
self.but_exit = wx.Button(self.panel,label = '退出')
#定义配置文件名称
self.configfile = ""
#实现控件布局方法
def UI_layout(self):
#定义水平放置的boxsizer1,水平放置的不需要写参数
boxsiaer1 = wx.BoxSizer()
#将指定的控件加入这个boxsizer1
#flag=wx.ALL,ALL为上下左右四个方向设置距离
#border = 10,距离设为10px
boxsiaer1.Add(self.label_file,flag=wx.ALL,border = 30)
boxsiaer1.Add(self.txt_file,proportion = 2,flag=wx.ALL,border = 30)
#定义水平放置的boxsizer2,水平放置的不需要写参数
boxsiaer2 = wx.BoxSizer()
#将指定的控件加入这个boxsizer1
boxsiaer2.Add(self.but_open, flag=wx.ALL, border=30)
boxsiaer2.Add(self.but_run,flag=wx.ALL,border = 30)
boxsiaer2.Add(self.but_clear,flag=wx.ALL,border = 30)
boxsiaer2.Add(self.but_exit,flag=wx.ALL,border = 30)
#定义boxsizer3,垂直放置boxsiaer1,boxsiaer2
boxsiaer3 = wx.BoxSizer(wx.VERTICAL)
#wx.TOP,只设置boxsiaer1上方的距离为10个像素
boxsiaer3.Add(boxsiaer1,flag=wx.TOP|wx.EXPAND,border = 20)
boxsiaer3.Add(boxsiaer2)
#设置让定义好的boxsizer生效
# self.panel.SetSizer(boxsiaer1)
# self.panel.SetSizer(boxsiaer2)
self.panel.SetSizer(boxsiaer3)
#按钮触发绑定事件
def UI_Event(self):
#打开按钮:选择csv文件
self.but_open.Bind(wx.EVT_BUTTON,self.OpenFile)
#执行按钮:开始读取csv文件
self.but_run.Bind(wx.EVT_BUTTON,self.Rundriver)
#重置按钮
self.but_clear.Bind(wx.EVT_BUTTON, self.Clear_file)
#退出按钮
self.but_exit.Bind(wx.EVT_BUTTON, self.Exit_window)
#退出,关闭窗口
def Exit_window(self,event):
self.window.Close()
def Clear_file(self,event):
self.txt_file.SetValue("")
#打开配置csv文件
#注意event参数,点击这个按钮需要触发的事件
def OpenFile(self,event):
#设置打开文件对话框
self.FileDialog_open = wx.FileDialog(self.panel,
message='打开文件',
wildcard='*.csv',
style=wx.FD_OPEN)
if self.FileDialog_open.ShowModal() == wx.ID_OK:
self.txt_file.AppendText(self.FileDialog_open.GetPath())
#从文本框里获取这个csv文件,并保存在这个属性中
self.configfile = self.FileDialog_open.GetPath()
#读取选择的csv文件信息
def Rundriver(self, event):
#执行时,校验本文矿非空
txt_file = self.txt_file.GetValue()
if txt_file=="":
dialog = wx.MessageDialog(None,"请选择csv文件","错误提示",wx.YES_DEFAULT|wx.ICON_QUESTION)
if dialog.ShowModal()==wx.ID_YES:
dialog.Destroy()
return 0
#调用驱动类UI_Driver中读文件的方法
readfile_obj = UI_Driver()
readfile_obj.ReadFile(self.configfile)
#显示窗体
def UI_show(self):
#window窗体调用show方法,参数为true
self.window.Show(True)
#执行这个APP
self.APP.MainLoop()
#定义驱动程序类
class UI_Driver():
#定义读取文件方法
def ReadFile(self,configFile):
file = open(configFile,'r')
table = csv.reader(file)
next(table)
for row in table:
filepath = row[1]
#将读取的数据,执行测试脚本
# 定义命令行的字符串,是一个字符列表,相当于cmd命令里执行这程序
strOS = str('python '+filepath)
os.system(strOS)
if __name__ == '__main__':
OBJ = UI_Frame()
#运行这个窗体界面
OBJ.UI_layout()
#布局完成之后调用按钮事件,OpenFile会自动由UI_Event调用
OBJ.UI_Event()
OBJ.UI_show()