Python编写一个记事本

若如初见. 提交于 2019-11-26 20:04:38

这是一个简单的记事本,使用Python编写。

在网上也有很多的相关代码,发现不是这里有问题,就是那里有问题,要么就是功能太简单。

这个是我参考网上相关代码,增删debug后的一个可用版本,仅供参考。

下面是一个效果图

 

下面是源代码

  1 # -*- coding: utf-8 -*-
  2 # @Time    : 2019/5/1
  3 # @Author  : water66
  4 # @Site    :
  5 # @File    : notepad.py
  6 # @Version : 1.0
  7 # @Python Version : 3.6
  8 # @Software: PyCharm
  9 
 10 
 11 from tkinter import *
 12 from tkinter.filedialog import *
 13 from tkinter.messagebox import *
 14 from tkinter import scrolledtext
 15 import os
 16 
 17 filename=''
 18 
 19 
 20 def author():
 21     showinfo(title="作者", message="water66")
 22 
 23 
 24 def power():
 25     showinfo(title="版权信息", message="water66")
 26 
 27 
 28 def new_file(*args):
 29     global top, filename, textPad
 30     top.title("未命名文件")
 31     filename = None
 32     textPad.delete(1.0, END)
 33 
 34 
 35 def open_file(*args):
 36     global filename
 37     filename = askopenfilename(defaultextension=".txt")
 38     if filename == "":
 39         filename = None
 40     else:
 41         top.title(""+os.path.basename(filename))
 42         textPad.delete(1.0, END)
 43         f = open(filename, 'r', encoding="utf-8")
 44         textPad.insert(1.0, f.read())
 45         f.close()
 46 
 47 
 48 def click_open(event):
 49     global filename
 50     top.title("" + os.path.basename(filename))
 51     textPad.delete(1.0, END)
 52     f = open(filename, 'r', encoding="utf-8")
 53     textPad.insert(1.0, f.read())
 54     f.close()
 55 
 56 
 57 def save(*args):
 58     global filename
 59     try:
 60         f=open(filename, 'w', encoding="utf-8")
 61         msg=textPad.get(1.0, 'end')
 62         f.write(msg)
 63         f.close()
 64     except:
 65         save_as()
 66 
 67 
 68 def save_as(*args):
 69     global filename
 70     f = asksaveasfilename(initialfile="未命名.txt", defaultextension=".txt")
 71     filename = f
 72     fh = open(f, 'w', encoding="utf-8")
 73     msg = textPad.get(1.0, END)
 74     fh.write(msg)
 75     fh.close()
 76     top.title(""+os.path.basename(f))
 77 
 78 
 79 def rename(newname):
 80     global filename
 81     name = os.path.basename(os.path.splitext(filename)[0])
 82     oldpath = filename
 83     newpath = os.path.dirname(oldpath)+'/'+newname+'.txt'
 84     os.rename(oldpath, newpath)
 85     filename = newpath
 86     refresh()
 87         
 88         
 89 def rename_file(*args):
 90     global filename
 91     t = Toplevel()
 92     t.geometry("260x80+200+250")
 93     t.title('重命名')
 94     frame = Frame(t)
 95     frame.pack(fill=X)
 96     lable = Label(frame, text="文件名")
 97     lable.pack(side=LEFT, padx=5)
 98     var = StringVar()
 99     e1 = Entry(frame, textvariable=var)
100     e1.pack(expand=YES, fill=X, side=RIGHT)
101     botton = Button(t, text="确定", command=lambda: rename(var.get()))
102     botton.pack(side=BOTTOM, pady=10)
103 
104 
105 def delete(*args):
106     global filename, top
107     choice = askokcancel('提示', '要执行此操作吗')
108     if choice:
109         if os.path.exists(filename):
110             os.remove(filename)
111             textPad.delete(1.0, END)
112             top.title("记事本")
113             filename = ''
114 
115 
116 def cut():
117     global textPad
118     textPad.event_generate("<<Cut>>")
119 
120 
121 def copy():
122     global textPad
123     textPad.event_generate("<<Copy>>")
124 
125 
126 def paste():
127     global textPad
128     textPad.event_generate("<<Paste>>")
129 
130 
131 def undo():
132     global textPad
133     textPad.event_generate("<<Undo>>")
134 
135 
136 def redo():
137     global textPad
138     textPad.event_generate("<<Redo>>")
139 
140 
141 def select_all():
142     global textPad
143     textPad.tag_add("sel", "1.0", "end")
144 
145 
146 def find(*agrs):
147     global textPad
148     t = Toplevel(top)
149     t.title("查找")
150     t.geometry("260x60+200+250")
151     t.transient(top)
152     Label(t, text="查找:").grid(row=0, column=0, sticky="e")
153     v = StringVar()
154     e = Entry(t, width=20, textvariable=v)
155     e.grid(row=0, column=1, padx=2, pady=2, sticky="we")
156     e.focus_set()
157     c = IntVar()
158     Checkbutton(t, text="不区分大小写", variable=c).grid(row=1, column=1, sticky='e')
159     Button(t, text="查找所有", command=lambda: search(v.get(), c.get(), textPad, t, e)).grid\
160         (row=0, column=2, sticky="e"+"w", padx=2, pady=2)
161     
162     def close_search():
163         textPad.tag_remove("match", "1.0", END)
164         t.destroy()
165     t.protocol("WM_DELETE_WINDOW", close_search)
166 
167 
168 def mypopup(event):
169     global editmenu
170     editmenu.tk_popup(event.x_root, event.y_root)
171 
172 
173 def search(needle, cssnstv, textPad, t, e):
174     textPad.tag_remove("match", "1.0", END)
175     count = 0
176     if needle:
177         start = 1.0
178         while True:
179             pos = textPad.search(needle, start, nocase=cssnstv, stopindex=END)
180             if not pos:
181                 break
182             strlist = pos.split('.')
183             left = strlist[0]
184             right = str(int(strlist[1])+len(needle))
185             lastpos = left+'.'+right
186             textPad.tag_add("match", pos, lastpos)
187             count += 1
188             start = lastpos
189             textPad.tag_config('match', background="yellow")
190         e.focus_set()
191         t.title(str(count)+"个被匹配")
192 
193 
194 def refresh():
195     global top, filename
196     if filename:
197         top.title(os.path.basename(filename))
198     else:
199         top.title("记事本")
200 
201 
202 top = Tk()
203 top.title("记事本")
204 top.geometry("640x480+100+50")
205 
206 menubar = Menu(top)
207 
208 # 文件功能
209 filemenu = Menu(top)
210 filemenu.add_command(label="新建", accelerator="Ctrl+N", command=new_file)
211 filemenu.add_command(label="打开", accelerator="Ctrl+O", command=open_file)
212 filemenu.add_command(label="保存", accelerator="Ctrl+S", command=save)
213 filemenu.add_command(label="另存为", accelerator="Ctrl+shift+s", command=save_as)
214 filemenu.add_command(label="重命名", accelerator="Ctrl+R", command=rename_file)
215 filemenu.add_command(label="删除", accelerator="Ctrl+D", command=delete)
216 menubar.add_cascade(label="文件", menu=filemenu)
217 
218 # 编辑功能
219 editmenu = Menu(top)
220 editmenu.add_command(label="撤销", accelerator="Ctrl+Z", command=undo)
221 editmenu.add_command(label="重做", accelerator="Ctrl+Y", command=redo)
222 editmenu.add_separator()
223 editmenu.add_command(label="剪切", accelerator="Ctrl+X", command=cut)
224 editmenu.add_command(label="复制", accelerator="Ctrl+C", command=copy)
225 editmenu.add_command(label="粘贴", accelerator="Ctrl+V", command=paste)
226 editmenu.add_separator()
227 editmenu.add_command(label="查找", accelerator="Ctrl+F", command=find)
228 editmenu.add_command(label="全选", accelerator="Ctrl+A", command=select_all)
229 menubar.add_cascade(label="编辑", menu=editmenu)
230 
231 # 关于 功能
232 aboutmenu = Menu(top)
233 aboutmenu.add_command(label="作者", command=author)
234 aboutmenu.add_command(label="版权", command=power)
235 menubar.add_cascade(label="关于", menu=aboutmenu)
236 
237 top['menu'] = menubar
238 
239 shortcutbar = Frame(top, height=25, bg='Silver')
240 shortcutbar.pack(expand=NO, fill=X)
241 
242 textPad=Text(top, undo=True)
243 textPad.pack(expand=YES, fill=BOTH)
244 scroll=Scrollbar(textPad)
245 textPad.config(yscrollcommand=scroll.set)
246 scroll.config(command=textPad.yview)
247 scroll.pack(side=RIGHT, fill=Y)
248 
249 # 热键绑定
250 textPad.bind("<Control-N>", new_file)
251 textPad.bind("<Control-n>", new_file)
252 textPad.bind("<Control-O>", open_file)
253 textPad.bind("<Control-o>", open_file)
254 textPad.bind("<Control-S>", save)
255 textPad.bind("<Control-s>", save)
256 textPad.bind("<Control-D>", delete)
257 textPad.bind("<Control-d>", delete)
258 textPad.bind("<Control-R>", rename_file)
259 textPad.bind("<Control-r>", rename_file)
260 textPad.bind("<Control-A>", select_all)
261 textPad.bind("<Control-a>", select_all)
262 textPad.bind("<Control-F>", find)
263 textPad.bind("<Control-f>", find)
264 
265 textPad.bind("<Button-3>", mypopup)
266 top.mainloop()
View Code

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!