最近想对 python 加深学习一下,同时也是想试着做一些东西,所以使用 python, 结合 Tkinter 来做一个简单的跨平台记事本。最终实现的记事本如下,也算是麻雀虽小,五脏俱全了,之后也是会继续完善的。文中通过图文及示例代码介绍的很详细,有需要的朋友们可以参考借鉴。
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
前言
本文的操作环境:ubuntu,Python2.7,采用的是 Pycharm 进行代码编辑,个人很喜欢它的代码自动补齐功能。
示例图
如上图,我们可以看到这个记事本主要分为三个模块:文件,编辑和关于,结合我自身的习惯外加四个 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。运行代码,功能实现!快捷键亲测可用~
总结
以上就是这篇文中的全部内容了,这算是对此次开发的简单记事本的一个总结,之后有时间也是会添加更多的功能。希望本文的内容对大家的学习或者工作能带来一定的帮助,如果疑问大家可以留言交流。
来源: http://www.phperz.com/article/17/0319/308384.html