- 什么是TK\Tkinter
- Tkinter是连接Python和TK图形库的一个纽带(接口)
- Hello Tkinter
-
View Code
from tkinter import * root=Tk() #tk类的一个实例 显示一个窗口 label=Label(root,text=\'Hello world!\') label.pack() #显示 root.mainloop()#进入死循环 让窗口一直显示
-
- Hello tkinter扩展
-
View Code
#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配置外观
-
View Code
#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\',\'28\',\'bold\'))#font也是一个list label.pack() #显示 root.mainloop()#进入死循环 让窗口一直显示
- widget style组件外观属性
- http://effbot.org/tkinterbook/tkinter-widget-styling.htm 在这个网站上有可以配置的外观属性,上去查阅就行
-
View Code
#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(协议监听)系统级别
-
View Code
#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
-
View Code
#coding=gbk from tkinter import * root=Tk() root.title(\'root window\') top=Toplevel(bg=\'red\')#新建了一个窗体 Frame只是一个区域的容器放在窗体中,TopLevel是弹出了一个新的窗体 top.title(\'top level\') root.mainloop()
- c菜单
-
View Code
#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
-
View Code
#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
-
View Code
#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
-
View Code
#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相关操作,文件读写操作
- 菜单的实现
-
View Code
#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
-
View Code
#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()
- 显示状态栏
-
View Code
#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
-
View Code
#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信息的实现
-
View Code
#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:打开和保存操作。
-
View Code
#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
-
View Code
#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()
- 全选和查找
-
View Code
#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()
-
- 终于写完了,凑合着玩玩,喜欢的可以自己玩玩。