[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

原文地址:https://www.cnblogs.com/Twobox/p/7397665.html