python之wxpython模块学习
wxPython简介
wxPython 是一个用于 wxWidgets (用C ++编写)的Python包装器,这是一个流行的跨平台GUI工具包。由Robin Dunn和Harri Pasanen共同开发,wxPython被实现为一个Python扩展模块。
就像wxWidgets一样,wxPython也是一个免费软件。它可以从官方网站http://wxpython.org下载。许多操作系统平台的二进制文件和源代码可在本网站上下载。
wxPython API中的主要模块包括一个核心模块。它由 wxObject 类组成,它是API中所有类的基础。控制模块包含GUI应用程序开发中使用的所有小部件。例如,wx.Button,wx.StaticText(类似于标签),wx.TextCtrl(可编辑文本控件)等。
wxPython API具有GDI(图形设备接口)模块。它是一组用于绘制小部件的类。像字体,颜色,画笔等类是其中的一部分。所有容器窗口类都在Windows模块中定义。
wxPython的官方网站也承载了Phoenix项目 - 一个用于Python3的wxPython的新实现。它侧重于提高速度,可维护性和可扩展性。该项目始于2012年,目前仍处于测试阶段。
创建一个GUI程序
1.需求描述
1、文件内容显示文本框:只读属性(不能输入文件及路径内容)
2、点击执行按钮:校验检查配置文件文本框中是否存在内容,如果没有选择文件内容时,要进行提示。如果有文件内容可以进行执行。
3、重置按钮:将文件文本框中的内容清空
4、退出按钮:关闭窗体
5、表格形式测试报告:单选按钮(如果脚本是非 unittest 框架编写模式)
6、Html 形式测试报告:单选按钮(只支持 unittest 框架编写的脚本)
7、只有选中了表格形式测试报告,才会出现 bug 报告的选择项,如果没有选中表格形式测试报告,不出现 bug 报告的选择项。
8、默认不选择 bug 报告
9、只有当选择“生成 bug 报告”,才会出现是否“发送 bug 报告”的复选框
10、选中发送 bug 后,在点击执行按钮后,把 bug 报告发送给开发人员(方式 1:把同一份 bug 报告,发送给所有的开发;方式 2:对应的 bug 信息只发送给对应的开发)
class UITestFrame:
# 定义初始化方法,设置界面属性
def __init__(self):
# 定义Application类的一个对象
self.app = wx.App()
# 创建一个顶级窗口作为wx.Frame类的对象。标题和大小参数在构造函数中给出。
self.window = wx.Frame(None, title='测试框架V1.0', size=(500, 300))
# 将一个Panel对象放入框架中, 用来管理空间布局
self.panel = wx.Panel(self.window)
# 添加一个StaticText对象以在窗口内的所需位置显示'测试框架配置文件',pos指定显示的位置
self.lbl_file = wx.StaticText(self.panel, label='测试框架配置文件', pos=(10,10))
# 添加一个文本框,wx.TE_READONLY设置该文本框为只读属性
style=wx.TE_MULTILINE为多行显示
self.text_file = wx.TextCtrl(self.panel, size=(200, 25), style=wx.TE_READONLY)
# 添加一个按钮
self.but_open = wx.Button(self.panel, label='打开')
self.but_run = wx.Button(self.panel, label='执行')
self.but_reset = wx.Button(self.panel, label='重置')
self.but_quit = wx.Button(self.panel, label='退出')
# 定义配置文件属性
self.file_path = ''
# 定义测试报告生成的方式
self.csv_report = wx.RadioButton(self.panel, 1, '表格形式测试报告')
# 默认生成csv报告
self.csv_report.SetValue(1)
self.html_report = wx.RadioButton(self.panel, 2, 'html形式测试报告(只支持unit test框架)')
# 定义生成bug报告复选框
self.bug_report = wx.CheckBox(self.panel, label='是否生成bug报告')
# 定义发送bug复选框
self.send_bug_report = wx.CheckBox(self.panel, label='是否发送bug报告')
self.send_bug_report.Show(False)
# UI布局方法
def ui_layout(self):
# 测试框架配置文件,文本框,打开按钮水平布局
boxsize1 = wx.BoxSizer() # 默认水平布局
boxsize1.Add(self.lbl_file, flag=wx.TOP | wx.LEFT, border=20)
boxsize1.Add(self.text_file, flag=wx.ALL, proportion=1, border=20) # proportion=1表示平铺展示,随着窗口的大小而变化
# 表格形式测试报告,是否生成bug报告
boxsize2 = wx.BoxSizer()
boxsize2.Add(self.csv_report, flag=wx.LEFT, border=40)
boxsize2.Add(self.bug_report, flag=wx.LEFT, border=20)
# 生成HTML报告的单选框,垂直布局
boxsize3 = wx.BoxSizer()
boxsize3.Add(self.html_report, flag=wx.LEFT, border=20)
# 打开 执行 重置 退出按钮 水平布局
boxsize4 = wx.BoxSizer()
boxsize4.Add(self.but_open, flag=wx.ALL, border=10)
boxsize4.Add(self.but_run, flag=wx.ALL, border=10)
boxsize4.Add(self.but_reset, flag=wx.ALL, border=10)
boxsize4.Add(self.but_quit, flag=wx.ALL, border=10)
# bug报告发送复选框
boxsize6 = wx.BoxSizer()
# wx.RESERVE_SPACE_EVEN_IF_HIDDEN即使控件被隐藏了也保留空间的位置
boxsize6.Add(self.send_bug_report, flag=wx.RESERVE_SPACE_EVEN_IF_HIDDEN | wx.TOP, border=20)
# 整体垂直布局垂直显示
boxsize5 = wx.BoxSizer(wx.VERTICAL)
boxsize5.Add(boxsize1, flag=wx.TOP | wx.EXPAND, border=20)
boxsize5.Add(boxsize2)
boxsize5.Add(boxsize6, flag=wx.LEFT, border=180, )
boxsize5.Add(boxsize3, flag=wx.ALL, border=20)
boxsize5.Add(boxsize4, flag=wx.LEFT, border=20)
# 设置boxsizer生效
self.panel.SetSizer(boxsize5)
# UI事件绑定方法
def ui_event(self):
# 绑定执行按钮,点击执行按钮弹出选择文件对话框
self.but_open.Bind(wx.EVT_BUTTON, self.open_file)
# 点击执行按钮,读取csv文件内容
self.but_run.Bind(wx.EVT_BUTTON, self.read_file)
# 点击重置按钮,清空文本框的内容
self.but_reset.Bind(wx.EVT_BUTTON, self.clear_text)
# 点击退出按钮,退出程序
self.but_quit.Bind(wx.EVT_BUTTON, self.quit)
# 点击表格形式测试报告,显示是否生成bug报告
self.csv_report.Bind(wx.EVT_RADIOBUTTON, self.show_bug_report)
# 点击html形式,隐藏是否生成bug报告
self.html_report.Bind(wx.EVT_RADIOBUTTON, self.hidbug_report)
# 点击是否生成bug报告显示是否发送bug报告
self.bug_report.Bind(wx.EVT_CHECKBOX, self.show_send_bug_report)
# 显示发送bug报告
def show_send_bug_report(self, event):
if self.bug_report.GetValue():
self.send_bug_report.Show(True)
else:
self.send_bug_report.Show(False)
# 显示生成bug报告
def show_bug_report(self, event):
if self.csv_report.GetValue():
self.bug_report.Show(True)
# 隐藏生成bug报告
def hidbug_report(self, event):
if self.html_report.GetValue():
self.bug_report.Show(False)
# 打开配置文件方法
def open_file(self, event):
# 设置打开文件对话框
dlg_open = wx.FileDialog(self.panel, message='打开文件', wildcard='*.csv', style=wx.FD_OPEN)
# 选择文件后如果点击确定按钮,把文件的信息放入文本框中
if dlg_open.ShowModal() == wx.ID_OK:
self.file_path = dlg_open.GetPath()
self.text_file.AppendText(self.file_path)
# 读取配置文件的内容
def read_file(self, event):
# 判断文本框内容非空
text = self.text_file.GetValue()
if text == '':
dlg = wx.MessageDialog(None, '必须选择配置文件', '错误提示信息', wx.YES_DEFAULT | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
dlg.Destroy()
return 0
driver = FileReadDriver()
# 判断要生成的报告类型
if self.csv_report.GetValue():
driver.csv_report(self.file_path, self.bug_report.GetValue(), self.send_bug_report.GetValue())
elif self.html_report.GetValue():
driver.html_report(self.file_path)
else:
dlg = wx.MessageDialog(None, '请选择测试报告的生成方式', '错误提示信息', wx.YES_DEFAULT | wx.ICON_QUESTION)
if dlg.ShowModal() == wx.ID_YES:
dlg.Destroy()
# 重置按钮
def clear_text(self, event):
self.text_file.Clear()
# 退出按钮
def quit(self, event):
self.window.Destroy()
# UI显示方法
def ui_show(self):
# 通过show()方法激活框架窗口。
self.window.Show(True)
# 输入Application对象的主事件循环来启动程序
self.app.MainLoop()
# 程序入口
if __name__ == '__main__':
obj = UITestFrame()
obj.ui_layout()
obj.ui_event()
obj.ui_show()
第2个需求
1.点击文件出现打开,关于,退出3个子菜单
2.点击打开按钮,打开文件对话框,可以选择csv文件,点击确定将csv的数据写入文本框内
3.点击关于按钮,弹出谢谢点击关于我们
4.点击退出,退出程序
5.下面的5个按钮没做任何操作
6.文本框,和按钮自适应窗口大小
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title, size=(800,500))
# style=wx.TE_MULTILINE多行文本编辑
self.control = wx.TextCtrl(self, size=(500,300), style=wx.TE_MULTILINE)
# 创建底部标题栏
self.CreateStatusBar()
# 创建子菜单
filemenu= wx.Menu()
# 打开 关于 退出 3个子菜单
menuOpen = filemenu.Append(wx.ID_OPEN, "&打开"," Open a file to edit")
menuItem = filemenu.Append(wx.ID_ABOUT, "关于"," Information about this program")
# 菜单之间的分割线
filemenu.AppendSeparator()
menuExit = filemenu.Append(wx.ID_EXIT,"退出"," Terminate the program")
# 按钮事件绑定
self.Bind(wx.EVT_MENU, self.OnAbout, menuItem)
self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
# 水平布局的BoxSizer里面放了6个按钮
self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
self.buttons = []
for i in range(0, 6):
self.buttons.append(wx.Button(self, -1, "Button &" + str(i)))
self.sizer2.Add(self.buttons[i], 1, wx.EXPAND)
# 多个boxsizer垂直布局
self.sizer = wx.BoxSizer(wx.VERTICAL)
# 1, wx.EXPAND水平方向平铺
self.sizer.Add(self.control, 1, wx.EXPAND)
# 0, wx.EXPAND水平方向不平铺
self.sizer.Add(self.sizer2, 0, wx.EXPAND)
# Layout sizers
self.SetSizer(self.sizer)
self.SetAutoLayout(1)
self.sizer.Fit(self)
self.Show()
# 创建菜单栏
menuBar = wx.MenuBar()
menuBar.Append(filemenu, "文件") # Adding the "filemenu" to the MenuBar
self.SetMenuBar(menuBar) # Adding the MenuBar to the Frame content.
self.Show(True)
def OnAbout(self, event):
dlg = wx.MessageDialog(self, "谢谢点击关于我们", "About Sample Editor", wx.OK)
dlg.ShowModal() # Show it
dlg.Destroy() # finally destroy it when finished.
def OnExit(self, event):
self.Close()
def OnOpen(self, e):
""" Open a file"""
self.dirname = ''
dlg = wx.FileDialog(self, "请选择一个文件", self.dirname, '', "*.csv", wx.FD_OPEN)
if dlg.ShowModal() == wx.ID_OK:
self.filename = dlg.GetFilename()
self.dirname = dlg.GetDirectory()
f = open(os.path.join(self.dirname, self.filename), 'r')
self.control.SetValue(f.read())
f.close()
dlg.Destroy()