摘要:
本文是使用Python,結合Tkinter開發簡單記事本。
本文的操作環境:ubuntu,Python2.7,采用的是Pycharm進行代碼編輯,個人很喜歡它的代碼自動補齊功能。
最近很想對python加深學習一下,同時也是想試着做一些東西,今天使用python,結合Tkinter來做一個簡單的跨平台記事本。最終實現的記事本如下,也算是麻雀雖小,五臟俱全了,之后也是會繼續完善的:
如上圖,我們可以看到這個記事本主要分為三個模塊:文件,編輯和關於,結合我自身的習慣外加四個toolbar:新建、打開、撤銷和保存。下來就我個人構建這個記事本做個總結。
一 整體框架構建
1.三個主模塊的建立
首先,我們先建立上圖中的三個主模塊,同時,在模塊中建立各個模塊的功能。先以文件為例:下設功能:新建、打開、保存和另存為,代碼如下:
#-*-encoding:utf8
from Tkinter import * root = Tk() root.title('Benben Node') #create menu
menubar = 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並設定合適的間距,對應的代碼如下:
#toolbar
toolbar = 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")
編輯狀態欄的代碼:
#statusbar
status = 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。運行代碼,功能實現!快捷鍵親測可用~
這算是對此次開發的簡單記事本的一個總結,之后有時間也是會添加更多的功能。