窗口

在wx.Python中应用wx.Frame类示意窗口。窗口是一个蕴含多个组件的矩形区域,窗口是程序运行后的容器。

Frame窗口

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

成果:

带工具栏和状态栏的Frame窗口

一个残缺的应用程序窗口通常蕴含菜单、工具栏、状态栏等因素。

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7    def __init__(self): 8        wx.Frame.__init__(self, None, -1, u'自定义窗口', size=(300, 200)) 9        png_save = wx.Image('./icons/save_page.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()10        png_home = wx.Image('./icons/go_home.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()11        png_cfg = wx.Image('./icons/settings.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()12        png_forward = wx.Image('./icons/go_forward.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()13        png_back = wx.Image('./icons/go_back.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()14        toolbar = self.CreateToolBar(wx.TB_HORIZONTAL | wx.TB_TEXT)  # 创立工具栏15        toolbar.AddSimpleTool(100, png_save, "Save page")16        toolbar.AddSimpleTool(200, png_home, "Go home")17        toolbar.AddSimpleTool(220, png_back, "Go back")18        toolbar.AddSimpleTool(230, png_forward, "Go Forward")19        toolbar.AddSimpleTool(400, png_cfg, "Settings")20        toolbar.Realize()21        self.CreateStatusBar()  # 创立状态栏2223if __name__ == '__main__':24    app = wx.PySimpleApp()25    myFrame = MyFrame()26    myFrame.Show()27    app.MainLoop()

成果:

MDI窗口

给MDI窗口增加菜单,并可能在MDI窗口中创立子窗口

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MDIFrame(wx.MDIParentFrame): 7    def __init__(self): 8        wx.MDIParentFrame.__init__(self, None, -1, u"MDI窗口", size=(300, 200)) 9        menubar = wx.MenuBar()  # 增加菜单栏10        menu = wx.Menu()  # 增加菜单11        menu.Append(5000, u"新建(&N)")  # 增加子菜单12        menu.Append(5001, u"退出(&X)")13        menubar.Append(menu, u"文件(&F)")14        self.Bind(wx.EVT_MENU, self.OnNewWindow, id=5000)  # 绑定菜单项的事件15        self.Bind(wx.EVT_MENU, self.OnExit, id=5001)16        self.SetMenuBar(menubar)1718    def OnExit(self, evt):19        self.Close(True)2021    def OnNewWindow(self, evt):22        win = wx.MDIChildFrame(self, -1, u"子窗口")  # 新建子窗口23        win.Show(True)2425if __name__ == '__main__':26    app = wx.PySimpleApp()27    frame = MDIFrame()28    frame.Show()29    app.MainLoop()

成果:

MiniFrame窗口

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MiniFrame(wx.MiniFrame): 7    def __init__(self): 8        wx.MiniFrame.__init__(self, None, -1, u'不能最小化和最大化的窗口', pos=(100, 100), size=(300, 200), 9                              style=wx.DEFAULT_FRAME_STYLE | wx.CLOSE_BOX)10        # 或者sytel = wx.DEFAULT_FRAME_STYLE ^ (wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX))11        panel = wx.Panel(self, -1, size=(300, 200))1213if __name__ == '__main__':14    app = wx.PySimpleApp()15    frame = MiniFrame()16    frame.Show()17    app.MainLoop()

对话框

在wx.Python中对话框都继承自wx.Dialog类。

对话框的创立

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7    def __init__(self): 8        wx.Frame.__init__(self, None, -1, u"自定义对话框", size=(300, 200)) 9        MenuHelp = wx.Menu()10        aboutMenu = MenuHelp.Append(-1, u"对于(&A)")11        menuBar = wx.MenuBar()12        menuBar.Append(MenuHelp, u"帮忙(&H)")13        self.Bind(wx.EVT_TOOL, self.ShowAboutDlg, aboutMenu)14        self.SetMenuBar(menuBar)1516    def ShowAboutDlg(self, event):17        pos = self.GetPosition()18        dialog = MyDialog(self, -1, u"对于")19        dialog.SetPosition((pos[0] + 100, pos[1] + 60))2021class MyDialog(wx.Dialog):22    def __init__(self, parent, id, title):23        wx.Dialog.__init__(self, parent, id, title, size=(100, 100))24        self.panel = wx.Panel(self)25        self.OkBtn = wx.Button(self, 10, u"确定", pos=(8, 20), size=(80, 30))26        self.Bind(wx.EVT_BUTTON, self.CloseDlg, self.OkBtn)27        self.Show()28        # self.ShowModal()2930    def CloseDlg(self, event):31        self.Close()3233if __name__ == '__main__':34    app = wx.PySimpleApp()35    frame = MyFrame()36    frame.Show()37    app.MainLoop()

成果:

提醒对话框

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7    def __init__(self): 8        wx.Frame.__init__(self, None, -1, u"对话框", size=(300, 100)) 9        button = wx.Button(self, wx.ID_OK, u"退出", pos=(10, 10))10        button.SetDefault()11        self.Bind(wx.EVT_BUTTON, self.OnClick, button)1213    def OnClick(self, event):14        # 创立抉择对话框15        dlg = wx.MessageDialog(None, u"是否退出?", u"退出", wx.YES_NO | wx.ICON_QUESTION)16        # 判断用户抉择的返回值17        if (dlg.ShowModal() == wx.ID_YES):18            frame.Close()19        dlg.Destroy()2021if __name__ == '__main__':22    app = wx.PySimpleApp()23    frame = MyFrame()24    frame.Show()25    app.MainLoop()

成果:

文本输出对话框

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7    def __init__(self): 8        wx.Frame.__init__(self, None, -1, "TextEntryDialog", size=(300, 100)) 9        panel = wx.Panel(self, -1)10        self.textCtrl = wx.TextCtrl(panel, -1, "", pos=(10, 10), style=wx.TE_PROCESS_ENTER)11        self.textCtrl.Bind(wx.EVT_TEXT_ENTER, self.OnClick, self.textCtrl)1213    def OnClick(self, evt):14        # 创立文本对话框15        self.dialog = wx.TextEntryDialog(None, u"输出文本", u"文本对话框", "", style=wx.OK | wx.CANCEL)16        if self.dialog.ShowModal() == wx.ID_OK:17            self.textCtrl.SetLabel(self.dialog.GetValue())  # 获取输出文本的内容1819if __name__ == "__main__":20    app = wx.PySimpleApp()21    frame = MyFrame()22    frame.Show()23    app.MainLoop()

成果:

非凡对话框

包含文件关上对话框、字体对话框、色彩抉择对话框等\
关上文件对话框由wx.FileDialog类创立,构造函数如下:

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5import os 6 7def ShowFileDialog(): 8    filterFile = "Python source (*.py)|*.py| All files (*.*)|*.*"  # 过滤文件 9    dialog = wx.FileDialog(None, u"抉择文件", os.getcwd(), "", filterFile, wx.OPEN)10    dialog.ShowModal()11    dialog.Destroy()1213if __name__ == "__main__":14    app = wx.PySimpleApp()15    ShowFileDialog()

成果:

窗口和对话框的交互

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5 6class MyFrame(wx.Frame): 7    def __init__(self): 8        wx.Frame.__init__(self, None, -1, u"对话框的验证", size=(300, 60)) 9        panel = wx.Panel(self, -1)10        sizer = wx.BoxSizer(wx.HORIZONTAL)11        self.addTextCtrl = wx.TextCtrl(panel, -1, "", pos=(10, 10))12        addStaticText = wx.StaticText(panel, -1, "+")13        self.addTextCtrl2 = wx.TextCtrl(panel, -1, "")14        btn = wx.Button(panel, -1, u"计算")15        btn.Bind(wx.EVT_BUTTON, self.OnClick, btn)16        sizer.Add(self.addTextCtrl)17        sizer.Add(addStaticText)18        sizer.Add(self.addTextCtrl2)19        sizer.Add(btn)20        panel.SetSizer(sizer)21        panel.Fit()2223    def OnClick(self, event):24        data = {0: self.addTextCtrl.GetValue(), 1: self.addTextCtrl2.GetValue()}25        dlg = MyDialog(data)26        dlg.ShowModal()27        dlg.Destroy()2829class DataValidator(wx.PyValidator):  # 对话框的验证器30    def __init__(self, data, key):31        wx.PyValidator.__init__(self)32        self.data = data33        self.key = key3435    def Clone(self):  # Clone()办法必须实现36        return DataValidator(self.data, self.key)3738    def Validate(self, win):  # 验证数据39        return True4041    def TransferToWindow(self):  # 对话框关上时调用42        textCtrl = self.GetWindow()43        textCtrl.SetValue(self.data.get(self.key, ""))44        return True4546    def TransferFromWindow(self):  # 对话框敞开时调用47        return True4849class MyDialog(wx.Dialog):50    def __init__(self, data):51        wx.Dialog.__init__(self, None, -1, u"验证器")52        addStaticText = wx.StaticText(self, -1, u"数字1:")53        addStaticText2 = wx.StaticText(self, -1, u"数字2:")54        self.addTextCtrl = wx.TextCtrl(self, validator=DataValidator(data, 0))  # 增加验证55        self.addTextCtrl2 = wx.TextCtrl(self, validator=DataValidator(data, 1))56        btn = wx.Button(self, wx.ID_OK, u"确定")57        btn.Bind(wx.EVT_BUTTON, self.OnClick, btn)58        btn.SetDefault()59        sizer = wx.BoxSizer(wx.VERTICAL)60        gridSizer = wx.FlexGridSizer(2, 2, 5, 5)61        gridSizer.Add(addStaticText, 0, wx.ALIGN_LEFT)62        gridSizer.Add(self.addTextCtrl, 0, wx.EXPAND)63        gridSizer.Add(addStaticText2, 0, wx.ALIGN_LEFT)64        gridSizer.Add(self.addTextCtrl2, 0, wx.EXPAND)65        sizer.Add(gridSizer, 0, wx.EXPAND | wx.ALL, 5)66        sizer.Add(btn, 0, 5)67        self.SetSizer(sizer)68        sizer.Fit(self)6970    def OnClick(self, event):71        result = float(self.addTextCtrl.GetValue()) + float(self.addTextCtrl2.GetValue())72        wx.MessageBox(str(result), u"后果")73        self.Close()7475if __name__ == '__main__':76    app = wx.PySimpleApp()77    frame = MyFrame()78    frame.Show()79    app.MainLoop()

成果:

wxPython库中的高级性能

剪贴板的操作

剪贴板是在各个利用之间替换数据的一种形式,一个应用程序能够将数据保留在剪贴板上,另外一个应用程序能够从剪贴板中获取数据。保留在剪贴板的数据能够是文本、图像或者是其余的文件对象等。

wxPython中的剪贴板对象

解决剪贴板对象

 1#!/usr/bin/python 2# -*- coding: UTF-8 -*- 3 4import wx 5from wx import xrc 6 7class MyApp(wx.App): 8    def OnInit(self): 9        self.res = xrc.XmlResource('clipboard.xrc')  # 从XRC文件中读取界面形容10        self.init_frame()11        return True1213    def init_frame(self):14        self.frame = self.res.LoadFrame(None, 'MyFrame2')15        self.panel = xrc.XRCCTRL(self.frame, 'm_Panel1')16        self.text1 = xrc.XRCCTRL(self.panel, 'm_textCtrl4')17        self.text2 = xrc.XRCCTRL(self.panel, 'm_textCtrl5')18        self.frame.Bind(wx.EVT_BUTTON, self.OnCopy, id=xrc.XRCID('m_button6'))  # 绑定事件19        self.frame.Bind(wx.EVT_BUTTON, self.OnPaste, id=xrc.XRCID('m_button7'))  # 绑定事件20        self.frame.Bind(wx.EVT_BUTTON, self.OnQuit, id=xrc.XRCID('m_button8'))  # 绑定事件21        self.frame.Show()2223    def OnQuit(self, event):24        self.frame.Close(True)2526    def OnCopy(self, event):  # 复制数据到剪贴板中27        data = wx.TextDataObject()28        data.SetText(self.text1.GetValue())29        if wx.TheClipboard.Open():30            wx.TheClipboard.SetData(data)31            wx.TheClipboard.Close()32        else:33            wx.MessageBox("不能关上剪贴板", "谬误")3435    def OnPaste(self, event):  # 从剪贴板中读取数据36        data = wx.TextDataObject()37        success = False38        if wx.TheClipboard.Open():39            success = wx.TheClipboard.GetData(data)40            wx.TheClipboard.Close()41        else:42            wx.MessageBox("不能关上剪贴板", "谬误")4344        if success:45            self.text2.SetValue(data.GetText())46        else:47            wx.MessageBox("格局不匹配", "谬误")4849if __name__ == '__main__':50    app = MyApp(False)51    app.MainLoop()

官网Demo钻研

下载 wxPython3.0-win32-docs-demos-3.0.0.0.exe 装置

装置后进入 wxPython3.0 Docs and Demos\demo 所在目录,能够看到很多官网写的demo

运行形式:python run.py CheckBox.py

运行阐明:python 命令运行 run.py 脚本,而run.py脚本带有参数,该参数指向一个脚本文件,应用run.py脚本运行另外一个脚本。

更多Python技术干货欢送返回公众号【Python编程学习圈】理解,内容具体丰盛,还有大量系统化学习材料以及教程能够收费获取,不要错过啦!