• [Python] wxPython 高防Windows10记事本 (end...)


    1、开始

      接触Python 也有一段时间了,o.o ,断断续续加起来没几天。

      一般新学习一门新语言,除了必先输出一个 Hello World 外,都会以模拟 Windows 记事本来写一个结合自己想法的记事本小程序。

      o.o ,玩了这么久是该写点什么。

    2、构建菜单栏

      o.o ,浪了 浪了,仿着 记事本 构建了下菜单 ,还没绑定事件。

      搭建了下 代码的整体框架方向,完成了菜单栏的布局,接下来就是绑定事件了。

      效果图:

      

      该阶段时滴代码:

     1 #coding:utf-8
     2 #acthor:Twobox
     3 
     4 import wx
     5 
     6 class Mywin(wx.Frame):
     7     def __init__(self, parent, title):
     8         super(Mywin, self).__init__(parent, title = title)
     9         self.InitUI()
    10 
    11     def InitUI(self):
    12         self.InitUIMenuBar()
    13         self.SetSize((400,600))
    14         self.Center()
    15         self.Show()
    16 
    17     def InitUIMenuBar(self):
    18         menuBar = wx.MenuBar()
    19 
    20         # 构造 文件 菜单
    21         fileMenu = wx.Menu()
    22 
    23         newItem = wx.MenuItem(fileMenu, id=wx.ID_NEW, text="新建(N)	Ctrl+N", kind=wx.ITEM_NORMAL)
    24         openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(O)...	Ctrl+O", kind=wx.ITEM_NORMAL)
    25         saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(S)	Ctrl+S", kind=wx.ITEM_NORMAL)
    26         saveasItem = wx.MenuItem(fileMenu, id=wx.ID_SAVEAS, text="另存为(A)...", kind=wx.ITEM_NORMAL)
    27 
    28         fileMenu.AppendItem(newItem)
    29         fileMenu.AppendItem(openItem)
    30         fileMenu.AppendItem(saveItem)
    31         fileMenu.AppendItem(saveasItem)
    32         fileMenu.AppendSeparator()
    33 
    34         exitItem = wx.MenuItem(fileMenu, id=wx.ID_EXIT, text="退出(X)", kind=wx.ITEM_NORMAL)
    35         fileMenu.AppendItem(exitItem)
    36 
    37         menuBar.Append(fileMenu, title="文件(F)")
    38 
    39         # 构建 编辑 菜单
    40         deitMenu = wx.Menu()
    41 
    42         deitMenu.Append(id=21, item="撤销(U)	Ctrl+Z", kind=wx.ITEM_NORMAL)
    43         deitMenu.AppendSeparator()
    44         deitMenu.Append(id=wx.ID_CUT, item="剪切(T)	Ctrl+X", kind=wx.ITEM_NORMAL)
    45         deitMenu.Append(id=wx.ID_COPY, item="复制(C)	Ctrl+C", kind=wx.ITEM_NORMAL)
    46         deitMenu.Append(id=wx.ID_PASTE, item="粘贴(P)	Ctrl+V", kind=wx.ITEM_NORMAL)
    47         deitMenu.Append(id=wx.ID_DELETE, item="删除(L)	Del", kind=wx.ITEM_NORMAL)
    48         deitMenu.AppendSeparator()
    49         deitMenu.Append(id=wx.ID_FIND, item="查找(F)...	Ctrl+F", kind=wx.ITEM_NORMAL)
    50         deitMenu.Append(id=27, item="查找下一个(N)	F3")
    51         deitMenu.Append(id=wx.ID_REPLACE, item="替换(R)...	Ctrl+H")
    52         deitMenu.Append(id=29, item="转到(G)	Ctrl+G")
    53         deitMenu.AppendSeparator()
    54         deitMenu.Append(id=wx.ID_SELECTALL, item="全选(A)	Ctrl+A")
    55         deitMenu.Append(id=211, item="时间/日期(D)	F5")
    56 
    57         menuBar.Append(deitMenu, title="编辑(E)")
    58 
    59         #构建 格式 菜单
    60         formatMenu = wx.Menu()
    61 
    62         formatMenu.Append(id = 31, item = "自动换行(W)", kind = wx.ITEM_CHECK)
    63         formatMenu.Append(id = 32, item = "字体(F)...")
    64 
    65         menuBar.Append(formatMenu, title = "格式(O)")
    66 
    67         #构建 查看 菜单
    68         seeMenu = wx.Menu()
    69 
    70         seeMenu.Append(id = 41, item = "状态栏(S)", kind = wx.ITEM_CHECK)
    71 
    72         menuBar.Append(seeMenu, title = "查看(V)")
    73 
    74         #构建 帮助 菜单
    75         helpMenu = wx.Menu()
    76 
    77         helpMenu.Append(id = wx.ID_HELP, item = "查看帮助(H)")
    78         helpMenu.Append(id = wx.ID_ABOUT, item = "关于记事本(A)")
    79 
    80         menuBar.Append(helpMenu, title = "帮助(H)")
    81 
    82         self.SetMenuBar(menuBar)
    83 
    84 def main():
    85     print("GO...")
    86     app = wx.App()
    87     Mywin(None, "无标题 - 记事本")
    88     app.MainLoop()
    89     exit(0)
    90 
    91 if __name__ == "__main__":
    92     main()
    View Code

    3、完成 编辑框与状态栏

      本还想把一些时间也完成一下,但一直在就纠结 (ˉ▽ˉ;)...

      干脆这下把界面都完成以下 ,后面再一点一点完成事件算啦~~。

      效果图:

      

      该阶段时滴代码:

      1 #coding:utf-8
      2 #acthor:Twobox
      3 
      4 import wx
      5 
      6 class Mywin(wx.Frame):
      7     def __init__(self, parent, title):
      8         super(Mywin, self).__init__(parent, title = title)
      9         self.InitUI()
     10 
     11     def InitUI(self):
     12         self.initUIMenuBar()            # 初始化 菜单栏
     13         self.initUIStatusBar()          # 初始化 状态栏
     14         self.initUIMainWindow()         # 构建 窗口面板
     15         self.adjustmentWin()            # 调整 窗口框体参数
     16 
     17     def initUIMainWindow(self):
     18         panel = wx.Panel(self)
     19         vbox = wx.BoxSizer(wx.VERTICAL)
     20 
     21         self.textBox = wx.TextCtrl(panel, id = -1, style = wx.TE_MULTILINE)
     22         # self.textBox.Bind(wx.EVT_TEXT, self.eventTextCtrl)
     23         vbox.Add(self.textBox, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
     24 
     25         panel.SetSizer(vbox)
     26 
     27     def initUIStatusBar(self):
     28         # 实例化一个 状态栏 对象
     29         self.statusBar = wx.StatusBar(parent = self, id = -1)
     30         self.statusBar.SetFieldsCount(2)
     31         self.statusBar.SetStatusWidths([-3.9, -1])
     32         self.statusBar.SetStatusText("  第 1 行 , 第 1 列", 1)
     33         self.SetStatusBar(self.statusBar)
     34         self.statusBar.Show(True)
     35 
     36     def adjustmentWin(self):
     37         self.SetSize((400, 600))
     38         self.Center()
     39         self.Show()
     40 
     41     def initUIMenuBar(self):
     42         menuBar = wx.MenuBar()
     43 
     44         # 构造 文件 菜单
     45         fileMenu = wx.Menu()
     46 
     47         newItem = wx.MenuItem(fileMenu, id=wx.ID_NEW, text="新建(N)	Ctrl+N", kind=wx.ITEM_NORMAL)
     48         openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(O)...	Ctrl+O", kind=wx.ITEM_NORMAL)
     49         saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(S)	Ctrl+S", kind=wx.ITEM_NORMAL)
     50         saveasItem = wx.MenuItem(fileMenu, id=wx.ID_SAVEAS, text="另存为(A)...", kind=wx.ITEM_NORMAL)
     51 
     52         fileMenu.AppendItem(newItem)
     53         fileMenu.AppendItem(openItem)
     54         fileMenu.AppendItem(saveItem)
     55         fileMenu.AppendItem(saveasItem)
     56         fileMenu.AppendSeparator()
     57 
     58         exitItem = wx.MenuItem(fileMenu, id=wx.ID_EXIT, text="退出(X)", kind=wx.ITEM_NORMAL)
     59         fileMenu.AppendItem(exitItem)
     60 
     61         menuBar.Append(fileMenu, title="文件(&F)")
     62 
     63         # 构建 编辑 菜单
     64         deitMenu = wx.Menu()
     65 
     66         deitMenu.Append(id=21, item="撤销(U)	Ctrl+Z", kind=wx.ITEM_NORMAL)
     67         deitMenu.AppendSeparator()
     68         deitMenu.Append(id=wx.ID_CUT, item="剪切(T)	Ctrl+X", kind=wx.ITEM_NORMAL)
     69         deitMenu.Append(id=wx.ID_COPY, item="复制(C)	Ctrl+C", kind=wx.ITEM_NORMAL)
     70         deitMenu.Append(id=wx.ID_PASTE, item="粘贴(P)	Ctrl+V", kind=wx.ITEM_NORMAL)
     71         deitMenu.Append(id=wx.ID_DELETE, item="删除(L)	Del", kind=wx.ITEM_NORMAL)
     72         deitMenu.AppendSeparator()
     73         deitMenu.Append(id=wx.ID_FIND, item="查找(F)...	Ctrl+F", kind=wx.ITEM_NORMAL)
     74         deitMenu.Append(id=27, item="查找下一个(N)	F3")
     75         deitMenu.Append(id=wx.ID_REPLACE, item="替换(R)...	Ctrl+H")
     76         deitMenu.Append(id=29, item="转到(G)	Ctrl+G")
     77         deitMenu.AppendSeparator()
     78         deitMenu.Append(id=wx.ID_SELECTALL, item="全选(A)	Ctrl+A")
     79         deitMenu.Append(id=211, item="时间/日期(D)	F5")
     80 
     81         menuBar.Append(deitMenu, title="编辑(&E)")
     82 
     83         #构建 格式 菜单
     84         formatMenu = wx.Menu()
     85 
     86         formatMenu.Append(id = 31, item = "自动换行(W)", kind = wx.ITEM_CHECK)
     87         formatMenu.Append(id = 32, item = "字体(F)...")
     88 
     89         menuBar.Append(formatMenu, title = "格式(&O)")
     90 
     91         #构建 查看 菜单
     92         seeMenu = wx.Menu()
     93 
     94         seeMenu.Append(id = 41, item = "状态栏(&S)", kind = wx.ITEM_CHECK)
     95 
     96         menuBar.Append(seeMenu, title = "查看(&V)")
     97 
     98         #构建 帮助 菜单
     99         helpMenu = wx.Menu()
    100 
    101         helpMenu.Append(id = wx.ID_HELP, item = "查看帮助(H)")
    102         helpMenu.Append(id = wx.ID_ABOUT, item = "关于记事本(A)")
    103 
    104         menuBar.Append(helpMenu, title = "帮助(&H)")
    105 
    106         self.SetMenuBar(menuBar)
    107 
    108     # 以下是 绑定的事件
    109     # def eventTextCtrl(self, event):
    110         # print(self.textBox.Get)
    111 
    112 def main():
    113     print("GO...")
    114     app = wx.App()
    115     Mywin(None, "无标题 - 记事本")
    116     app.MainLoop()
    117     exit(0)
    118 
    119 if __name__ == "__main__":
    120     main()
    View Code

    4、完成了一小部分功能

      1、完成 帮助菜单 下的 查看帮助项 与 关于记事本项

        查看帮助项:为单击后跳转帮助页面,win10是跳转到微软官网,我就跳转到咱博客啦~

        关于记事本项:显示 记事本与作者相关信息的一个 确定消息窗口。

      2、检查框 确定是否显示 状态栏

        

      3、注册 菜单热键,即按下 Alt+字母下有下划线的字母,实现键盘点击

        

       该阶段时滴代码:

      1 # encoding: utf-8
      2 # acthor: Twobox
      3 
      4 import wx
      5 import webbrowser
      6 
      7 class Mywin(wx.Frame):
      8     """Author: Twobox"""
      9     about = """
     10     作者:Twobox
     11     扣扣:200562421
     12     源码共享博客:http://www.cnblogs.com/Twobox/
     13     """
     14     def __init__(self, parent, title):
     15         super(Mywin, self).__init__(parent, title = title)
     16         self.InitUI()
     17 
     18     def InitUI(self):
     19         self.initUIMenuBar()            # 初始化 菜单栏
     20         self.initUIStatusBar()          # 初始化 状态栏
     21         self.initUIMainWindow()         # 构建 窗口面板
     22         self.adjustmentWin()            # 调整 窗口框体参数
     23 
     24     def initUIMainWindow(self):
     25         panel = wx.Panel(self)
     26         vbox = wx.BoxSizer(wx.VERTICAL)
     27 
     28         self.textBox = wx.TextCtrl(panel, id = -1, style = wx.TE_MULTILINE)
     29         # self.textBox.Bind(wx.EVT_TEXT, self.eventTextCtrl)
     30         vbox.Add(self.textBox, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
     31 
     32         panel.SetSizer(vbox)
     33 
     34     def initUIStatusBar(self):
     35         # 实例化一个 状态栏 对象
     36         self.statusBar = wx.StatusBar(parent = self, id = -1)
     37         self.statusBar.SetFieldsCount(2)
     38         self.statusBar.SetStatusWidths([-3.9, -1])
     39         self.statusBar.SetStatusText("  第 1 行 , 第 1 列", 1)
     40         self.SetStatusBar(self.statusBar)
     41         self.statusBar.Show(True)
     42 
     43     def adjustmentWin(self):
     44         self.SetSize((400, 600))
     45         self.Center()
     46         self.Show()
     47 
     48     def initUIMenuBar(self):
     49         menuBar = wx.MenuBar()
     50 
     51         # 构造 文件 菜单
     52         fileMenu = wx.Menu()
     53 
     54         newItem = wx.MenuItem(fileMenu, id=wx.ID_NEW, text="新建(&N)	Ctrl+N", kind=wx.ITEM_NORMAL)
     55         openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...	Ctrl+O", kind=wx.ITEM_NORMAL)
     56         saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)	Ctrl+S", kind=wx.ITEM_NORMAL)
     57         saveasItem = wx.MenuItem(fileMenu, id=wx.ID_SAVEAS, text="另存为(&A)...", kind=wx.ITEM_NORMAL)
     58 
     59         fileMenu.AppendItem(newItem)
     60         fileMenu.AppendItem(openItem)
     61         fileMenu.AppendItem(saveItem)
     62         fileMenu.AppendItem(saveasItem)
     63         fileMenu.AppendSeparator()
     64 
     65         exitItem = wx.MenuItem(fileMenu, id=wx.ID_EXIT, text="退出(&X)", kind=wx.ITEM_NORMAL)
     66         fileMenu.AppendItem(exitItem)
     67 
     68         menuBar.Append(fileMenu, title="文件(&F)")
     69 
     70         # 构建 编辑 菜单
     71         deitMenu = wx.Menu()
     72 
     73         deitMenu.Append(id=21, item="撤销(&U)	Ctrl+Z", kind=wx.ITEM_NORMAL)
     74         deitMenu.AppendSeparator()
     75         deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)	Ctrl+X", kind=wx.ITEM_NORMAL)
     76         deitMenu.Append(id=wx.ID_COPY, item="复制(&C)	Ctrl+C", kind=wx.ITEM_NORMAL)
     77         deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)	Ctrl+V", kind=wx.ITEM_NORMAL)
     78         deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)	Del", kind=wx.ITEM_NORMAL)
     79         deitMenu.AppendSeparator()
     80         deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...	Ctrl+F", kind=wx.ITEM_NORMAL)
     81         deitMenu.Append(id=27, item="查找下一个(&N)	F3")
     82         deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...	Ctrl+H")
     83         deitMenu.Append(id=29, item="转到(&G)	Ctrl+G")
     84         deitMenu.AppendSeparator()
     85         deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)	Ctrl+A")
     86         deitMenu.Append(id=211, item="时间/日期(&D)	F5")
     87 
     88         menuBar.Append(deitMenu, title="编辑(&E)")
     89 
     90         #构建 格式 菜单
     91         formatMenu = wx.Menu()
     92 
     93         formatMenu.Append(id = 31, item = "自动换行(&W)", kind = wx.ITEM_CHECK)
     94         formatMenu.Append(id = 32, item = "字体(&F)...")
     95 
     96         menuBar.Append(formatMenu, title = "格式(&O)")
     97 
     98         #构建 查看 菜单
     99         seeMenu = wx.Menu()
    100         seeMenu.Append(id = 41, item = "状态栏(&S)", kind = wx.ITEM_CHECK).Check(True)     # 置为选中状态
    101 
    102         menuBar.Append(seeMenu, title = "查看(&V)")
    103 
    104         #构建 帮助 菜单
    105         helpMenu = wx.Menu()
    106 
    107         helpMenu.Append(id = wx.ID_HELP, item = "查看帮助(&H)")
    108         helpMenu.Append(id = wx.ID_ABOUT, item = "关于记事本(&A)")
    109 
    110         menuBar.Append(helpMenu, title = "帮助(&H)")
    111         menuBar.Bind(wx.EVT_MENU, self.eventMenuBar)
    112         self.SetMenuBar(menuBar)
    113 
    114     # 以下是 被绑定的事件
    115     def eventMenuBar(self, event):
    116         """传过来的 event 对象, 好像就是 发生事件的那个组件的对象,如果真是这样就灰常好理解了。"""
    117         id = event.GetId()
    118         if id == wx.ID_ABOUT:
    119             msgDialog = wx.MessageDialog(parent = None, message = self.about, caption = '关于"记事本"', style = wx.OK)
    120             msgDialog.ShowModal()
    121 
    122         elif id == wx.ID_HELP:
    123             url = 'http://www.cnblogs.com/Twobox/'
    124             webbrowser.open(url)
    125 
    126         elif id == wx.ID_EXIT:
    127             self.Close()
    128 
    129         elif id == 41:
    130             if event.IsChecked():
    131                 self.statusBar.Show(True)
    132                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] + 1)))
    133             else:
    134                 self.statusBar.Show(False)
    135                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] - 1)))
    136 
    137 
    138     def eventTextCtrl(self, event):
    139         print(event.GetString())
    140 
    141 def main():
    142     print("GO...")
    143     app = wx.App()
    144     Mywin(None, "无标题 - 记事本")
    145     app.MainLoop()
    146     exit(0)
    147 
    148 if __name__ == "__main__":
    149     main()
    View Code

    5、继续实现菜单栏中的相关功能

      1、实现文件操作的全部功能

        包括:新建、打开、保存、另存为、退出。

        并且 支持 快捷键,例如 Ctrl + S 一键保存。

        支持 打开新文件时 窗口标题改更为:文件名 + 记事本 的格式。

        完善 相互间的逻辑关系 例如:

          新建一个文本时:需要判断上一个文本是否保存,保存的话可以提示是否保存。

          打开一个文本时也需要做上述的判断。

          保存时:如果是新建的文本,弹出对话框选择路径保存,如果是打开文本,直接保存即可。

          ······

        

      2、实现 编辑菜单 下的部分功能

        包括:剪切、复制、粘贴、删除、全选。

        因为我们编辑的时候一般不是去点击菜单去使用这些功能。

        所以 全部实现 快捷键操作 例如:

          Ctrl + C:复制

          Ctrl + V:粘贴

          Ctrl + A:全选

          ·······

        

      3、阶段 小结一下

        大部分功能已经实现了。

        这次的更新 实现了文本操作的几乎所有的基本操作,已经能够正常来使用了。

        接下来就是 完善:

          状态栏显示消息更新

          编辑菜单下的查找相关功能

          格式中的字体设置相关设置功能

        完成这 3 个大方向后,这个 高仿 WIN10 记事本任务就基本结束啦。。。

        往后就是 记事本的小细节的优化,即小小滴更新。

      该阶段代码时滴代码:

      1 # encoding: utf-8
      2 # acthor: Twobox
      3 
      4 import wx
      5 import webbrowser
      6 
      7 class Mywin(wx.Frame):
      8     """Author: Twobox"""
      9     about = """
     10     作者:Twobox
     11     扣扣:200562421
     12     源码共享博客:http://www.cnblogs.com/Twobox/
     13     """
     14     def __init__(self, parent, title):
     15         super(Mywin, self).__init__(parent, title = title)
     16 
     17         self.textBoxIsChange = False
     18 
     19         self.fileIsOpen = False
     20         self.fileName = "无标题"
     21         self.filePath = ""
     22 
     23         self.wildcard = "文本文件 (*.txt)|*.txt"
     24 
     25         self.InitUI()
     26 
     27     def InitUI(self):
     28         self.initUIMenuBar()            # 初始化 菜单栏
     29         self.initUIStatusBar()          # 初始化 状态栏
     30         self.initUIMainWindow()         # 构建 窗口面板
     31         self.adjustmentWin()            # 调整 窗口框体参数
     32 
     33     def initUIMainWindow(self):
     34         panel = wx.Panel(self)
     35         vbox = wx.BoxSizer(wx.VERTICAL)
     36 
     37         self.textBox = wx.TextCtrl(panel, id = -1, style = wx.TE_MULTILINE)
     38         self.textBox.Bind(wx.EVT_TEXT, self.eventTextCtrl)
     39         vbox.Add(self.textBox, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
     40 
     41         panel.SetSizer(vbox)
     42 
     43     def initUIStatusBar(self):
     44         # 实例化一个 状态栏 对象
     45         self.statusBar = wx.StatusBar(parent = self, id = -1)
     46         self.statusBar.SetFieldsCount(2)
     47         self.statusBar.SetStatusWidths([-3.9, -1])
     48         self.statusBar.SetStatusText("  第 1 行 , 第 1 列", 1)
     49         self.SetStatusBar(self.statusBar)
     50         self.statusBar.Show(True)
     51 
     52     def adjustmentWin(self):
     53         self.SetTitle(self.fileName + " - 记事本")
     54         self.SetSize((400, 600))
     55         self.Center()
     56         self.Show()
     57 
     58     def initUIMenuBar(self):
     59         menuBar = wx.MenuBar()
     60 
     61         # 构造 文件 菜单
     62         fileMenu = wx.Menu()
     63 
     64         newItem = wx.MenuItem(fileMenu, id=wx.ID_NEW, text="新建(&N)	Ctrl+N", kind=wx.ITEM_NORMAL)
     65         openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...	Ctrl+O", kind=wx.ITEM_NORMAL)
     66         saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)	Ctrl+S", kind=wx.ITEM_NORMAL)
     67         saveasItem = wx.MenuItem(fileMenu, id=wx.ID_SAVEAS, text="另存为(&A)...", kind=wx.ITEM_NORMAL)
     68 
     69         fileMenu.AppendItem(newItem)
     70         fileMenu.AppendItem(openItem)
     71         fileMenu.AppendItem(saveItem)
     72         fileMenu.AppendItem(saveasItem)
     73         fileMenu.AppendSeparator()
     74 
     75         exitItem = wx.MenuItem(fileMenu, id=wx.ID_EXIT, text="退出(&X)", kind=wx.ITEM_NORMAL)
     76         fileMenu.AppendItem(exitItem)
     77 
     78         menuBar.Append(fileMenu, title="文件(&F)")
     79 
     80         # 构建 编辑 菜单
     81         deitMenu = wx.Menu()
     82 
     83         deitMenu.Append(id=21, item="撤销(&U)	Ctrl+Z", kind=wx.ITEM_NORMAL)
     84         deitMenu.AppendSeparator()
     85         deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)	Ctrl+X", kind=wx.ITEM_NORMAL)
     86         deitMenu.Append(id=wx.ID_COPY, item="复制(&C)	Ctrl+C", kind=wx.ITEM_NORMAL)
     87         deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)	Ctrl+V", kind=wx.ITEM_NORMAL)
     88         deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)	Del", kind=wx.ITEM_NORMAL)
     89         deitMenu.AppendSeparator()
     90         deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...	Ctrl+F", kind=wx.ITEM_NORMAL)
     91         deitMenu.Append(id=27, item="查找下一个(&N)	F3")
     92         deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...	Ctrl+H")
     93         deitMenu.Append(id=29, item="转到(&G)	Ctrl+G")
     94         deitMenu.AppendSeparator()
     95         deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)	Ctrl+A")
     96         deitMenu.Append(id=211, item="时间/日期(&D)	F5")
     97 
     98         menuBar.Append(deitMenu, title="编辑(&E)")
     99 
    100         #构建 格式 菜单
    101         formatMenu = wx.Menu()
    102 
    103         formatMenu.Append(id = 31, item = "自动换行(&W)", kind = wx.ITEM_CHECK)
    104         formatMenu.Append(id = 32, item = "字体(&F)...")
    105 
    106         menuBar.Append(formatMenu, title = "格式(&O)")
    107 
    108         #构建 查看 菜单
    109         seeMenu = wx.Menu()
    110         seeMenu.Append(id = 41, item = "状态栏(&S)", kind = wx.ITEM_CHECK).Check(True)     # 置为选中状态
    111 
    112         menuBar.Append(seeMenu, title = "查看(&V)")
    113 
    114         #构建 帮助 菜单
    115         helpMenu = wx.Menu()
    116 
    117         helpMenu.Append(id = wx.ID_HELP, item = "查看帮助(&H)")
    118         helpMenu.Append(id = wx.ID_ABOUT, item = "关于记事本(&A)")
    119 
    120         menuBar.Append(helpMenu, title = "帮助(&H)")
    121         menuBar.Bind(wx.EVT_MENU, self.eventMenuBar)
    122         self.SetMenuBar(menuBar)
    123 
    124     # 以下是 被绑定的事件
    125     def eventMenuBar(self, event):
    126         """传过来的 event 对象, 好像就是 发生事件的那个组件的对象,如果真是这样就灰常好理解了。
    127             id == 31 目前尚有 BUG。
    128             id == ID_DELETE 未搞
    129 
    130             new打开 文件的时候 未修改标题栏
    131         """
    132         id = event.GetId()
    133         if id == wx.ID_ABOUT:
    134             msgDialog = wx.MessageDialog(parent = None, message = self.about, caption = '关于"记事本"', style = wx.OK)
    135             msgDialog.ShowModal()
    136 
    137         elif id == wx.ID_HELP:
    138             url = 'http://www.cnblogs.com/Twobox/'
    139             webbrowser.open(url)
    140 
    141         elif id == wx.ID_EXIT: self.Close()
    142 
    143         elif id == 41:
    144             if event.IsChecked():
    145                 self.statusBar.Show(True)
    146                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] + 1)))
    147             else:
    148                 self.statusBar.Show(False)
    149                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] - 1)))
    150 
    151         elif id == 31:
    152             if not event.IsChecked():
    153                 self.textBox.SetWindowStyleFlag(style=wx.TE_MULTILINE | wx.HSCROLL)
    154                 self.statusBar.Show(True)
    155                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] + 1)))
    156 
    157             else:
    158                 self.textBox.SetWindowStyleFlag(style=wx.TE_MULTILINE)
    159                 self.statusBar.Show(False)
    160                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] - 1)))
    161 
    162         elif id == wx.ID_SELECTALL: self.textBox.SelectAll()
    163 
    164         elif id == wx.ID_CUT: self.textBox.Cut()
    165 
    166         elif id == wx.ID_COPY: self.textBox.Copy()
    167 
    168         elif id == wx.ID_PASTE: self.textBox.Paste()
    169 
    170         elif id == wx.ID_NEW:
    171             if self.textBoxIsChange:
    172                 if self.textBox.GetValue() == "" and self.fileIsOpen == False:
    173                     pass
    174                 else:
    175                     dlg = wx.MessageDialog(self, "是否将更改保存到 " + self.fileName + "?", "记事本", wx.CANCEL | wx.YES_NO)
    176                     answer = dlg.ShowModal()
    177                     if answer == wx.ID_OK:
    178                         self.saveFile()
    179                     elif answer == wx.ID_CANCEL:
    180                         return None
    181                     else:
    182                         pass
    183             self.fileIsOpen = False
    184             self.filePath = ""
    185             self.fileName = "无标题"
    186             self.textBox.SetValue("")
    187             self.textBoxIsChange = False
    188 
    189         elif id == wx.ID_SAVE: self.saveFile()
    190 
    191         elif id == wx.ID_OPEN:
    192             if self.textBoxIsChange:
    193                 dlg = wx.MessageDialog(self, "是否将更改保存到 " + self.fileName + "?", "记事本", wx.CANCEL | wx.YES_NO)
    194                 answer = dlg.ShowModal()
    195                 if answer == wx.ID_NO:
    196                     self.openFile()
    197                 elif answer == wx.ID_CANCEL:
    198                     pass
    199                 else:
    200                     self.saveFile()
    201             else:
    202                 self.openFile()
    203 
    204         elif id == wx.ID_SAVEAS:
    205             self.fileIsOpen = False
    206             if self.saveFile() == False:
    207                 self.fileIsOpen = True
    208 
    209     def eventTextCtrl(self, event):
    210         self.textBoxIsChange = True
    211 
    212     def saveFile(self):
    213         if not self.fileIsOpen:
    214             wildcard = self.wildcard
    215             dlg = wx.FileDialog(self, "保存", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    216             if dlg.ShowModal() == wx.ID_OK:
    217                 filePath = dlg.GetPath()
    218             else:
    219                 return False
    220         else:
    221             filePath = self.filePath
    222         with open(filePath, "w") as f:
    223             f.write(self.textBox.GetValue())
    224             self.textBoxIsChange = False
    225         return True
    226 
    227     def openFile(self):
    228         wildcard = self.wildcard
    229         dlg = wx.FileDialog(self, "打开", style=wx.FD_OPEN, wildcard=wildcard)
    230         if dlg.ShowModal() == wx.ID_OK:
    231             filePath = dlg.GetPath()
    232             with open(filePath, "r") as f:
    233                 self.textBox.SetValue(f.read())
    234                 self.fileIsOpen = True
    235                 self.filePath = filePath
    236                 self.fileName = f.name
    237                 self.textBoxIsChange = False
    238                 self.changeTitle()
    239         else:
    240             pass
    241 
    242     def changeTitle(self):
    243         self.SetTitle(self.fileName + " - 记事本")
    244 
    245 def main():
    246     print("GO...")
    247     app = wx.App()
    248     Mywin(None, "")
    249     app.MainLoop()
    250     exit(0)
    251 
    252 if __name__ == "__main__":
    253     main()
    View Code

    6、完成了 字体样式选择 与 字体颜色选择

      ·到了这里 防WIN10记事本 差不多到这里就要结束了。

      还是有几个地方没有去完善了。

      比如:

        文本查找功能

        状态栏中显示 当前光标的 位置

      效果图:

      

      

      本阶段代码:

      

      1 # encoding: utf-8
      2 # acthor: Twobox
      3 
      4 import wx
      5 import webbrowser
      6 
      7 class Mywin(wx.Frame):
      8     """Author: Twobox"""
      9     about = """
     10     作者:Twobox
     11     扣扣:200562421
     12     源码共享博客:http://www.cnblogs.com/Twobox/
     13     """
     14     def __init__(self, parent, title):
     15         super(Mywin, self).__init__(parent, title = title)
     16 
     17         self.textBoxIsChange = False
     18 
     19         self.fileIsOpen = False
     20         self.fileName = "无标题"
     21         self.filePath = ""
     22 
     23         self.wildcard = "文本文件 (*.txt)|*.txt"
     24 
     25         self.InitUI()
     26 
     27     def InitUI(self):
     28         self.initUIMenuBar()            # 初始化 菜单栏
     29         self.initUIStatusBar()          # 初始化 状态栏
     30         self.initUIMainWindow()         # 构建 窗口面板
     31         self.adjustmentWin()            # 调整 窗口框体参数
     32 
     33     def initUIMainWindow(self):
     34         panel = wx.Panel(self)
     35         vbox = wx.BoxSizer(wx.VERTICAL)
     36 
     37         self.textBox = wx.TextCtrl(panel, id = -1, style = wx.TE_MULTILINE)
     38         self.textBox.Bind(wx.EVT_TEXT, self.eventTextCtrl)
     39         vbox.Add(self.textBox, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
     40 
     41         panel.SetSizer(vbox)
     42 
     43     def initUIStatusBar(self):
     44         # 实例化一个 状态栏 对象
     45         self.statusBar = wx.StatusBar(parent = self, id = -1)
     46         self.statusBar.SetFieldsCount(2)
     47         self.statusBar.SetStatusWidths([-3.9, -1])
     48         self.statusBar.SetStatusText("  第 1 行 , 第 1 列", 1)
     49         self.SetStatusBar(self.statusBar)
     50         self.statusBar.Show(True)
     51 
     52     def adjustmentWin(self):
     53         self.SetTitle(self.fileName + " - 记事本")
     54         self.SetSize((400, 600))
     55         self.Center()
     56         self.Show()
     57 
     58     def initUIMenuBar(self):
     59         menuBar = wx.MenuBar()
     60 
     61         # 构造 文件 菜单
     62         fileMenu = wx.Menu()
     63 
     64         newItem = wx.MenuItem(fileMenu, id=wx.ID_NEW, text="新建(&N)	Ctrl+N", kind=wx.ITEM_NORMAL)
     65         openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...	Ctrl+O", kind=wx.ITEM_NORMAL)
     66         saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)	Ctrl+S", kind=wx.ITEM_NORMAL)
     67         saveasItem = wx.MenuItem(fileMenu, id=wx.ID_SAVEAS, text="另存为(&A)...", kind=wx.ITEM_NORMAL)
     68 
     69         fileMenu.AppendItem(newItem)
     70         fileMenu.AppendItem(openItem)
     71         fileMenu.AppendItem(saveItem)
     72         fileMenu.AppendItem(saveasItem)
     73         fileMenu.AppendSeparator()
     74 
     75         exitItem = wx.MenuItem(fileMenu, id=wx.ID_EXIT, text="退出(&X)", kind=wx.ITEM_NORMAL)
     76         fileMenu.AppendItem(exitItem)
     77 
     78         menuBar.Append(fileMenu, title="文件(&F)")
     79 
     80         # 构建 编辑 菜单
     81         deitMenu = wx.Menu()
     82 
     83         deitMenu.Append(id=21, item="撤销(&U)	Ctrl+Z", kind=wx.ITEM_NORMAL)
     84         deitMenu.AppendSeparator()
     85         deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)	Ctrl+X", kind=wx.ITEM_NORMAL)
     86         deitMenu.Append(id=wx.ID_COPY, item="复制(&C)	Ctrl+C", kind=wx.ITEM_NORMAL)
     87         deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)	Ctrl+V", kind=wx.ITEM_NORMAL)
     88         deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)	Del", kind=wx.ITEM_NORMAL)
     89         deitMenu.AppendSeparator()
     90         deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...	Ctrl+F", kind=wx.ITEM_NORMAL)
     91         deitMenu.Append(id=27, item="查找下一个(&N)	F3")
     92         deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...	Ctrl+H")
     93         deitMenu.Append(id=29, item="转到(&G)	Ctrl+G")
     94         deitMenu.AppendSeparator()
     95         deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)	Ctrl+A")
     96         deitMenu.Append(id=211, item="时间/日期(&D)	F5")
     97 
     98         menuBar.Append(deitMenu, title="编辑(&E)")
     99 
    100         #构建 格式 菜单
    101         formatMenu = wx.Menu()
    102 
    103         formatMenu.Append(id = 31, item = "自动换行(&W)", kind = wx.ITEM_CHECK)
    104         formatMenu.Append(id = wx.ID_SELECT_FONT, item = "字体(&F)...")
    105 
    106         menuBar.Append(formatMenu, title = "格式(&O)")
    107 
    108         #构建 查看 菜单
    109         seeMenu = wx.Menu()
    110         seeMenu.Append(id = 41, item = "状态栏(&S)", kind = wx.ITEM_CHECK).Check(True)     # 置为选中状态
    111 
    112         menuBar.Append(seeMenu, title = "查看(&V)")
    113 
    114         #构建 帮助 菜单
    115         helpMenu = wx.Menu()
    116 
    117         helpMenu.Append(id = wx.ID_HELP, item = "查看帮助(&H)")
    118         helpMenu.Append(id = wx.ID_ABOUT, item = "关于记事本(&A)")
    119 
    120         menuBar.Append(helpMenu, title = "帮助(&H)")
    121         menuBar.Bind(wx.EVT_MENU, self.eventMenuBar)
    122         self.SetMenuBar(menuBar)
    123 
    124     # 以下是 被绑定的事件
    125     def eventMenuBar(self, event):
    126         """传过来的 event 对象, 好像就是 发生事件的那个组件的对象,如果真是这样就灰常好理解了。
    127             id == 31 目前尚有 BUG。
    128             id == ID_DELETE 未搞
    129 
    130             new打开 文件的时候 未修改标题栏
    131         """
    132         id = event.GetId()
    133         if id == wx.ID_ABOUT:
    134             msgDialog = wx.MessageDialog(parent = None, message = self.about, caption = '关于"记事本"', style = wx.OK)
    135             msgDialog.ShowModal()
    136 
    137         elif id == wx.ID_HELP:
    138             url = 'http://www.cnblogs.com/Twobox/'
    139             webbrowser.open(url)
    140 
    141         elif id == wx.ID_EXIT: self.Close()
    142 
    143         elif id == 41:
    144             if event.IsChecked():
    145                 self.statusBar.Show(True)
    146                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] + 1)))
    147             else:
    148                 self.statusBar.Show(False)
    149                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] - 1)))
    150 
    151         elif id == 31:
    152             if not event.IsChecked():
    153                 self.textBox.SetWindowStyleFlag(style=wx.TE_MULTILINE | wx.HSCROLL)
    154                 self.statusBar.Show(True)
    155                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] + 1)))
    156 
    157             else:
    158                 self.textBox.SetWindowStyleFlag(style=wx.TE_MULTILINE)
    159                 self.statusBar.Show(False)
    160                 self.SetSize((self.GetSize()[0], (self.GetSize()[1] - 1)))
    161 
    162         elif id == wx.ID_SELECTALL: self.textBox.SelectAll()
    163 
    164         elif id == wx.ID_CUT: self.textBox.Cut()
    165 
    166         elif id == wx.ID_COPY: self.textBox.Copy()
    167 
    168         elif id == wx.ID_PASTE: self.textBox.Paste()
    169 
    170         elif id == wx.ID_NEW:
    171             if self.textBoxIsChange:
    172                 if self.textBox.GetValue() == "" and self.fileIsOpen == False:
    173                     pass
    174                 else:
    175                     dlg = wx.MessageDialog(self, "是否将更改保存到 " + self.fileName + "?", "记事本", wx.CANCEL | wx.YES_NO)
    176                     answer = dlg.ShowModal()
    177                     if answer == wx.ID_OK:
    178                         self.saveFile()
    179                     elif answer == wx.ID_CANCEL:
    180                         return None
    181                     else:
    182                         pass
    183             self.fileIsOpen = False
    184             self.filePath = ""
    185             self.fileName = "无标题"
    186             self.textBox.SetValue("")
    187             self.textBoxIsChange = False
    188 
    189         elif id == wx.ID_SAVE: self.saveFile()
    190 
    191         elif id == wx.ID_OPEN:
    192             if self.textBoxIsChange:
    193                 dlg = wx.MessageDialog(self, "是否将更改保存到 " + self.fileName + "?", "记事本", wx.CANCEL | wx.YES_NO)
    194                 answer = dlg.ShowModal()
    195                 if answer == wx.ID_NO:
    196                     self.openFile()
    197                 elif answer == wx.ID_CANCEL:
    198                     pass
    199                 else:
    200                     self.saveFile()
    201             else:
    202                 self.openFile()
    203 
    204         elif id == wx.ID_SAVEAS:
    205             self.fileIsOpen = False
    206             if self.saveFile() == False:
    207                 self.fileIsOpen = True
    208 
    209         elif id == wx.ID_SELECT_FONT:
    210             dlg = wx.FontDialog(self, wx.FontData())
    211 
    212             if dlg.ShowModal() == wx.ID_OK:
    213                 data = dlg.GetFontData()
    214                 Font = data.GetChosenFont()
    215                 colour = data.GetColour()
    216                 self.textBox.SetFont(Font)
    217                 self.textBox.SetForegroundColour(colour)  # 设置字体颜色
    218                 # self.textBox.SetBackgroundColour(colour)  # 设置背景颜色
    219                 # self.textBox.SetOwnBackgroundColour(colour)  # 不是要清楚 目前看出来的效果是背景颜色
    220 
    221             dlg.Destroy()
    222 
    223     def eventTextCtrl(self, event):
    224         self.textBoxIsChange = True
    225 
    226     def saveFile(self):
    227         if not self.fileIsOpen:
    228             wildcard = self.wildcard
    229             dlg = wx.FileDialog(self, "保存", wildcard=wildcard, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    230             if dlg.ShowModal() == wx.ID_OK:
    231                 filePath = dlg.GetPath()
    232             else:
    233                 return False
    234         else:
    235             filePath = self.filePath
    236         with open(filePath, "w") as f:
    237             f.write(self.textBox.GetValue())
    238             self.textBoxIsChange = False
    239         return True
    240 
    241     def openFile(self):
    242         wildcard = self.wildcard
    243         dlg = wx.FileDialog(self, "打开", style=wx.FD_OPEN, wildcard=wildcard)
    244         if dlg.ShowModal() == wx.ID_OK:
    245             filePath = dlg.GetPath()
    246             with open(filePath, "r") as f:
    247                 self.textBox.SetValue(f.read())
    248                 self.fileIsOpen = True
    249                 self.filePath = filePath
    250                 self.fileName = f.name
    251                 self.textBoxIsChange = False
    252                 self.changeTitle()
    253         else:
    254             pass
    255 
    256     def changeTitle(self):
    257         self.SetTitle(self.fileName + " - 记事本")
    258 
    259 def main():
    260     print("GO...")
    261     app = wx.App()
    262     Mywin(None, "")
    263     app.MainLoop()
    264     exit(0)
    265 
    266 if __name__ == "__main__":
    267     main()

    7、

      end...

    2017-08-20 22:22:28 -> 2017-08-20 22:22:37 -> 2017-08-23 20:37:37 -> 2017-08-27 17:19:09 -> 2017-08-30 11:19:14

  • 相关阅读:
    Linux-1-用户管理
    接口相关资料整理
    JPype1使用总结
    1.django项目的创建(在CMD中)
    公有云、私有云和混合云的区别
    接口测试1.测试用例要点与模板
    PostMan Test 的脚本scripts编写方法
    Tensorflow RNN中的坑
    2019年终总结
    tensorflow中一种融合多个模型的方法
  • 原文地址:https://www.cnblogs.com/Twobox/p/7397665.html
Copyright © 2020-2023  润新知