Python学习笔记(GUI编程之wxPython)

窗口
在wx.Python中使用wx.Frame类表示窗口。窗口是一个包含多个组件的矩形区域,窗口是程序运行后的容器。
Frame窗口 Python学习笔记(GUI编程之wxPython)
文章图片
?

1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, u'自定义窗口', size=(300, 100))# 调用父类的初始化方法 9 10if __name__ == '__main__': 11app = wx.PySimpleApp() 12myFrame = MyFrame() 13myFrame.Show() 14app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
带工具栏和状态栏的Frame窗口 一个完整的应用程序窗口通常包含菜单、工具栏、状态栏等要素。
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, u'自定义窗口', size=(300, 200)) 9png_save = wx.Image('./icons/save_page.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() 10png_home = wx.Image('./icons/go_home.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() 11png_cfg = wx.Image('./icons/settings.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() 12png_forward = wx.Image('./icons/go_forward.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() 13png_back = wx.Image('./icons/go_back.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap() 14toolbar = self.CreateToolBar(wx.TB_HORIZONTAL | wx.TB_TEXT)# 创建工具栏 15toolbar.AddSimpleTool(100, png_save, "Save page") 16toolbar.AddSimpleTool(200, png_home, "Go home") 17toolbar.AddSimpleTool(220, png_back, "Go back") 18toolbar.AddSimpleTool(230, png_forward, "Go Forward") 19toolbar.AddSimpleTool(400, png_cfg, "Settings") 20toolbar.Realize() 21self.CreateStatusBar()# 创建状态栏 22 23if __name__ == '__main__': 24app = wx.PySimpleApp() 25myFrame = MyFrame() 26myFrame.Show() 27app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
MDI窗口 Python学习笔记(GUI编程之wxPython)
文章图片
?
给MDI窗口添加菜单,并能够在MDI窗口中创建子窗口
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MDIFrame(wx.MDIParentFrame): 7def __init__(self): 8wx.MDIParentFrame.__init__(self, None, -1, u"MDI窗口", size=(300, 200)) 9menubar = wx.MenuBar()# 添加菜单栏 10menu = wx.Menu()# 添加菜单 11menu.Append(5000, u"新建(&N)")# 添加子菜单 12menu.Append(5001, u"退出(&X)") 13menubar.Append(menu, u"文件(&F)") 14self.Bind(wx.EVT_MENU, self.OnNewWindow, id=5000)# 绑定菜单项的事件 15self.Bind(wx.EVT_MENU, self.OnExit, id=5001) 16self.SetMenuBar(menubar) 17 18def OnExit(self, evt): 19self.Close(True) 20 21def OnNewWindow(self, evt): 22win = wx.MDIChildFrame(self, -1, u"子窗口")# 新建子窗口 23win.Show(True) 24 25if __name__ == '__main__': 26app = wx.PySimpleApp() 27frame = MDIFrame() 28frame.Show() 29app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
MiniFrame窗口 Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MiniFrame(wx.MiniFrame): 7def __init__(self): 8wx.MiniFrame.__init__(self, None, -1, u'不能最小化和最大化的窗口', pos=(100, 100), size=(300, 200), 9style=wx.DEFAULT_FRAME_STYLE | wx.CLOSE_BOX) 10# 或者sytel = wx.DEFAULT_FRAME_STYLE ^ (wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX)) 11panel = wx.Panel(self, -1, size=(300, 200)) 12 13if __name__ == '__main__': 14app = wx.PySimpleApp() 15frame = MiniFrame() 16frame.Show() 17app.MainLoop()

对话框
在wx.Python中对话框都继承自wx.Dialog类。
对话框的创建 Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, u"自定义对话框", size=(300, 200)) 9MenuHelp = wx.Menu() 10aboutMenu = MenuHelp.Append(-1, u"关于(&A)") 11menuBar = wx.MenuBar() 12menuBar.Append(MenuHelp, u"帮助(&H)") 13self.Bind(wx.EVT_TOOL, self.ShowAboutDlg, aboutMenu) 14self.SetMenuBar(menuBar) 15 16def ShowAboutDlg(self, event): 17pos = self.GetPosition() 18dialog = MyDialog(self, -1, u"关于") 19dialog.SetPosition((pos[0] + 100, pos[1] + 60)) 20 21class MyDialog(wx.Dialog): 22def __init__(self, parent, id, title): 23wx.Dialog.__init__(self, parent, id, title, size=(100, 100)) 24self.panel = wx.Panel(self) 25self.OkBtn = wx.Button(self, 10, u"确定", pos=(8, 20), size=(80, 30)) 26self.Bind(wx.EVT_BUTTON, self.CloseDlg, self.OkBtn) 27self.Show() 28# self.ShowModal() 29 30def CloseDlg(self, event): 31self.Close() 32 33if __name__ == '__main__': 34app = wx.PySimpleApp() 35frame = MyFrame() 36frame.Show() 37app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
Python学习笔记(GUI编程之wxPython)
文章图片
?
提示对话框 Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, u"对话框", size=(300, 100)) 9button = wx.Button(self, wx.ID_OK, u"退出", pos=(10, 10)) 10button.SetDefault() 11self.Bind(wx.EVT_BUTTON, self.OnClick, button) 12 13def OnClick(self, event): 14# 创建选择对话框 15dlg = wx.MessageDialog(None, u"是否退出?", u"退出", wx.YES_NO | wx.ICON_QUESTION) 16# 判断用户选择的返回值 17if (dlg.ShowModal() == wx.ID_YES): 18frame.Close() 19dlg.Destroy() 20 21if __name__ == '__main__': 22app = wx.PySimpleApp() 23frame = MyFrame() 24frame.Show() 25app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
【Python学习笔记(GUI编程之wxPython)】Python学习笔记(GUI编程之wxPython)
文章图片
?
文本输入对话框 Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, "TextEntryDialog", size=(300, 100)) 9panel = wx.Panel(self, -1) 10self.textCtrl = wx.TextCtrl(panel, -1, "", pos=(10, 10), style=wx.TE_PROCESS_ENTER) 11self.textCtrl.Bind(wx.EVT_TEXT_ENTER, self.OnClick, self.textCtrl) 12 13def OnClick(self, evt): 14# 创建文本对话框 15self.dialog = wx.TextEntryDialog(None, u"输入文本", u"文本对话框", "", style=wx.OK | wx.CANCEL) 16if self.dialog.ShowModal() == wx.ID_OK: 17self.textCtrl.SetLabel(self.dialog.GetValue())# 获取输入文本的内容 18 19if __name__ == "__main__": 20app = wx.PySimpleApp() 21frame = MyFrame() 22frame.Show() 23app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
Python学习笔记(GUI编程之wxPython)
文章图片
?
特殊对话框 包括文件打开对话框、字体对话框、颜色选择对话框等\
打开文件对话框由wx.FileDialog类创建,构造函数如下:
Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5import os 6 7def ShowFileDialog(): 8filterFile = "Python source (*.py)|*.py| All files (*.*)|*.*"# 过滤文件 9dialog = wx.FileDialog(None, u"选择文件", os.getcwd(), "", filterFile, wx.OPEN) 10dialog.ShowModal() 11dialog.Destroy() 12 13if __name__ == "__main__": 14app = wx.PySimpleApp() 15ShowFileDialog()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
窗口和对话框的交互 Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7def __init__(self): 8wx.Frame.__init__(self, None, -1, u"对话框的验证", size=(300, 60)) 9panel = wx.Panel(self, -1) 10sizer = wx.BoxSizer(wx.HORIZONTAL) 11self.addTextCtrl = wx.TextCtrl(panel, -1, "", pos=(10, 10)) 12addStaticText = wx.StaticText(panel, -1, "+") 13self.addTextCtrl2 = wx.TextCtrl(panel, -1, "") 14btn = wx.Button(panel, -1, u"计算") 15btn.Bind(wx.EVT_BUTTON, self.OnClick, btn) 16sizer.Add(self.addTextCtrl) 17sizer.Add(addStaticText) 18sizer.Add(self.addTextCtrl2) 19sizer.Add(btn) 20panel.SetSizer(sizer) 21panel.Fit() 22 23def OnClick(self, event): 24data = https://www.it610.com/article/{0: self.addTextCtrl.GetValue(), 1: self.addTextCtrl2.GetValue()} 25dlg = MyDialog(data) 26dlg.ShowModal() 27dlg.Destroy() 28 29class DataValidator(wx.PyValidator):# 对话框的验证器 30def __init__(self, data, key): 31wx.PyValidator.__init__(self) 32self.data = data 33self.key = key 34 35def Clone(self):# Clone()方法必须实现 36return DataValidator(self.data, self.key) 37 38def Validate(self, win):# 验证数据 39return True 40 41def TransferToWindow(self):# 对话框打开时调用 42textCtrl = self.GetWindow() 43textCtrl.SetValue(self.data.get(self.key,"")) 44return True 45 46def TransferFromWindow(self):# 对话框关闭时调用 47return True 48 49class MyDialog(wx.Dialog): 50def __init__(self, data): 51wx.Dialog.__init__(self, None, -1, u"验证器") 52addStaticText = wx.StaticText(self, -1, u"数字1:") 53addStaticText2 = wx.StaticText(self, -1, u"数字2:") 54self.addTextCtrl = wx.TextCtrl(self, validator=DataValidator(data, 0))# 添加验证 55self.addTextCtrl2 = wx.TextCtrl(self, validator=DataValidator(data, 1)) 56btn = wx.Button(self, wx.ID_OK, u"确定") 57btn.Bind(wx.EVT_BUTTON, self.OnClick, btn) 58btn.SetDefault() 59sizer = wx.BoxSizer(wx.VERTICAL) 60gridSizer = wx.FlexGridSizer(2, 2, 5, 5) 61gridSizer.Add(addStaticText, 0, wx.ALIGN_LEFT) 62gridSizer.Add(self.addTextCtrl, 0, wx.EXPAND) 63gridSizer.Add(addStaticText2, 0, wx.ALIGN_LEFT) 64gridSizer.Add(self.addTextCtrl2, 0, wx.EXPAND) 65sizer.Add(gridSizer, 0, wx.EXPAND | wx.ALL, 5) 66sizer.Add(btn, 0, 5) 67self.SetSizer(sizer) 68sizer.Fit(self) 69 70def OnClick(self, event): 71result = float(self.addTextCtrl.GetValue()) + float(self.addTextCtrl2.GetValue()) 72wx.MessageBox(str(result), u"结果") 73self.Close() 74 75if __name__ == '__main__': 76app = wx.PySimpleApp() 77frame = MyFrame() 78frame.Show() 79app.MainLoop()

效果:
Python学习笔记(GUI编程之wxPython)
文章图片
?
wxPython库中的高级功能 剪贴板的操作 剪贴板是在各个应用之间交换数据的一种方式,一个应用程序可以将数据保存在剪贴板上,另外一个应用程序可以从剪贴板中获取数据。保存在剪贴板的数据可以是文本、图像或者是其他的文件对象等。
wxPython中的剪贴板对象 Python学习笔记(GUI编程之wxPython)
文章图片
?
处理剪贴板对象 Python学习笔记(GUI编程之wxPython)
文章图片
?
Python学习笔记(GUI编程之wxPython)
文章图片
?
1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5from wx import xrc 6 7class MyApp(wx.App): 8def OnInit(self): 9self.res = xrc.XmlResource('clipboard.xrc')# 从XRC文件中读取界面描述 10self.init_frame() 11return True 12 13def init_frame(self): 14self.frame = self.res.LoadFrame(None, 'MyFrame2') 15self.panel = xrc.XRCCTRL(self.frame, 'm_Panel1') 16self.text1 = xrc.XRCCTRL(self.panel, 'm_textCtrl4') 17self.text2 = xrc.XRCCTRL(self.panel, 'm_textCtrl5') 18self.frame.Bind(wx.EVT_BUTTON, self.OnCopy, id=xrc.XRCID('m_button6'))# 绑定事件 19self.frame.Bind(wx.EVT_BUTTON, self.OnPaste, id=xrc.XRCID('m_button7'))# 绑定事件 20self.frame.Bind(wx.EVT_BUTTON, self.OnQuit, id=xrc.XRCID('m_button8'))# 绑定事件 21self.frame.Show() 22 23def OnQuit(self, event): 24self.frame.Close(True) 25 26def OnCopy(self, event):# 复制数据到剪贴板中 27data = https://www.it610.com/article/wx.TextDataObject() 28data.SetText(self.text1.GetValue()) 29if wx.TheClipboard.Open(): 30wx.TheClipboard.SetData(data) 31wx.TheClipboard.Close() 32else: 33wx.MessageBox("不能打开剪贴板", "错误") 34 35def OnPaste(self, event):# 从剪贴板中读取数据 36data = https://www.it610.com/article/wx.TextDataObject() 37success = False 38if wx.TheClipboard.Open(): 39success = wx.TheClipboard.GetData(data) 40wx.TheClipboard.Close() 41else: 42wx.MessageBox("不能打开剪贴板", "错误") 43 44if success: 45self.text2.SetValue(data.GetText()) 46else: 47wx.MessageBox("格式不匹配", "错误") 48 49if __name__ == '__main__': 50app = MyApp(False) 51app.MainLoop()

官方Demo研究 下载 wxPython3.0-win32-docs-demos-3.0.0.0.exe 安装
安装后进入 wxPython3.0 Docs and Demos\demo 所在目录,可以看到很多官方写的demo
Python学习笔记(GUI编程之wxPython)
文章图片
?
运行方式:python run.py CheckBox.py
运行说明:python 命令运行 run.py 脚本,而run.py脚本带有参数,该参数指向一个脚本文件,使用run.py脚本运行另外一个脚本。
更多Python技术干货欢迎前往公众号【Python编程学习圈】了解,内容详细丰富,还有大量系统化学习资料以及教程可以免费获取,不要错过啦!

    推荐阅读