利用Python开发实现简单的记事本
作者:杨可爱 发布时间:2023-07-02 13:27:27
前言
本文的操作环境: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。运行代码,功能实现!快捷键亲测可用~
猜你喜欢
- 昨天美国雅虎正式宣布网站首页的新版,这也算互联网一件大事,尤其是对设计的朋友们。而且现在的美国雅虎的情况也不是很好的情况下有大刀阔斧的进行改
- MS SQL Server 2000通过企业管理器设置数据库的定期自动备份计划。1、打开企业管理器,双击打开你的服务器2、然后点上面菜单中的
- 先来看看js中的Null类型表示什么?null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象,一般一个未定义的变量在初次使用
- 今天下午主要做了个实验,是针对 测试表的列,进行添加,修改,删除的。做法如下: 增加一列: alter table emp4 add tes
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 6 - Manipulating HTML通过Mo
- 在按钮旁边加文字1.打开editor/js/ 两个js文件fckeditorcode_gecko.js fckeditorcode_ie.j
- 只能输入中文/** * 22.验证汉字 * 表达式 ^[\u4e00-\u9fa5]{0,}$ * 描述 只能汉字 * 匹配的例子 清清月儿
- 本文列出了一些asp编程种可能会用到的正则表达式例子,大家可以方便的调用!如果您对asp种的正则表达式不是很了解可以看看这篇文章《ASP中R
- <% SoFia_DbName="jiaoyou&qu
- 1.在使用MySQL和php的时候出现过中文乱码问题(1) 只要是gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,当然
- aspjpeg组件实现加水印函数的调用方法: <%printwater "/images/水印图片.gif",&q
- 当你准备全面进军web标准时,有时候你是不是被表格的弄得焦头烂额呢?比如,原来使用“非法”的nobr现在要用什么来代替呢?今天,就让我来一个
- 现在越来越多的浏览器有拦截弹出窗口的功能。广告弹出来给拦掉了就无所谓,要是客户在付款时给拦掉了可就不能乱算了。Gmail的“哎呀”算是经典,
- Array(数组)内部机制在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可
- 上期回顾:亚马逊购物用户体验分析 (二)方便的导航元素任何网上商店的成功,至关重要的一点,就是用户可以简单轻松地使用导航条。基本店铺分类,用
- //1、运行到C盘根目录 //2、输入:SET ORACLE_SID = 你的SID名称 3、输入:sqlplus/nolog 4、输入:c
- sql2000的服务器版本是8.0,sql2005是9.0首先要读安装必须配置(见后记)1.我是先装2000的,安装好后打上sp4补丁,(s
- 同MongoDB,Redis这样的NoSQL数据库的复制相比,MySQL复制显得相当复杂!概述首先主服务器把数据变化记录到主日志,然后从服务
- 1,WITH TEMPLET意思是,生成的页面架构将采用某个已设定的模板,在此之前我的一篇教程中介绍过,希望各位在看本教程之前对ASP采用模
- 为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时