- 什么是TK\Tkinter
- Tkinter是連接Python和TK圖形庫的一個紐帶(接口)
- Hello Tkinter
-
View Codefrom 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()
-
- 終於寫完了,湊合着玩玩,喜歡的可以自己玩玩。
