前言
本文的作業環境:ubuntu,Python2.7,採用的是Pycharm進行代碼編輯,個人很喜歡它的代碼自動補齊功能。
樣本圖
如上圖,我們可以看到這個記事本主要分為三個模組:檔案,編輯和關於,結合我自身的習慣外加四個toolbar:建立、開啟、撤銷和儲存。
下來就我個人構建這個記事本做個總結。
一、整體架構構建
1.三個主模組的建立
首先,我們先建立上圖中的三個主模組,同時,在模組中建立各個模組的功能。先以檔案為例:下設功能:建立、開啟、儲存和另存新檔,代碼如下:
#-*-encoding:utf8from Tkinter import *root = Tk()root.title('Benben Node')#create menumenubar = Menu(root)root.config(menu = menubar)filemenu = Menu(menubar)filemenu.add_command(label = '建立',accelerator ='ctrl + N')filemenu.add_command(label = '開啟',accelerator ='ctrl + O')filemenu.add_command(label = '儲存',accelerator ='ctrl + S')filemenu.add_command(label = '另存新檔',accelerator ='ctrl + Shift + s')menubar.add_cascade(label = '檔案',menu = filemenu)root.mainloop()
運行結果:
我們可以看到一個簡單的檔案欄就建好了。對應的建立編輯和關於模組。編輯指的是對文本編輯中要使用的模組,下設功能:撤銷,重做,複製,剪下,粘貼,尋找和全選;關於是下設作者和著作權兩欄。相應模組對應的代碼如下:
#編輯editmenu = Menu(menubar)editmenu.add_command(label = '撤銷',accelerator = 'ctrl + z')editmenu.add_command(label = '重做',accelerator = 'ctrl + y')editmenu.add_command(label = '複製',accelerator = 'ctrl + c')editmenu.add_command(label = '剪下',accelerator = 'ctrl + x')editmenu.add_command(label = '粘貼',accelerator = 'ctrl + v')editmenu.add_command(label = '尋找',accelerator = 'ctrl + F')editmenu.add_command(label = '全選',accelerator = 'ctrl + A')menubar.add_cascade(label = '編輯',menu = editmenu)#關於aboutmenu = Menu(menubar)aboutmenu.add_command(label = '作者')aboutmenu.add_command(label = '著作權')menubar.add_cascade(label = '關於',menu = aboutmenu)
運行結果:
截圖未能得到各個模組對應的功能。
2.toolbar
在記事本中添加toolbar,添加對應的button並設定合適的間距,對應的代碼如下:
#toolbartoolbar = Frame(root,height = 15,bg = 'SkyBlue')shortButton = Button(toolbar,text = '建立',command = open)shortButton.pack(side = LEFT)shortButton = Button(toolbar,text = '開啟',command = openfile)shortButton.pack(side = LEFT,padx = 5,pady = 5)shortButton = Button(toolbar,text = '儲存',command = save)shortButton.pack(side = RIGHT)shortButton = Button(toolbar,text = '撤銷',command = undo)shortButton.pack(side = RIGHT,padx = 5,pady = 5)toolbar.pack(expand = NO,fill = X)
3.建立狀態列(statusbar)和本文編輯地區
首先在程式中添加:
root = Tk()root.title('Benben Node')root.geometry("800x500+100+100")
編輯狀態列的代碼:
#statusbarstatus = Label(root,text = 'Ln20',bd = 1,relief = SUNKEN,anchor = 'w')status.pack(side = BOTTOM,fill = X)
當然我們還可以建立相應的編輯地區和捲軸,對應的代碼如下:
#本文編輯地區lnlabel = Label(root,width = 2,bg = 'antique white')lnlabel.pack(side = LEFT,fill = Y)textpad = Text(root,undo = True)textpad.pack(expand = YES,fill = BOTH)scroll = Scrollbar(textpad)textpad.config(yscrollcommand = scroll.set)scroll.config(command = textpad.yview)scroll.pack(side = RIGHT,fill = Y)
執行代碼,結果:
輸入相應的可以看到右邊界對應的捲軸隨輸入滾動。
二、關於模組的實現
在這三個模組中,關於是最好實現的一個,那就從最簡單的開始實現吧。
對應的代碼如下:
from tkMessageBox import *#關於def author(): showinfo('作者資訊','本軟體由可愛的奔奔完成')def about(): showinfo('著作權資訊.copyright','著作權屬於奔奔')aboutmenu = Menu(menubar)aboutmenu.add_command(label = '作者',command = author)aboutmenu.add_command(label = '著作權',command = about)menubar.add_cascade(label = '關於',menu = aboutmenu)
運行結果:
三、檔案模組的實現
這部分的實現參見Tkinter官網中的fileDialogs,相應的使用各個方法實現功能:建立、開啟、儲存和另存新檔,建立相應的函數實現,代碼如下:
#建立def new(): root.title('未命名檔案') filename = None textpad.delete(1.0,END)#開啟def openfile(): global filename filename = askopenfilename(defaultextension = '.txt') if filename == '': filename = None else: root.title('FileName:'+os.path.basename(filename)) textpad.delete(1.0,END) f = open(filename,'r') textpad.insert(1.0,f.read()) f.close()#儲存def save(): global filename try: f = open(filename,'w') msg = textpad.get(1.0,END) f.write(msg) f.close() except: saveas()#另存新檔def saveas(): f = asksaveasfilename(initialfile= '未命名.txt', defaultextension='.txt') global filename filename = f fh = open(f,'w') msg = textpad.get(1.0,END) fh.write(msg) fh.close() root.title('FileName:'+os.path.basename(f))
相應的在filemenu和toolbar中加入對應的command,運行結果:
四、編輯模組的實現
編輯要實現的功能:撤銷,重做,複製,剪下,粘貼,尋找和全選,對應的函數代碼如下:
def cut(): textpad.event_generate('<<Cut>>')def copy(): textpad.event_generate('<<Copy>>')def paste(): textpad.event_generate('<<Paste>>')def redo(): textpad.event_generate('<<Redo>>')def undo(): textpad.event_generate('<<Undo>>')def selectAll(): textpad.tag_add('sel','1.0',END)def search(): topsearch = Toplevel(root) topsearch.geometry('300x30+200+250') label1 = Label(topsearch,text='Find') label1.grid(row=0, column=0,padx=5) entry1 = Entry(topsearch,width=20) entry1.grid(row=0, column=1,padx=5) button1 = Button(topsearch,text='尋找') button1.grid(row=0, column=2)
同樣在editmenu和toolbar中加入對應的command。運行代碼,功能實現!快速鍵親測可用~
總結
以上就是這篇文中的全部內容了,這算是對此次開發的簡單記事本的一個總結,之後有時間也是會添加更多的功能。希望本文的內容對大家的學習或者工作能帶來一定的協助,如果疑問大家可以留言交流。