`

使用python的wxpython仿写window自带的记事本

阅读更多
# -*- coding: utf-8 -*-
import hashlib
import os
import wx
#编辑器主类
"""
记录:menu:Menu
Dialog: MessageDialog,MultiChoiceDialog,NumberEntryDialog,PasswordEntryDialog,PrintDialog,ProgressDialog,SingleChoiceDialog,TextEntryDialog,
FileDialog,FindReplaceDialog,FontDialog
StaticText
 设置style=wx.TE_PASSWORD,可以让wx.TextCtrl变成密码输入框。
 设置style=wx.TE_READONLY,可以让wx.TextCtrl变成只读输入框。
 如果文字过长,wx.TE_DONTWRAP设置强制不换行,wx.TE_LINEWRAP以字符为界断行,wx.TE_WORDWRAP以单词为界断行。
 wx.TextCtrl可以响应wx.EVT_TEXT事件,当输入的内容有变化时即可触发此事件。无论是用户输入引起的变化,还是通过setValue()引起的变化都会触发
 
 
 在wxPython中加速器是一个更加典型的键盘快捷方式,它意味能够随时调用的按键组合,这些按键组合直接触发菜单项。加速器可以用两种方法创建。最简单的方法是,在菜单或菜单项的显示文本中包括加速器按键组合(当菜单或菜单项被添加到其父中时)。实现的方法是,在你的菜单项的文本后放置一个\t。在\t之后定义组合键。组合键的第一部分是一个或多个Alt, Ctrl, 或Shift,由一个+或一个-分隔,随后是实际的加速器按键。例如:New\tctrl-n, SaveAs\tctrl-shift-s。即使在第一部分你只有一个专用的键,你仍可使用+或-来将该部分与实际的按键分隔。这不区分按键组合的大小写。

实际的键可以是任何数字、字母或功能键(如F1~F12),还有表10.6所列出的专用词。

wxPython的方法在通过名字查找一个菜单或菜单项时忽略助记符和加速器。换句话说,对menubar.FindMenuItem("File", "SaveAs")的调用将仍匹配Save as菜单项,即使菜单项的显示名是以Save \tctrl-shift-s形式输入的。

加速器也可能使用加速器表被直接创建,加速器表是类wx.AccleratorTable的一个实例。一个加速器表由wx.AccelratorEntry对象的一个列表组成。wx.AcceleratorTable的构造函数要求一个加速器项的列表,或不带参数。在例10.6中,我们利用了wxPython将隐式使用参数(wx.ACCEL_CTRL, od('Q'),exit.GetId())调用wx.AcceleratorEntry构造函数的事实。wx.AcceleratorEntry的构造函数如下:

wx.AcceleratorEntry(flags, keyCode, cmd)

flags参数是一个使用了一个或多个下列常量的位掩码:wx.ACCEL_ALT, wx.ACCEL_CTRL, wxACCEL_NORMAL , 或wx.ACCEL_SHIFT。该参数表明哪个控制键需要被按下来触发该加速器。keyCode参数代表按下来触发加速器的常规键,它是对应于一个字符的ASCII数字,或在wxWidgets文本中的Keycodes下的一个专用字符。cmd参数是菜单项的wxPython标识符,该菜单项当加速器被调用时触发其命令事件。正如你从例10.6所能看到的,使用这种方法声明一个加速器,不会在这个带菜单项显示名的菜单上列出组合键。你仍需要单独实现它。 
"""
'''
	@Author xiaoshuang
	@Date 2012-05-10
	@Version 0.1
'''
class NotBookMainFrame(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title)
 
        self.tb = self.CreateToolBar()
        self.control = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.TE_LINEWRAP,size=(300,500))
        
        #Alt
        #self.control.Bind(wx.EVT_CHAR, self.OnKeyDown)
       
        # 创建一个状态bar,在window的最下端
        self.sbar = self.CreateStatusBar()
        # 创建菜单栏
        menuB  = self.createMenuBar()
        # set menuBar of app
	self.SetMenuBar(menuB)

        #Ctrl
        acceltbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('Q'), self.selectA.GetId())])
        self.SetAcceleratorTable(acceltbl) 
        
        #frame show
        self.Show(True)
   
    def createMenuBar(self):
        #Menu
        #Append(self, id, text, help, kind)
        fileM = wx.Menu()
        newF = fileM.Append(wx.NewId(),"新建(N)\tCtrl+N","打开一个已存在的文件.")
        fmitem = fileM.Append(wx.NewId(),"打开(O)\tCtrl+O","打开一个已存在的文件.")
        save = fileM.Append(wx.NewId(),  "保存(S)\tCtrl+S","保存当前的文件.")
        toSave = fileM.Append(wx.NewId(),"另存为(A)..","保存当前的文件.")
        fileM.AppendSeparator()
        fileM.Append(wx.NewId(),"页面设置(U)..","设置页面格式.")
        printL = fileM.Append(wx.NewId(),"打印(P)\tCtrl+P","打印页面.")
        fileM.AppendSeparator()
        qit = fileM.Append(wx.NewId(),"退出(X)","关闭所有打开的文件.")
       
        #Bind(self,id,event function,obj)
        self.Bind(wx.EVT_MENU, self.OnNewFile, newF)
        self.Bind(wx.EVT_MENU, self.OnOpen, fmitem)
        self.Bind(wx.EVT_MENU, self.OnSave, save)
        self.Bind(wx.EVT_MENU, self.OnQuit, qit)
        
       
        #编辑
        editM = wx.Menu()
        editM.Append(wx.NewId(),"撤消(U)\tCtrl+Z","撤销最后的操作.")
        editM.AppendSeparator()
        editM.Append(wx.NewId(),"剪切(U)\tCtrl+X","剪切.")
        editM.Append(wx.NewId(),"复制(T)\tCtrl+C","复制.")
        editM.Append(wx.NewId(),"粘贴(C)\tCtrl+V","粘贴.")
        editM.Append(wx.NewId(),"删除(P)\tDel","删除.")
        editM.AppendSeparator()
        editM.Append(wx.NewId(),"查找(F)\tCtrl+F","查找.")
        editM.Append(wx.NewId(),"查找下一个(N)\tF3","查找下一个.")
        editM.Append(wx.NewId(),"删除(P)\tDel","删除.")
        editM.Append(wx.NewId(),"替换(R)\tCtrl+H","替换.")
        editM.Append(wx.NewId(),"转到(G)\tCtrl+G","转到.")
        editM.AppendSeparator()
        self.selectA = editM.Append(wx.NewId(),"全选(A)\tCtrl+A","全选.")
        
        self.Bind(wx.EVT_MENU, self.OnSelectAll, self.selectA)
        
        editM.Append(wx.NewId(),"时间/日期(D)\tF5","时间.")
        #格式[O]
        posM = wx.Menu()
        self.autoCutoverLine = self.newline = posM.Append(wx.NewId(),"自动换行(W)","自动换行.",kind=wx.ITEM_CHECK)
        
        self.Bind(wx.EVT_MENU, self.autoCutoverL, self.autoCutoverLine)
        
        self.showToolStatus = 0;
        posM.Append(wx.NewId(),"字体(F)..","设置字体.")
        #查看[V]
        viewM = wx.Menu()
        viewM.Append(wx.NewId(),"状态栏","状态栏.")
        self.tool=viewM.Append(wx.NewId(),"工具栏","工具栏",kind=wx.ITEM_CHECK)
        self.Bind(wx.EVT_MENU, self.ToggleToolBar, self.tool)
        #帮助[H]
        helpM = wx.Menu()
        helpM.Append(wx.NewId(),"查看帮助(H)","查看帮助.")
        about = helpM.Append(wx.NewId(),"关于记事本(A)","关于记事本.")
        self.Bind(wx.EVT_MENU, self.OnAbout, about)
        #create a menuBar
        menuB = wx.MenuBar()
        # append a menu
        menuB.Append(fileM,"文件(F)")
        menuB.Append(editM,"编辑(E)")
        menuB.Append(posM,"格式[O]")
        menuB.Append(viewM,"查看[V]")
        menuB.Append(helpM,"帮助[H]")
        return menuB
    
    def autoCutoverL(self,event):
        print "hell"
        #设置字体颜色
        #self.control.SetForegroundColour("#F0FFF0")
        self.control.SetStyle(-1,-1,wx.TextAttr("wx.TE_WORDWRAP"))

    def OnSelectAll(self,event):
            self.control.SelectAll()
            
    def OnKeyDown(self,event):
        #按键时相应代码
        # Alt + F
        key = event.GetKeyCode();
        if key == ord('f'):
            self.fileM.Show()
        else:
            self.control.AppendText(chr(key))
    
    #是否显示工具栏
    def ToggleToolBar(self,event):
        self.showToolStatus+=1;
        #if self.newline.IsChecked():
        if self.showToolStatus % 2 == 1:
            print 1111
            self.control.SetInsertionPoint(50)
            self.tb.Show() 
        else:
            print 2222
            self.tb.Hide()
    

    #新建文件
    def OnNewFile(self,event):
        if self.control.IsEmpty() <> True:
            dlg = wx.MessageDialog(self, "是否将更改保存到无标题?","记事本",wx.YES_NO | wx.ICON_QUESTION | wx.CANCEL)
            retCode = dlg.ShowModal()
            if retCode == wx.ID_YES:
                # 保存
                self.OnSave(event)
                # 保存完后,创建新文件
                self.control.SetValue("")
            elif retCode == wx.ID_NO:
                # 清空
                self.control.SetValue("")
            else:
                # 取消
                dlg.Close();
               
            dlg.Destroy()
   
    #保存
    def OnSave(self,event):
        #判断是否有内容
        if self.control.IsEmpty():
            return;
        self.dirname=''
        """ wx.FD_OPEN    
            wx.FD_SAVE    
            wx.FD_OVERWRITE_PROMPT
            wx.FD_MULTIPLE    
            wx.FD_CHANGE_DIR """
        dlg = wx.FileDialog(self,"choose a file",self.dirname,"","*.*",wx.FD_SAVE)
       
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            f = open(os.path.join(self.dirname, self.filename), 'w')
            f.write(self.control.GetValue());
            f.close()
        dlg.Destroy()
        # 重新设置记事本的Title
        self.Title  = self.filename + " - 记事本"
   
    #打开选择文件的dialog
    def OnOpen(self,event):
        print self.control.GetValue()
        self.dirname=''
        self.dirname=''
        """ wx.FD_OPEN    
            wx.FD_SAVE    
            wx.FD_OVERWRITE_PROMPT
            wx.FD_MULTIPLE    
            wx.FD_CHANGE_DIR """
        dlg = wx.FileDialog(self,"choose a file",self.dirname,"","*.*",wx.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()
        self.control.SetFocus()
        wx.StaticText(self.sbar, label=self.filename + ","+ str(self.control.GetNumberOfLines()) + " 行",pos=(0,1))
   
    # 退出   
    def OnQuit(self,event):
        self.Close()
       
    # 关于   
    def OnAbout(self,event):
        dlg = wx.MessageDialog(self, "hello,baby","title is a baby",wx.OK)
        dlg.ShowModal()
        self.control.SelectAll();
        dlg.Destroy()
       
    def OnHello(self, event):
        pass     
      
    #创建按钮
    def createButtonBar(self, panel, yPos = 10):
            xPos = 0
            for eachLabel, eachHandler in self.buttonData():
                    pos = (xPos, yPos)
                    button = self.buildOneButton(panel, eachLabel,eachHandler, pos)
                    xPos += button.GetSize().width
                   
    def buildOneButton(self, parent, label, handler, pos=(0,0)):
        button = wx.Button(parent, -1, label, pos)
        self.Bind(wx.EVT_BUTTON, handler, button)
        return button
   
    #get md5 
    @staticmethod
    def GetMd5(content): 
        #md5 = hashlib.md5() #创建一个MD5加密对象 
        #md5.update(content)  #更新要加密的数据 
        #return md5.digest();  #加密后的结果(二进制) 
        #print md5.hexdigest() #加密后的结果,用十六进制字符串表示。 
        return hashlib.new("md5", content).hexdigest() 
 
if __name__=="__main__":
    app = wx.App(False)
    frame = NotBookMainFrame(None,"无标题 - 记事本")
    app.MainLoop()




图例2


记事本刚刚开始,也只是实现了很少的功能,从中遇到了不少问题。
如果你没事也想学着玩,那咱可以一起来完成功能。共同切磋。一块提高。
如果你有更好,更有意义的桌面应用需要wxpython来写,那我也希望能参与参与。
参考文档:

wxpython的api:http://www.wxpython.org/docs/api/   
活学活用wxPython:http://www.czug.org/python/wxpythoninaction/

接下来空闲的时候想再写个仿CRT远程连接的工具。
分享到:
评论

相关推荐

    python使用wxpython开发简单记事本的方法

    本文实例讲述了python使用wxpython开发简单记事本的方法。分享给大家供大家参考。具体分析如下: wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的...

    wxPython 2.9 for python2.7

    python wxpython python gui

    Python 的WxPython库开源扫雷游戏

    Python WxPython开源扫雷游戏PyMine为开源扫雷游戏PyMine 使用Python语言和WxPython UI框架。本例移植自开源例程JMine 请在程序所在目录使用python PyMine.py启动例程需要先安装Python 3.11和wxPython 4.2Python ...

    Python中使用wxPython开发的一个简易笔记本程序实例

    wxPython将wxWidgets的大部分功能用Python语言重新实现,使得开发者可以使用Python来编写具有本地外观和感觉的桌面应用程序。 在介绍的简易笔记本程序实例中,我们能够实现打开文件、编辑文件内容以及保存文件的...

    Python与wxPython学习资源打包下载

    Python学习资源打包下载,共包含9个文件,7个Python文档+2个wxPython文档: Dive Into Python.chm python-2.7.2.chm Python Programming on Win32 .chm Python核心编程.pdf Python精要参考.pdf Python学习笔记整理....

    Python WxPython开源扫雷游戏PyMine新版1.2

    Python WxPython开源扫雷游戏PyMine新版1.2 ...使用Python语言和WxPython UI框架 本例移植自本人开源例程JMine 请在程序所在目录使用python PyMine.py启动例程 需要先安装Python 2.7和wxPython框架

    python 的wxpython包 及django的文档(3)

    python 的wxpython包 及django的文档 含有wxpython的demo

    python2.4 and wxPython

    wxPython 是一个基于C++的wxWidgets库的Python绑定,它允许开发人员使用Python编写原生GUI(图形用户界面)应用程序。wxWidgets库提供了跨平台的支持,可以在Windows、Linux和macOS等操作系统上运行。wxPython 2.6 ...

    Python+wxpython邮件收发客户端

    用python+wxpython写的一个邮件收发客户端,原来一直用C++,最近一周学习了Python。这个小作品实现了邮件收发(能很好的解码pop3中文),账户管理(增加,删除,编辑,更换)。显示文件内容用了htmlwindow,对网页...

    python + wxPython + SPE

    wxPython是Python的一个GUI(图形用户界面)工具包,它允许开发者使用Python来创建原生外观的跨平台应用程序。在提供的“wxPython2.8-win32-unicode-2.8.12.1-py27.exe”文件中,"win32"表示这是为Windows系统编译的...

    wxPython - Learning Python wxPython - 学习 Python.doc

    ### wxPython - 学习 Python #### 一、Python 为何适合 GUI 开发? Python 作为一门高级编程语言,以其简洁优雅的语法和强大的库支持而闻名。在图形用户界面(GUI)开发领域,Python 同样表现出色,这主要得益于...

    Python WxPython开源扫雷游戏PyMine

    本例为开源扫雷游戏PyMine 使用Python语言和WxPython UI框架 本例移植自本人开源例程JMine 请在程序所在目录使用python PyMine.py启动例程

    python3+wxpython编程教程

    本教程旨在指导读者通过Python 3和wxPython库来学习图形用户界面(GUI)的编程基础。wxPython是一个开源的Python扩展库,基于wxWidgets C++库,它为Python提供了丰富的GUI组件,让开发者能够创建丰富的桌面应用程序。...

    python3+wxpython图书馆管理系统

    python 3 +wxpython 图书馆管理系统,实现了图书的增删改查,借还书显示图书信息等内容,python 3 +wxpython 图书馆管理系统,实现了图书的增删改查,借还书显示图书信息等内容,python 3 +wxpython 图书馆管理系统,实现了...

    基于python+WxPython编程实现扫雷游戏源码.zip

    本例为开源扫雷游戏PyMine 使用Python语言和WxPython UI框架 本例移植自本人开源例程JMine 请在程序所在目录使用python PyMine.py启动例程。需要先安装Python 3.6和wxPython 4.0.3框架 注意,本源码有两个分支,...

    用python-wxPython编写Genesis-Scripts.pdf

    wxPython基于wxWidgets,一个跨平台的C++库,使得Python程序员能够在Windows、Linux和macOS等操作系统上创建桌面应用,且应用看起来和感觉上都像是使用各自操作系统原生的UI组件开发的。这样,Python开发者就可以...

    wxPython4.1文件下载Win64 For Python2.7/Python3.7/Python3.8

    wxPython4.1是该库的一个稳定版本,针对Windows 64位系统进行了优化,同时兼容Python2.7、Python3.7和Python3.8这三个主要的Python版本。 **Python版本兼容性** wxPython4.1的显著特点之一就是对多个Python版本的...

    python UI可视化设计工具(WxPython可视化编辑器)

    WxPython 是一个流行的 Python 库,它提供了原生的跨平台 GUI 工具包,使得开发者可以使用 Python 来创建具有美观外观的应用程序,而无需深入学习底层图形界面编程。 WxPython 可视化编辑器,如其名所示,允许用户...

    python2.7&wxPython

    wxPython是基于Python的一个GUI(图形用户界面)工具包,它允许开发者使用Python来创建原生跨平台的用户界面。wxPython是基于C++的wxWidgets库构建的,可以运行在Windows、Linux和macOS等多个操作系统上。wxPython为...

Global site tag (gtag.js) - Google Analytics