• python--tkinter桌面编程开发--记事本


    • 什么是TKTkinter
      • 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
    • 终于写完了,凑合着玩玩,喜欢的可以自己玩玩。
  • 相关阅读:
    mysql8.0.20安装
    MySQL EXPLAIN结果集分析
    初次安装aliSql
    升级vim到8.0
    REPL环境对语言的帮助
    Python环境搭建及pip的使用
    mysql数据库分库分表(Sharding)
    Git的使用
    Promise的初步认识
    对引用的文件起别名
  • 原文地址:https://www.cnblogs.com/Kobe10/p/5712233.html
Copyright © 2020-2023  润新知