window上记事本python_[Python] wxPython 高防Windows10记事本 (end...)

1、开始

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

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

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

2、构建菜单栏

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

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

效果图:

1118369-20170820222045240-717980654.png

该阶段时滴代码:

ContractedBlock.gif

ExpandedBlockStart.gif

1 #coding:utf-8

2 #acthor:Twobox

3

4 importwx5

6 classMywin(wx.Frame):7 def __init__(self, parent, title):8 super(Mywin, self).__init__(parent, title =title)9 self.InitUI()10

11 defInitUI(self):12 self.InitUIMenuBar()13 self.SetSize((400,600))14 self.Center()15 self.Show()16

17 defInitUIMenuBar(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 defmain():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、完成 编辑框与状态栏

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

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

效果图:

1118369-20170822214355730-765313020.png

该阶段时滴代码:

ContractedBlock.gif

ExpandedBlockStart.gif

1 #coding:utf-8

2 #acthor:Twobox

3

4 importwx5

6 classMywin(wx.Frame):7 def __init__(self, parent, title):8 super(Mywin, self).__init__(parent, title =title)9 self.InitUI()10

11 defInitUI(self):12 self.initUIMenuBar() #初始化 菜单栏

13 self.initUIStatusBar() #初始化 状态栏

14 self.initUIMainWindow() #构建 窗口面板

15 self.adjustmentWin() #调整 窗口框体参数

16

17 definitUIMainWindow(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 definitUIStatusBar(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 defadjustmentWin(self):37 self.SetSize((400, 600))38 self.Center()39 self.Show()40

41 definitUIMenuBar(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 defmain():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、检查框 确定是否显示 状态栏

1118369-20170823203337511-56994406.png

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

1118369-20170823203459527-1777889921.png

该阶段时滴代码:

ContractedBlock.gif

ExpandedBlockStart.gif

1 #encoding: utf-8

2 #acthor: Twobox

3

4 importwx5 importwebbrowser6

7 classMywin(wx.Frame):8 """Author: Twobox"""

9 about = """

10 作者:Twobox11 扣扣:20056242112 源码共享博客: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 defInitUI(self):19 self.initUIMenuBar() #初始化 菜单栏

20 self.initUIStatusBar() #初始化 状态栏

21 self.initUIMainWindow() #构建 窗口面板

22 self.adjustmentWin() #调整 窗口框体参数

23

24 definitUIMainWindow(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 definitUIStatusBar(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 defadjustmentWin(self):44 self.SetSize((400, 600))45 self.Center()46 self.Show()47

48 definitUIMenuBar(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 defeventMenuBar(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 ifevent.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 defeventTextCtrl(self, event):139 print(event.GetString())140

141 defmain():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 一键保存。

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

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

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

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

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

······

1118369-20170827170331918-589850247.png

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

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

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

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

Ctrl + C:复制

Ctrl + V:粘贴

Ctrl + A:全选

·······

1118369-20170827171115089-272526815.png

3、阶段 小结一下

大部分功能已经实现了。

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

接下来就是 完善:

状态栏显示消息更新

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

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

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

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

该阶段代码时滴代码:

ContractedBlock.gif

ExpandedBlockStart.gif

1 #encoding: utf-8

2 #acthor: Twobox

3

4 importwx5 importwebbrowser6

7 classMywin(wx.Frame):8 """Author: Twobox"""

9 about = """

10 作者:Twobox11 扣扣:20056242112 源码共享博客:http://www.cnblogs.com/Twobox/13 """

14 def __init__(self, parent, title):15 super(Mywin, self).__init__(parent, title =title)16

17 self.textBoxIsChange =False18

19 self.fileIsOpen =False20 self.fileName = "无标题"

21 self.filePath = ""

22

23 self.wildcard = "文本文件 (*.txt)|*.txt"

24

25 self.InitUI()26

27 defInitUI(self):28 self.initUIMenuBar() #初始化 菜单栏

29 self.initUIStatusBar() #初始化 状态栏

30 self.initUIMainWindow() #构建 窗口面板

31 self.adjustmentWin() #调整 窗口框体参数

32

33 definitUIMainWindow(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 definitUIStatusBar(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 defadjustmentWin(self):53 self.SetTitle(self.fileName + "- 记事本")54 self.SetSize((400, 600))55 self.Center()56 self.Show()57

58 definitUIMenuBar(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 defeventMenuBar(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 ifevent.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 notevent.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 ifself.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 returnNone181 else:182 pass

183 self.fileIsOpen =False184 self.filePath = ""

185 self.fileName = "无标题"

186 self.textBox.SetValue("")187 self.textBoxIsChange =False188

189 elif id ==wx.ID_SAVE: self.saveFile()190

191 elif id ==wx.ID_OPEN:192 ifself.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 =False206 if self.saveFile() ==False:207 self.fileIsOpen =True208

209 defeventTextCtrl(self, event):210 self.textBoxIsChange =True211

212 defsaveFile(self):213 if notself.fileIsOpen:214 wildcard =self.wildcard215 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 returnFalse220 else:221 filePath =self.filePath222 with open(filePath, "w") as f:223 f.write(self.textBox.GetValue())224 self.textBoxIsChange =False225 returnTrue226

227 defopenFile(self):228 wildcard =self.wildcard229 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 =True235 self.filePath =filePath236 self.fileName =f.name237 self.textBoxIsChange =False238 self.changeTitle()239 else:240 pass

241

242 defchangeTitle(self):243 self.SetTitle(self.fileName + "- 记事本")244

245 defmain():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记事本 差不多到这里就要结束了。

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

比如:

文本查找功能

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

效果图:

1118369-20170830111735187-956567592.png

1118369-20170830111829265-685651164.png

本阶段代码:

1 #encoding: utf-8

2 #acthor: Twobox

3

4 importwx5 importwebbrowser6

7 classMywin(wx.Frame):8 """Author: Twobox"""

9 about = """

10 作者:Twobox11 扣扣:20056242112 源码共享博客:http://www.cnblogs.com/Twobox/13 """

14 def __init__(self, parent, title):15 super(Mywin, self).__init__(parent, title =title)16

17 self.textBoxIsChange =False18

19 self.fileIsOpen =False20 self.fileName = "无标题"

21 self.filePath = ""

22

23 self.wildcard = "文本文件 (*.txt)|*.txt"

24

25 self.InitUI()26

27 defInitUI(self):28 self.initUIMenuBar() #初始化 菜单栏

29 self.initUIStatusBar() #初始化 状态栏

30 self.initUIMainWindow() #构建 窗口面板

31 self.adjustmentWin() #调整 窗口框体参数

32

33 definitUIMainWindow(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 definitUIStatusBar(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 defadjustmentWin(self):53 self.SetTitle(self.fileName + "- 记事本")54 self.SetSize((400, 600))55 self.Center()56 self.Show()57

58 definitUIMenuBar(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 defeventMenuBar(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 ifevent.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 notevent.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 ifself.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 returnNone181 else:182 pass

183 self.fileIsOpen =False184 self.filePath = ""

185 self.fileName = "无标题"

186 self.textBox.SetValue("")187 self.textBoxIsChange =False188

189 elif id ==wx.ID_SAVE: self.saveFile()190

191 elif id ==wx.ID_OPEN:192 ifself.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 =False206 if self.saveFile() ==False:207 self.fileIsOpen =True208

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 defeventTextCtrl(self, event):224 self.textBoxIsChange =True225

226 defsaveFile(self):227 if notself.fileIsOpen:228 wildcard =self.wildcard229 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 returnFalse234 else:235 filePath =self.filePath236 with open(filePath, "w") as f:237 f.write(self.textBox.GetValue())238 self.textBoxIsChange =False239 returnTrue240

241 defopenFile(self):242 wildcard =self.wildcard243 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 =True249 self.filePath =filePath250 self.fileName =f.name251 self.textBoxIsChange =False252 self.changeTitle()253 else:254 pass

255

256 defchangeTitle(self):257 self.SetTitle(self.fileName + "- 记事本")258

259 defmain():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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值