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()#進入死循環  讓窗口一直顯示
      View Code
  • 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()
    View Code
  • 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','28','bold'))#font也是一個list
    label.pack() #顯示
    
    root.mainloop()#進入死循環  讓窗口一直顯示
    View Code
  • 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()
      View Code
  • 事件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()
      View Code
  • 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()
      View Code
  • 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( )
      View Code
  • 工具欄
    • 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()
      View Code
  • 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()
      View Code
  • 狀態欄--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()
          
      View Code
  • 學習完桌面編程之后,決定自己寫一個簡單的記事本來練練手,熟悉熟悉學的東西,深入理解一下。
  • 項目簡要分析
    •  界面實現: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()
    View Code

     實現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()
    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()
    View Code
  • 正文編輯區域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()
    View Code
  • 關於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()
    View Code
  • 文件操作
    • 新的庫的學習: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()
      View Code
  • 復制粘貼操作
    • 存在於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()
      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()
      View Code
  • 終於寫完了,湊合着玩玩,喜歡的可以自己玩玩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM