python--tkinter桌面编程开发--记事本
- 什么是TK\Tkinter
- Tkinter是连接Python和TK图形库的一个纽带(接口)
- Hello Tkinter
from tkinter import *
root=Tk() #tk类的一个实例 显示一个窗口
label=Label(root,text='Hello world!')
label.pack() #显示 root.mainloop()#进入死循环 让窗口一直显示
- Hello tkinter扩展
#coding=gbk
#将tkinter封装
from tkinter import Frame, Button
from tkinter import * class App:
def __init__(self,master):#maseter 根窗体的一个实例
frame=Frame(master) #frame是在root window上的东西,父窗体是root windows
frame.pack()
#Button是frame上面的东西
self.button=Button(frame,text='Hello class',fg='red',command=frame.quit) #frame上面有一个button self.button.pack()#显示 self.hiButton=Button(frame,text='say hi',command=self.say_hi)
self.hiButton.pack()
def say_hi(self):
print('hi fuzhiqiang,thanks!') root=Tk()
app=App(root)
root.mainloop()- GUI类库设计架构-Tkinter架构
- UI的结构底层的容器窗体:root window,在root上面就会有一些容器的UI,在UI的上面又会有一些其他的UI
- 分类:
- widget(显示)
- WM(管理:窗体的显示,添加,例如pack()),
- event(事件传导机制):输入事件,状态事件(鼠标的挪进挪出),管理事件(窗体的生命周期的消亡)
详细的窗体的文本:http://effbot.org/tkinterbook/tkinter-classes.htm
- config配置外观
#coding=gbk
from tkinter import *
root=Tk() #tk类的一个实例 显示一个窗口
label=Label(root,text='Hello world!') label.config(cursor='gumby')#config 配置 当忘记了一些东西,可以通过这个配置
label.config(width=80,height=10,fg='yellow',bg='dark green')
label.config(font=('times','','bold'))#font也是一个list
label.pack() #显示 root.mainloop()#进入死循环 让窗口一直显示- widget style组件外观属性
- http://effbot.org/tkinterbook/tkinter-widget-styling.htm 在这个网站上有可以配置的外观属性,上去查阅就行
#coding=gbk
from tkinter import * button=Button(text='fuzhiqiangButton',padx=150,pady=50) #布局相关的padx X轴的间距
button.config(cursor='gumby')
button.config(bd=8,relief=RAISED) #bd 边界 relief 图标效果
button.config(bg='green',fg='yellow') #背景色
button.config(font=('Helvetica',10,'bold italic')) #字体
button.pack()
button.mainloop()
- 事件Events 和 Bindings
- 事件的分类
- enentformats:<Button-1>点击左键<Button-2>点击右键<B1-Motion>左键移动<ButtonRelease-1>左键释放<Double-Button-1>双击左键<Enter>进入<Leave>离开<FocusIn><FocusOut><Return><Key>
- enent attributes:widget,x,y,x_root,y_root,keycode(),num(),width,height,type
- protocol
- 实现事件方式
- command 按钮级别
- bind(绑定) 按钮级别
- protacl(协议监听)系统级别
#coding=gbk
from tkinter import *
import tkinter.messagebox
root=Tk() # def button1Click(): #回调函数
# print('button clicked')
# button=Button(text='hello ',command=button1Click)#调用一个函数 command 回调
# button.pack()
# button.mainloop() def callback(event):
frame.focus_set()#点击前得到一个焦点
print('clicked at:',event.x,event.y)#打印出这个焦点的坐标 def key(event):
print('pressed',repr(event.char))#把字符打印 def closeWindow():
if tkinter.messagebox.askokcancel('Quit','do you want to exit'):
root.destroy() frame=Frame(root,width=100,height=100) #Frame相当于一个容器
frame.bind('<Button-1>',callback ) #绑定函数 左键点击
frame.bind('<Key>',key)
frame.pack() root.protocol('WM_DELETE_WINDOW',closeWindow) root.mainloop()
- 事件的分类
- BaseWindow-TopLevel
- 在一个窗体上面弹出一个新的窗体:依靠TopLevel
#coding=gbk
from tkinter import * root=Tk()
root.title('root window')
top=Toplevel(bg='red')#新建了一个窗体 Frame只是一个区域的容器放在窗体中,TopLevel是弹出了一个新的窗体
top.title('top level')
root.mainloop()
- c菜单
#coding=gbk
from tkinter import * def callback():#菜单点击回调函数
print('called the menu') root=Tk()
menu=Menu(root)#菜单对象,在root上面
root.config(menu=menu)#第一个menu是属性名称,第二个是值 filemenu=Menu(menu)#这里的menu的父菜单是 menu=Menu(root)中的menu
menu.add_cascade(label='File',menu=filemenu)#添加一个子菜单 filemenu
filemenu.add_command(label='New',command=callback)#子菜单的一些内容设置
filemenu.add_command(label='Open',command=callback)
filemenu.add_separator() #添加一个下划线
filemenu.add_command(label='Exit',command=callback) helpmenu=Menu(menu)#和上面类似
menu.add_command(label='Help',command=callback)
helpmenu.add_command(label='About...',command=callback) root,mainloop( )
- 工具栏
- ToolBar
#coding=gbk
from tkinter import * root=Tk()
def callback():
print('clicked tool bar button') #实现工具条 用Frame实现ToolBar
toolbar=Frame(root)
b=Button(toolbar,text='New',width=6,command=callback)
b.pack(side=LEFT,padx=2,pady=2)#side 放置的位置 padx 间距 c=Button(toolbar,text='Open',width=6,command=callback)
c.pack(side=LEFT,padx=2,pady=2) toolbar.pack(side=TOP,fill=X)
root.mainloop()
- MessageBox
- python中导入tkmessageBox需要这样导入 import tkinter.messagebox
#coding=gbk
from tkinter import *
import tkinter.messagebox
root =Tk()
def callback():
if tkinter.messagebox.askyesno('fuzhiqiang', 'hi fuzhiqiang'): #弹出消息提醒的窗体,做消息判断的时候很有用
print('clicked yes')
else:
print('clicked no') button=Button(root,text='Button1',command=callback)
button.pack()
root.mainloop()
- 状态栏--StatusBar
#coding=gbk
from tkinter import * root =Tk()
status=Label(root,text='line20',bd=1,relief=SUNKEN,anchor=W)#anchor 对齐方式 W 西边左对齐
status.pack(side=BOTTOM,fill=X)
root.mainloop()
- 学习完桌面编程之后,决定自己写一个简单的记事本来练练手,熟悉熟悉学的东西,深入理解一下。
- 项目简要分析
- 界面实现:menu,statusbar,text,toolbar,thinter.messagebox,tkFileDialog
- 功能实现:text相关操作,文件读写操作
- 菜单的实现
#coding=gbk from tkinter import * root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('500x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N')#accelerator 快捷键, new 点击事件函数
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) editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
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)
root.mainloop()实现toolbar
#coding=gbk from tkinter import * root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('500x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N')#accelerator 快捷键, new 点击事件函数
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) editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
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) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开')
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存')
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色 root.mainloop()- 显示状态栏
#coding=gbk from tkinter import * root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('500x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N')#accelerator 快捷键, new 点击事件函数
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) editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
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) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开')
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存')
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 root.mainloop()- 正文编辑区域Text和Scrollbar
#coding=gbk from tkinter import * root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('800x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 大小 800x500 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N')#accelerator 快捷键, new 点击事件函数
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) editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
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) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开')
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存')
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 #linenumber&text
lnlabel=Label(root,width=2,bg='antique white')
lnlabel.pack(side=LEFT,fill=Y)#将Y轴填充满 textPad=Text(root,undo=True)
textPad.pack(expand=YES, fill=BOTH)#允许进行扩展 ,填充X,Y轴 scroll=Scrollbar(textPad)#右侧的移动下滑栏
textPad.config(yscrollcommand=scroll.set)#在Y轴显示 yscrollcommand
scroll.config(command=textPad.yview)#这是为了让编辑内容和下拉栏同时移动
scroll.pack(side=RIGHT,fill=Y)#显示 root.mainloop()- 关于about信息的实现
#coding=gbk from tkinter import *
from tkinter.messagebox import * #这是弹出窗口 def author():#将函数与about进行了绑定
showinfo('作者信息', '本软件由付志强完成!')
def about():
showinfo('版权信息。copyright', '本软件归属于付志强') root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('800x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 大小 800x500 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N')#accelerator 快捷键, new 点击事件函数
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) #编辑菜单
editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
editmenu.add_command(label='查找',accelerator='Ctrl + F')
editmenu.add_command(label='全选',accelerator='Ctrl + A')
menubar.add_cascade(label='编辑',menu=editmenu) #about菜单
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='作者',command=author)#command 对应的函数定义在前面
aboutmenu.add_command(label='版权',command=about)
menubar.add_cascade(label='关于',menu=aboutmenu) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开')
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存')
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 #linenumber&text
lnlabel=Label(root,width=2,bg='antique white')
lnlabel.pack(side=LEFT,fill=Y)#将Y轴填充满 textPad=Text(root,undo=True)
textPad.pack(expand=YES, fill=BOTH)#允许进行扩展 ,填充X,Y轴 scroll=Scrollbar(textPad)#右侧的移动下滑栏
textPad.config(yscrollcommand=scroll.set)#在Y轴显示 yscrollcommand
scroll.config(command=textPad.yview)#这是为了让编辑内容和下拉栏同时移动
scroll.pack(side=RIGHT,fill=Y)#显示 #about信息实现 root.mainloop()- 文件操作
- 新的库的学习:File Dialogs 地址:effbot.org/tkinterbook/tkinter-file-dialogs.htm
- askopenfilename和asksaveasfilename:打开和保存操作。
#coding=gbk from tkinter import *
from tkinter.messagebox import * #这是弹出窗口
from tkinter.filedialog import *
import os
from email.policy import default
from setuptools.sandbox import save_argv
filename='' #about实现
def author():#将函数与about进行了绑定
showinfo('作者信息', '本软件由付志强完成!')
def about():
showinfo('版权信息。copyright', '本软件归属于付志强') def openfile():#打开文件函数 文件名应该是全局变量,因为还可能需要保存
global filename#使用全局变量
filename=askopenfilename(defaultextension='.txt')#提供一个打开的方式 默认的扩展名.txt
if filename=='': #如果打开的文件是空的,设置为空
filename=None
else:#如果不为空,就加载到title上
root.title('FileName:'+os.path.basename(filename))#找到实际路径
#如果打开的手编辑器里面有正在编写的内容,就要清空原来的内容
textPad.delete(1.0, END)#删除从头到尾 第一行的第0列
f=open(filename,'r')#打开文件
textPad.insert(1.0,f.read())#插入内容,从1.0处插入
f.close()#关闭文件 def newfile():
global filename
root.title('未命名文件')
filename=None
textPad.delete(1.0,END) #保存和另存为
#保存时保存在到一个默认的地址
#另存是需要弹出一个对话框去存储你要存取的地址
def save():#封装保存
global filename
#如果文件存在的话就是直接保存在默认的路径
#如果不存在的话就是另存为一个新的文件
try:
f=open(filename,'w')
msg=textPad.get(1.0,END)
f.write(msg)
f.close()
except:
saves()
def saves():#文件的另存为保存
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))#存储文件 root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('800x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 大小 800x500 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N',command=newfile)#accelerator 快捷键, new 点击事件函数
filemenu.add_command(label='打开',accelerator='Ctrl + O',command=openfile)
filemenu.add_command(label='保存',accelerator='Ctrl + S',command=save)
filemenu.add_command(label='另存为',accelerator='Ctrl + Shift + S',command=saves)
menubar.add_cascade(label='文件',menu=filemenu) #编辑菜单
editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z')
editmenu.add_command(label='重做',accelerator='Ctrl + Y')
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X')
editmenu.add_command(label='复制',accelerator='Ctrl + C')
editmenu.add_command(label='粘贴',accelerator='Ctrl + V')
editmenu.add_separator()#分隔符
editmenu.add_command(label='查找',accelerator='Ctrl + F')
editmenu.add_command(label='全选',accelerator='Ctrl + A')
menubar.add_cascade(label='编辑',menu=editmenu) #about菜单
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='作者',command=author)#command 对应的函数定义在前面
aboutmenu.add_command(label='版权',command=about)
menubar.add_cascade(label='关于',menu=aboutmenu) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开',command=openfile)
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存',command=save)
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 #linenumber&text
lnlabel=Label(root,width=2,bg='antique white')
lnlabel.pack(side=LEFT,fill=Y)#将Y轴填充满 textPad=Text(root,undo=True)
textPad.pack(expand=YES, fill=BOTH)#允许进行扩展 ,填充X,Y轴 scroll=Scrollbar(textPad)#右侧的移动下滑栏
textPad.config(yscrollcommand=scroll.set)#在Y轴显示 yscrollcommand
scroll.config(command=textPad.yview)#这是为了让编辑内容和下拉栏同时移动
scroll.pack(side=RIGHT,fill=Y)#显示 #about信息实现 root.mainloop()
- 复制粘贴操作
- 存在于event generate,存在于Tk库中 ,源码地址:http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm
#coding=gbk from tkinter import *
from tkinter.messagebox import * #这是弹出窗口
from tkinter.filedialog import *
import os
from email.policy import default
from setuptools.sandbox import save_argv
from asyncio.protocols import Protocol
filename='' #about实现
def author():#将函数与about进行了绑定
showinfo('作者信息', '本软件由付志强完成!')
def about():
showinfo('版权信息。copyright', '本软件归属于付志强') def openfile():#打开文件函数 文件名应该是全局变量,因为还可能需要保存
global filename#使用全局变量
filename=askopenfilename(defaultextension='.txt')#提供一个打开的方式 默认的扩展名.txt
if filename=='': #如果打开的文件是空的,设置为空
filename=None
else:#如果不为空,就加载到title上
root.title('FileName:'+os.path.basename(filename))#找到实际路径
#如果打开的手编辑器里面有正在编写的内容,就要清空原来的内容
textPad.delete(1.0, END)#删除从头到尾 第一行的第0列
f=open(filename,'r')#打开文件
textPad.insert(1.0,f.read())#插入内容,从1.0处插入
f.close()#关闭文件 def newfile():
global filename
root.title('未命名文件')
filename=None
textPad.delete(1.0,END) #保存和另存为
#保存时保存在到一个默认的地址
#另存是需要弹出一个对话框去存储你要存取的地址
def save():#封装保存
global filename
#如果文件存在的话就是直接保存在默认的路径
#如果不存在的话就是另存为一个新的文件
try:
f=open(filename,'w')
msg=textPad.get(1.0,END)
f.write(msg)
f.close()
except:
saves()
def saves():#文件的另存为保存
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))#存储文件 # bind()
# Protocol
# event generate #复制粘贴撤销重做
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>>') root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('800x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 大小 800x500 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N',command=newfile)#accelerator 快捷键, new 点击事件函数
filemenu.add_command(label='打开',accelerator='Ctrl + O',command=openfile)
filemenu.add_command(label='保存',accelerator='Ctrl + S',command=save)
filemenu.add_command(label='另存为',accelerator='Ctrl + Shift + S',command=saves)
menubar.add_cascade(label='文件',menu=filemenu) #编辑菜单
editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z',command=undo)
editmenu.add_command(label='重做',accelerator='Ctrl + Y',command=redo)
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X',command=cut)
editmenu.add_command(label='复制',accelerator='Ctrl + C',command=copy)
editmenu.add_command(label='粘贴',accelerator='Ctrl + V',command=paste)
editmenu.add_separator()#分隔符
editmenu.add_command(label='查找',accelerator='Ctrl + F')
editmenu.add_command(label='全选',accelerator='Ctrl + A')
menubar.add_cascade(label='编辑',menu=editmenu) #about菜单
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='作者',command=author)#command 对应的函数定义在前面
aboutmenu.add_command(label='版权',command=about)
menubar.add_cascade(label='关于',menu=aboutmenu) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开',command=openfile)
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存',command=save)
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 #linenumber&text
lnlabel=Label(root,width=2,bg='antique white')
lnlabel.pack(side=LEFT,fill=Y)#将Y轴填充满 textPad=Text(root,undo=True)
textPad.pack(expand=YES, fill=BOTH)#允许进行扩展 ,填充X,Y轴 scroll=Scrollbar(textPad)#右侧的移动下滑栏
textPad.config(yscrollcommand=scroll.set)#在Y轴显示 yscrollcommand
scroll.config(command=textPad.yview)#这是为了让编辑内容和下拉栏同时移动
scroll.pack(side=RIGHT,fill=Y)#显示 #about信息实现 root.mainloop()
- 全选和查找
#coding=gbk from tkinter import *
from tkinter.messagebox import * #这是弹出窗口
from tkinter.filedialog import *
import os
from email.policy import default
from setuptools.sandbox import save_argv
from asyncio.protocols import Protocol
filename='' #about实现
def author():#将函数与about进行了绑定
showinfo('作者信息', '本软件由付志强完成!')
def about():
showinfo('版权信息。copyright', '本软件归属于付志强') def openfile():#打开文件函数 文件名应该是全局变量,因为还可能需要保存
global filename#使用全局变量
filename=askopenfilename(defaultextension='.txt')#提供一个打开的方式 默认的扩展名.txt
if filename=='': #如果打开的文件是空的,设置为空
filename=None
else:#如果不为空,就加载到title上
root.title('FileName:'+os.path.basename(filename))#找到实际路径
#如果打开的手编辑器里面有正在编写的内容,就要清空原来的内容
textPad.delete(1.0, END)#删除从头到尾 第一行的第0列
f=open(filename,'r')#打开文件
textPad.insert(1.0,f.read())#插入内容,从1.0处插入
f.close()#关闭文件 def newfile():
global filename
root.title('未命名文件')
filename=None
textPad.delete(1.0,END) #保存和另存为
#保存时保存在到一个默认的地址
#另存是需要弹出一个对话框去存储你要存取的地址
def save():#封装保存
global filename
#如果文件存在的话就是直接保存在默认的路径
#如果不存在的话就是另存为一个新的文件
try:
f=open(filename,'w')
msg=textPad.get(1.0,END)
f.write(msg)
f.close()
except:
saves()
def saves():#文件的另存为保存
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))#存储文件 # bind()
# Protocol
# event generate #复制粘贴撤销重做
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) #查找
#这里要用到自定义窗体,弹出窗体toplevel,查看前面代码
def search():
#创建弹出窗口进行查找
topsearch=Toplevel(root)
topsearch.geometry('800x300+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) #匹配输入的值并且在里面查询 root=Tk()
root.title('Fuzhiqiang Node')
root.geometry('800x500+100+100') #构建一个矩形窗体 初始化的显示位置 100 100 大小 800x500 #创建一个menu
menubar=Menu(root)
root.config(menu=menubar)
#创建一系列的子menu
filemenu=Menu(menubar)
filemenu.add_command(label='新建',accelerator='Ctrl + N',command=newfile)#accelerator 快捷键, new 点击事件函数
filemenu.add_command(label='打开',accelerator='Ctrl + O',command=openfile)
filemenu.add_command(label='保存',accelerator='Ctrl + S',command=save)
filemenu.add_command(label='另存为',accelerator='Ctrl + Shift + S',command=saves)
menubar.add_cascade(label='文件',menu=filemenu) #编辑菜单
editmenu=Menu(menubar)
editmenu.add_command(label='撤销',accelerator='Ctrl + Z',command=undo)
editmenu.add_command(label='重做',accelerator='Ctrl + Y',command=redo)
editmenu.add_separator()#分隔符
editmenu.add_command(label='剪切',accelerator='Ctrl + X',command=cut)
editmenu.add_command(label='复制',accelerator='Ctrl + C',command=copy)
editmenu.add_command(label='粘贴',accelerator='Ctrl + V',command=paste)
editmenu.add_separator()#分隔符
editmenu.add_command(label='查找',accelerator='Ctrl + F',command=search)
editmenu.add_command(label='全选',accelerator='Ctrl + A',command=selectAll)
menubar.add_cascade(label='编辑',menu=editmenu) #about菜单
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='作者',command=author)#command 对应的函数定义在前面
aboutmenu.add_command(label='版权',command=about)
menubar.add_cascade(label='关于',menu=aboutmenu) #实现toolbar
toolbar=Frame(root,height=25,bg='light sea green')
shortButton=Button(toolbar,text='打开',command=openfile)
shortButton.pack(side=LEFT,padx=5,pady=5) shortButton=Button(toolbar,text='保存',command=save)
shortButton.pack(side=LEFT)
toolbar.pack(expand=NO,fill=X)#全部填充海蓝色,显示toolbar栏 #status bar
status=Label(root,text='Ln20',relief=SUNKEN,anchor=W)#对齐方式 W 左对齐
status.pack(side=BOTTOM,fill=X) #显示status状态栏 #linenumber&text
lnlabel=Label(root,width=2,bg='antique white')
lnlabel.pack(side=LEFT,fill=Y)#将Y轴填充满 textPad=Text(root,undo=True)
textPad.pack(expand=YES, fill=BOTH)#允许进行扩展 ,填充X,Y轴 scroll=Scrollbar(textPad)#右侧的移动下滑栏
textPad.config(yscrollcommand=scroll.set)#在Y轴显示 yscrollcommand
scroll.config(command=textPad.yview)#这是为了让编辑内容和下拉栏同时移动
scroll.pack(side=RIGHT,fill=Y)#显示 #about信息实现 root.mainloop()
- 终于写完了,凑合着玩玩,喜欢的可以自己玩玩。
python--tkinter桌面编程开发--记事本的更多相关文章
- 用python进行桌面程序开发
Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定.这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所 ...
- 学习python-20191208(1)-Python Flask高级编程开发鱼书_第03章_数据与flask路由
视频01: 略...... ———————————————————————————————————————————————————————————— 视频02: 搜索需要外部数据源,也就是需要外部的A ...
- 学习python-20191230(1)-Python Flask高级编程开发鱼书_第04章_应用、蓝图与视图函数
视频06: 1.自动导包快捷键——默认为alt + enter 键组合 选中的字符由小写变为大写——Ctrl + Shift + U键组合 2.DataRequired()——防止用 ...
- 学习python-20191217(1)-Python Flask高级编程开发鱼书_第04章_应用、蓝图与视图函数
视频01: flask框架:最上层是app,它就像一个插线板一样,比如可以插入蓝图,还可以插入其他各种flask插件. 每个蓝图又可以插入很多视图函数,并可指定静态文件夹和模板文件夹. 好的代码结构, ...
- 学习python-20191208(2)-Python Flask高级编程开发鱼书_第03章_数据与flask路由
视频06: 定义静态方法的两种方式: 1.在方法上方加上装饰@staticmethod 2.在方法上方加上装饰@classmethod 方法中要加参数cls 如:def search_by_isb ...
- Python黑帽编程1.2 基于VS Code构建Python开发环境
Python黑帽编程1.2 基于VS Code构建Python开发环境 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...
- Python自学编程开发路线图(文中有免费资源)
Python核心编程 免费视频资源<Python入门教程>:http://yun.itheima.com/course/145.html Python 基础学习大纲 所处阶段 主讲内容 技 ...
- 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问
from:https://zhuanlan.zhihu.com/p/30553607 小编在最初使用上Python之后,就一发不可收拾,人生苦短.我用Python,不光是因为其优雅简洁, ...
- Python GUI——tkinter菜鸟编程(中)
8. Radiobutton 选项按钮:可以用鼠标单击方式选取,一次只能有一个选项被选取. Radiobutton(父对象,options,-) 常用options参数: anchor,bg,bitm ...
随机推荐
- BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)
题目链接 dp进阶之CDQ分治优化dp. 前置技能:dp基本功底,CDQ分治,树状数组. 问题等价于求二维最长上升子序列,是一个三维偏序问题(时间也算一维). 设$dp[i]=(l,x)$为以第i枚导 ...
- HDU - 5730 :Shell Necklace(CDQ分治+FFT)
Perhaps the sea‘s definition of a shell is the pearl. However, in my view, a shell necklace with n b ...
- 2.Linux下安装Jenkins
1.安装jenkins的前提是安装好jdk环境,自行安装jdk,若安装成功后,使用一下命令即可成功安装jenkins: wget -O /etc/yum.repos.d/jenkins.repo ht ...
- 反射ORM 三层(for sql server/mysql)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...
- 分析诊断工具之一:MYSQL性能查看(多指标)
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...
- Mina APR传输与串口传输讲解---zhengli
原文地址:Mina Transports(Apache Mina user guide Chapter6 Transport) 1.1.1.APR传输 1.1.1.1.介绍 APR (Apache P ...
- dialog插件demo
基本操作 默认窗体 new Dialog('这是一个默认对话框').show(); 非模态对话框 new Dialog('非模态对话框,可以打开多个!',{modal:false}).show(); ...
- 2016.8.17服务器端数据库用户导入导出方法 expdp和impdp
EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. IMP只适用于EXP导出的 ...
- windows下基于bat的每1分钟执行一次一个程序
@echo off cls mode con cols=35 lines=6 & color 5B :p call python C:\省局监控\ahwater_perf_monitor.py ...
- js中的执行环境和作用域链
首先介绍一些即将用到的概念: 执行环境: 它定义了变量和函数有权访问其他数据的范围,每一个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中. 所有javasc ...