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)\tCtrl+N", kind=wx.ITEM_NORMAL) 24 openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(O)...\tCtrl+O", kind=wx.ITEM_NORMAL) 25 saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(S)\tCtrl+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)\tCtrl+Z", kind=wx.ITEM_NORMAL) 43 deitMenu.AppendSeparator() 44 deitMenu.Append(id=wx.ID_CUT, item="剪切(T)\tCtrl+X", kind=wx.ITEM_NORMAL) 45 deitMenu.Append(id=wx.ID_COPY, item="复制(C)\tCtrl+C", kind=wx.ITEM_NORMAL) 46 deitMenu.Append(id=wx.ID_PASTE, item="粘贴(P)\tCtrl+V", kind=wx.ITEM_NORMAL) 47 deitMenu.Append(id=wx.ID_DELETE, item="删除(L)\tDel", kind=wx.ITEM_NORMAL) 48 deitMenu.AppendSeparator() 49 deitMenu.Append(id=wx.ID_FIND, item="查找(F)...\tCtrl+F", kind=wx.ITEM_NORMAL) 50 deitMenu.Append(id=27, item="查找下一个(N)\tF3") 51 deitMenu.Append(id=wx.ID_REPLACE, item="替换(R)...\tCtrl+H") 52 deitMenu.Append(id=29, item="转到(G)\tCtrl+G") 53 deitMenu.AppendSeparator() 54 deitMenu.Append(id=wx.ID_SELECTALL, item="全选(A)\tCtrl+A") 55 deitMenu.Append(id=211, item="时间/日期(D)\tF5") 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()
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)\tCtrl+N", kind=wx.ITEM_NORMAL) 48 openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(O)...\tCtrl+O", kind=wx.ITEM_NORMAL) 49 saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(S)\tCtrl+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)\tCtrl+Z", kind=wx.ITEM_NORMAL) 67 deitMenu.AppendSeparator() 68 deitMenu.Append(id=wx.ID_CUT, item="剪切(T)\tCtrl+X", kind=wx.ITEM_NORMAL) 69 deitMenu.Append(id=wx.ID_COPY, item="复制(C)\tCtrl+C", kind=wx.ITEM_NORMAL) 70 deitMenu.Append(id=wx.ID_PASTE, item="粘贴(P)\tCtrl+V", kind=wx.ITEM_NORMAL) 71 deitMenu.Append(id=wx.ID_DELETE, item="删除(L)\tDel", kind=wx.ITEM_NORMAL) 72 deitMenu.AppendSeparator() 73 deitMenu.Append(id=wx.ID_FIND, item="查找(F)...\tCtrl+F", kind=wx.ITEM_NORMAL) 74 deitMenu.Append(id=27, item="查找下一个(N)\tF3") 75 deitMenu.Append(id=wx.ID_REPLACE, item="替换(R)...\tCtrl+H") 76 deitMenu.Append(id=29, item="转到(G)\tCtrl+G") 77 deitMenu.AppendSeparator() 78 deitMenu.Append(id=wx.ID_SELECTALL, item="全选(A)\tCtrl+A") 79 deitMenu.Append(id=211, item="时间/日期(D)\tF5") 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()
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)\tCtrl+N", kind=wx.ITEM_NORMAL) 55 openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...\tCtrl+O", kind=wx.ITEM_NORMAL) 56 saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)\tCtrl+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)\tCtrl+Z", kind=wx.ITEM_NORMAL) 74 deitMenu.AppendSeparator() 75 deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)\tCtrl+X", kind=wx.ITEM_NORMAL) 76 deitMenu.Append(id=wx.ID_COPY, item="复制(&C)\tCtrl+C", kind=wx.ITEM_NORMAL) 77 deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)\tCtrl+V", kind=wx.ITEM_NORMAL) 78 deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)\tDel", kind=wx.ITEM_NORMAL) 79 deitMenu.AppendSeparator() 80 deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...\tCtrl+F", kind=wx.ITEM_NORMAL) 81 deitMenu.Append(id=27, item="查找下一个(&N)\tF3") 82 deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...\tCtrl+H") 83 deitMenu.Append(id=29, item="转到(&G)\tCtrl+G") 84 deitMenu.AppendSeparator() 85 deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)\tCtrl+A") 86 deitMenu.Append(id=211, item="时间/日期(&D)\tF5") 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()
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)\tCtrl+N", kind=wx.ITEM_NORMAL) 65 openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...\tCtrl+O", kind=wx.ITEM_NORMAL) 66 saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)\tCtrl+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)\tCtrl+Z", kind=wx.ITEM_NORMAL) 84 deitMenu.AppendSeparator() 85 deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)\tCtrl+X", kind=wx.ITEM_NORMAL) 86 deitMenu.Append(id=wx.ID_COPY, item="复制(&C)\tCtrl+C", kind=wx.ITEM_NORMAL) 87 deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)\tCtrl+V", kind=wx.ITEM_NORMAL) 88 deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)\tDel", kind=wx.ITEM_NORMAL) 89 deitMenu.AppendSeparator() 90 deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...\tCtrl+F", kind=wx.ITEM_NORMAL) 91 deitMenu.Append(id=27, item="查找下一个(&N)\tF3") 92 deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...\tCtrl+H") 93 deitMenu.Append(id=29, item="转到(&G)\tCtrl+G") 94 deitMenu.AppendSeparator() 95 deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)\tCtrl+A") 96 deitMenu.Append(id=211, item="时间/日期(&D)\tF5") 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()
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)\tCtrl+N", kind=wx.ITEM_NORMAL) 65 openItem = wx.MenuItem(fileMenu, id=wx.ID_OPEN, text="打开(&O)...\tCtrl+O", kind=wx.ITEM_NORMAL) 66 saveItem = wx.MenuItem(fileMenu, id=wx.ID_SAVE, text="保存(&S)\tCtrl+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)\tCtrl+Z", kind=wx.ITEM_NORMAL) 84 deitMenu.AppendSeparator() 85 deitMenu.Append(id=wx.ID_CUT, item="剪切(&T)\tCtrl+X", kind=wx.ITEM_NORMAL) 86 deitMenu.Append(id=wx.ID_COPY, item="复制(&C)\tCtrl+C", kind=wx.ITEM_NORMAL) 87 deitMenu.Append(id=wx.ID_PASTE, item="粘贴(&P)\tCtrl+V", kind=wx.ITEM_NORMAL) 88 deitMenu.Append(id=wx.ID_DELETE, item="删除(&L)\tDel", kind=wx.ITEM_NORMAL) 89 deitMenu.AppendSeparator() 90 deitMenu.Append(id=wx.ID_FIND, item="查找(&F)...\tCtrl+F", kind=wx.ITEM_NORMAL) 91 deitMenu.Append(id=27, item="查找下一个(&N)\tF3") 92 deitMenu.Append(id=wx.ID_REPLACE, item="替换(&R)...\tCtrl+H") 93 deitMenu.Append(id=29, item="转到(&G)\tCtrl+G") 94 deitMenu.AppendSeparator() 95 deitMenu.Append(id=wx.ID_SELECTALL, item="全选(&A)\tCtrl+A") 96 deitMenu.Append(id=211, item="时间/日期(&D)\tF5") 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