美文网首页投资wxpython
wxPython学习——写一个文本编辑器

wxPython学习——写一个文本编辑器

作者: lvxy_js | 来源:发表于2018-12-13 18:32 被阅读0次

    wxPython简介

    wxPython是一个用于创建桌面GUI应用程序的跨平台工具包。wxPython的主要作者是Robin Dunn。使用wxPython,开发人员可以在Windows,Mac和各种Unix系统上创建应用程序。wxPython是wxWidgets的包装器,它是一个成熟的跨平台C ++库。

    wxPython API文档:https://docs.wxpython.org/

    安装wxPython

    pip 是 Python 的包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。在Python官网下载较新版本的Python,就会自带pip。

    输入命令行指令:

    pip install wxpython
    

    wxFormBuilder

    wxFormBuilder是一款基于wxWidgets的GUI可视化编辑工具,可用于Python的GUI设计。

    wxFormBuilder项目GitHUb:www.wxformbuilder.org/

    下载地址:wxFormBuilder_win32.zip

    第一个wxPython程序

    接下来,我们借助wxFormBuiler来编写一个简单的文本编辑器以此来熟悉wxPython的使用。

    • 第一步,打开wxFormBuilder,可见到如下界面。

    界面主要分为四大区:项目区Object Tree、控件区Component Palette、编辑区Editor、属性区Object Properties。

    控件区里点击添加需要的控件,这些控件的效果会在编辑区里实时显示,并在属性区显示这些控件的属性,项目区用于显示控件间的层级关系。

    • 第二步,让我们开始创建一个GUI的基础框架,先从控件区里的Forms中添加一个Frame,这是GUI的轮廓基础:

    *第三步是在Frame下添加一个Layout中的wxBoxSizer,后续所有控件均是放在wxBoxSizer里的。

    如果你觉得单个wxBoxSizer里的控件布局太单调,你可以嵌套使用wxBoxSizer,这是实现GUI界面控件布局多样化的关键。

    本次编写的文本编辑器就嵌套了wxBoxSizer,需要在第一个wxBoxSizer中再添加一个wxBoxSizer:

    接着在右侧的属性区修改其相关的属性,将bSizer2的orient改为wxHORIZONTZL,proportion改为0。

    这样bSizer2中的控件就变成水平排列的了,而且bSizer2在bSizer1中的比例为保持bSizer2中的控件大小,具体的效果会在后面显示出来:

    • 第四步,在bSizer2中添加Common中的1个wxTextCtrl,2个wxButton:

    现在就能看到第三步中对bSizer2的orient和proportion属性设置的效果了,三个控件依次水平排列,且整个bSizer2的高度是与其中控件高度有关的。

    接下来分别修改m_textCtrl1、m_button和m_button2的属性,将其name依次改名为filePath、open和save,将textCtrl的proportion改为1,两个button的label改为“打开”和“保存”,最终效果为:

    • 第五步,在bSizer1下再添加一个wxTextCtrl,并将name修改为content,proportion改为1,flag下勾选wx.EXPAND,其效果为:

    flag=wx.EXAPND和proportion=1使得整个文本框填充了bSizer1的剩余空间,这样一个文本编辑框的UI就初步完成了。

    接下点击Editor下的Python标签,就能看到UI对应的源码了,将其复制起来:

    打开你的python IDE,创建一个project,将源码粘贴到里面。

    MyFrame1添加两个方法,分别用来打开和保存文本,需传入event来绑定按键:

        def open(self, event): # 打开文件
            # 弹出文件选择对话框
            dlg = wx.FileDialog(self, u'选择要打开的txt文件', style=wx.DD_DEFAULT_STYLE)
            if dlg.ShowModal() == wx.ID_OK: 
                # 按下OK后的逻辑
                self.fileName.SetValue(dlg.GetPath()) # 将选择文件的路径输出到fileName里
                file = open(self.fileName.GetValue()) # 以只读打开选中文件
                self.textEdit.SetValue(file.read()) # 将文件中的文本输出到textEdit里
                file.close() # 关闭文件
            dlg.Destroy() # 关闭对话框
    
        def save(self, event): # 保存文件
            file = open(self.fileName.GetValue(), 'w') # 打开选中文件,可编辑
            file.write(self.textEdit.GetValue()) # 将textEdit中的文本写入文件
            file.close() # 关闭文件
    

    MyFrame1.__init__()下为两个方法绑定对应按键:

    self.openFile.Bind(wx.EVT_BUTTON, self.open)
    self.saveFile.Bind(wx.EVT_BUTTON, self.save)
    

    在此python文件下添加以下代码:

    if __name__ == '__main__':
        app = wx.App() # 创建一个应用程序对象。每个wxPython程序必须有一个应用程序对象。
    
        frame = MyFrame1(None) # 创建一个MyFrame1对象
        frame.Show() # 调用该对象的 Show()方法以在屏幕上实际显示它
         # 进入主循环。主循环是一个无尽的循环。它捕获并发送应用程序生命周期中存在的所有事件。
        app.MainLoop() 
       
    

    到此,一个文本编辑器就写完了,运行效果如下:

    源码

    # -*- coding: utf-8 -*-
    
    import wx
    
    ###########################################################################
    ## Class MyFrame1
    ###########################################################################
    
    class MyFrame1(wx.Frame):
    
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"文本编辑器", pos=wx.DefaultPosition, size=wx.Size(600, 400),
                              style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
    
            self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
    
            bSizer1 = wx.BoxSizer(wx.VERTICAL)
    
            bSizer2 = wx.BoxSizer(wx.HORIZONTAL)
    
            self.fileName = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer2.Add(self.fileName, 1, wx.ALL, 5)
    
            self.openFile = wx.Button(self, wx.ID_ANY, u"打开", wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer2.Add(self.openFile, 0, wx.ALL, 5)
    
            self.saveFile = wx.Button(self, wx.ID_ANY, u"保存", wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer2.Add(self.saveFile, 0, wx.ALL, 5)
    
            bSizer1.Add(bSizer2, 0, wx.EXPAND, 5)
    
            bSizer3 = wx.BoxSizer(wx.VERTICAL)
    
            self.textEdit = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
            bSizer3.Add(self.textEdit, 1, wx.ALL | wx.EXPAND, 5)
    
            bSizer1.Add(bSizer3, 1, wx.EXPAND, 5)
    
            self.SetSizer(bSizer1)
            self.Layout()
    
            self.Centre(wx.BOTH)
    
            self.openFile.Bind(wx.EVT_BUTTON, self.open)
            self.saveFile.Bind(wx.EVT_BUTTON, self.save)
    
    
        def __del__(self):
            pass
    
        def open(self, event): # 打开文件
            # 弹出文件选择对话框
            dlg = wx.FileDialog(self, u'选择要打开的txt文件', style=wx.DD_DEFAULT_STYLE)
            if dlg.ShowModal() == wx.ID_OK: # 按下OK后的逻辑
                self.fileName.SetValue(dlg.GetPath()) # 将选择文件的路径输出到fileName里
                file = open(self.fileName.GetValue()) # 以只读打开选中文件
                self.textEdit.SetValue(file.read()) # 将文件中的文本输出到textEdit里
                file.close() # 关闭文件
            dlg.Destroy() # 关闭对话框
    
        def save(self, event): # 保存文件
            file = open(self.fileName.GetValue(), 'w') # 打开选中文件,可编辑
            file.write(self.textEdit.GetValue()) # 将textEdit中的文本写入文件
            file.close() # 关闭文件
    
    if __name__ == '__main__':
    
        app = wx.App()
        frame = MyFrame1(None)
        frame.Show()
    
        app.MainLoop()
    

    相关文章

      网友评论

        本文标题:wxPython学习——写一个文本编辑器

        本文链接:https://www.haomeiwen.com/subject/civhzftx.html