• pythonGUI编程


    使用python自带tkinter库进行GUI编程

    基础语法

    引入库

    import tkinter as tk
    

    主窗口

    • 创建主窗口

      window = tk.Tk() #创建主窗口window
      
    • 为窗口命名

      window.title('My Window')
      
    • 设置窗口大小

      window.geometry('500x300') #长x宽,这里乘号用x
      

    常用窗口部件

    Label标签

    import tkinter as tk  # 使用Tkinter前需要先导入
     
    # 第1步,实例化object,建立窗口window
    window = tk.Tk()
     
    # 第2步,给窗口的可视化起名字
    window.title('My Window')
     
    # 第3步,设定窗口的大小(长 * 宽)
    window.geometry('500x300')  # 这里的乘是小x
     
    # 第4步,在图形界面上设定标签
    l = tk.Label(window, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
    
     
    # 第5步,放置标签
    l.pack()    # Label内容content区域放置位置,自动调节尺寸
    # 放置lable的方法有:1)l.pack(); 2)l.place();
     
    # 第6步,主窗口循环显示
    window.mainloop()
    # 注意,loop因为是循环的意思,window.mainloop就会让window不断的刷新,如果没有mainloop,就是一个静态的window,传入进去的值就不会有循环,mainloop就相当于一个很大的while循环,有个while,每点击一次就会更新一次,所以我们必须要有循环
    # 所有的窗口文件都必须有类似的mainloop函数,mainloop是窗口文件的关键的关键。
    

    Button按钮

    按钮能够包含文本或图象,并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,Tkinter自动调用相关联的函数或方法。

    调用命令参数command=函数名

    import tkinter as tk  # 使用Tkinter前需要先导入
     
    # 第1步,实例化object,建立窗口window
    window = tk.Tk()
     
    # 第2步,给窗口的可视化起名字
    window.title('My Window')
     
    # 第3步,设定窗口的大小(长 * 宽)
    window.geometry('500x300')  # 这里的乘是小x
     
    # 第4步,在图形界面上设定标签
    var = tk.StringVar()    # 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上
    l = tk.Label(window, textvariable=var, bg='green', fg='white', font=('Arial', 12), width=30, height=2)
    # 第5步,放置标签
    l.pack()
     
    # 定义一个函数功能(内容自己自由编写),供点击Button按键时调用,调用命令参数command=函数名
    on_hit = False
    def hit_me():
        global on_hit
        if on_hit == False:
            on_hit = True
            var.set('you hit me')
        else:
            on_hit = False
            var.set('')
     
    # 第5步,在窗口界面设置放置Button按键
    b = tk.Button(window, text='hit me', font=('Arial', 12), width=10, height=1, command=hit_me)
    b.pack()
     
    # 第6步,主窗口循环显示
    window.mainloop()
    

    Entry单行文本输入域

    import tkinter as tk  # 使用Tkinter前需要先导入
     
    # 第1步,实例化object,建立窗口window
    window = tk.Tk()
     
    # 第2步,给窗口的可视化起名字
    window.title('My Window')
     
    # 第3步,设定窗口的大小(长 * 宽)
    window.geometry('500x300')  # 这里的乘是小x
     
    # 第4步,在图形界面上设定输入框控件entry并放置控件
    e1 = tk.Entry(window, show='*', font=('Arial', 14))   # 显示成密文形式
    e2 = tk.Entry(window, show=None, font=('Arial', 14))  # 显示成明文形式
    e1.pack()
    e2.pack()
     
    # 第5步,主窗口循环显示
    window.mainloop()
    

    Text多行文本输入域

    输入多行文本,允许你用不同的样式和属性来显示和编辑文本,同时支持内嵌图象和窗口。

    import tkinter as tk  # 使用Tkinter前需要先导入
     
    # 第1步,实例化object,建立窗口window
    window = tk.Tk()
     
    # 第2步,给窗口的可视化起名字
    window.title('My Window')
     
    # 第3步,设定窗口的大小(长 * 宽)
    window.geometry('500x300')  # 这里的乘是小x
     
    # 第4步,在图形界面上设定多行输入框控件框并放置
    t = tk.Text(window, height=3)
    t.pack()
     
    # 第5步,get()方法获取输入内容
    def hit_me(): 
        text = t.get("0.0","end")#获取全部内容
        print(text)
     
    # 第6步,创建并放置个按钮
    b1 = tk.Button(window, text='hit_me', width=10,height=2, command=hit_me)
    b1.pack()
    
    # 第7步,主窗口循环显示
    window.mainloop()
    

    Listbox列表框

    3部分

    • 红列表框控件,展示给用户选项
    • 显示所选按钮,点击该按钮,在区域显示所选
    • 显示用户选择的列表框选项
    import tkinter as tk
    
    window = tk.Tk()
    window.title('列表框')          # 设置窗口的标题
    window.geometry('200x240')     # 设置窗口的大小
    
    list_itmes = tk.StringVar()#列表框初始化
    list_itmes.set(('python', 'c++', 'java', 'php'))         # 设置可选项
    
    # 创建列表框
    lb = tk.Listbox(window, listvariable=list_itmes)
    lb.pack()
    
    no_select = '没有选中任何选项'
    
    def click_button():
        select = lb.curselection()
        print(len(select))
        if len(select) == 0:
            label_text.set(no_select)
        else:
            text = lb.get(select)
            label_text.set('你选择了{text}'.format(text=text))
    
    # 创建button
    button = tk.Button(window,
        text='显示所选',             # 显示在按钮上的文字
        width=15, height=2,
        command=click_button)     # 点击按钮时执行的函数
    button.pack()                 # 将按钮锁定在窗口上
    
    # 创建label用于显示所选择的列表框选项
    label_text = tk.StringVar()    #创建变量
    label_text.set(no_select)
    label = tk.Label(window,
        width=15, height=2,        # 标签长宽
        textvariable=label_text    # label控件将显示label_text的值
        )
    label.pack()               # 将标签固定在窗口上
    
    window.mainloop()             # 启动窗口
    

    Radiobutton单选

    import tkinter as tk
    
    window = tk.Tk()
    window.title('学习radiobutton')
    window.geometry('200x150')
    
    var = tk.StringVar()
    label = tk.Label(window, bg='yellow', width=20, text='')
    label.pack()
    
    
    def select():
        label.config(text='你选择了' + var.get())
    #通过var对象获取了被选中的单选按钮的值,然后使用label的config方法修改标签上的显示文字
    
    r1 = tk.Radiobutton(window, text='python',
                        variable=var, value='python',
                        command=select)
    r1.pack()
    
    r2 = tk.Radiobutton(window, text='java',
                        variable=var, value='java',
                        command=select)
    r2.pack()
    
    r3 = tk.Radiobutton(window, text='php',
                        variable=var, value='php',
                        command=select)
    r3.pack()
    
    
    window.mainloop()
    

    Checkbutton多选

    import tkinter as tk
    
    window = tk.Tk()
    window.title('checkbutton')
    window.geometry('200x200')
    
    label = tk.Label(window, bg='yellow', width=20, text='')
    label.pack()
    
    
    def select():
        select_lst = []
    
        if var1.get() == 1:      # var1.get()获取c1的状态值
            select_lst.append('python')
    
        if var2.get() == 1:
            select_lst.append('java')
    
        if var3.get() == 1:
            select_lst.append('php')
    
        text = "你选择了 " + ','.join(select_lst)
        label.config(text=text)
    
    
    var1 = tk.IntVar()
    var2 = tk.IntVar()
    var3 = tk.IntVar()
    
    c1 = tk.Checkbutton(window,
                        text='Python',      # 选项显示内容
                        variable=var1,      # 绑定变量var1
                        onvalue=1,          # 被选中时的状态值
                        offvalue=0,         # 没有被选中时的状态值
                        command=select)
    
    c2 = tk.Checkbutton(window, text='java', variable=var2, onvalue=1, offvalue=0,
                        command=select)
    c3 = tk.Checkbutton(window, text='php', variable=var3, onvalue=1, offvalue=0,
                        command=select)
    
    #设置onvalue和offvalue参数,这里设置的是1和0,分别代表选中和未选中。
    #设置variable参数,将控件的值与变量绑定在一起,这样,通过变量var1就可以获取控件c1的状态值。
    c1.pack()
    c2.pack()
    c3.pack()
    
    
    window.mainloop()
    

    Scale范围控件

    import tkinter as tk
    from tkinter import messagebox
    
    window = tk.Tk()
    window.title('选择商品')       # 设置窗口的标题
    window.geometry('450x100')     # 设置窗口的大小
    
    label = tk.Label(window, bg='yellow', width=20, text='')
    label.pack()
    
    def select(value):
        label.config(text='你选择的价格是 ' + value)
    #参数value就是当前滑块位置所代表的数值
    scale = tk.Scale(window,
                 label='选择价格范围',         # 提示语
                 from_=50,                  # 最小值
                 to=200,                    # 最大值
                 orient=tk.HORIZONTAL,      # 横向显示
                 length=400,                # 长度
                 tickinterval=20,           # 刻度间隔
                 resolution=0.1,            # 精确程度
                 command=select)
    scale.pack()
    
    window.mainloop()             # 启动窗口
    

    Canvas画布控件

    画各种图形,也可以展示图片,同时还可以移动他们

    • 画线

      import tkinter as tk
      
      window = tk.Tk()
      window.title('画布')
      window.geometry('300x300')
      
      canvas = tk.Canvas(window,
                         bg='white',       # 设置背景色
                         height=200,      # 设置高度
                         width=300)       # 设置宽度
      
      canvas.pack()
      # 左上角是0,0  右下角是300, 200
      line = canvas.create_line(10, 10, 100, 10)
      #create_line创建一条直线时,需要指定4个坐标
      window.mainloop()
      
    • 画圆、长方形

      import tkinter as tk
      
      window = tk.Tk()
      window.title('画布')
      window.geometry('300x300')
      
      canvas = tk.Canvas(window,
                         bg='blue',       # 设置背景色
                         height=200,      # 设置高度
                         width=300)       # 设置宽度
      
      canvas.pack()
      oval = canvas.create_oval(50, 50, 90, 90, fill='red')
      rect = canvas.create_rectangle(100, 50, 150, 100)
      
      window.mainloop()
      
      • 图形移动

        import tkinter as tk
        
        window = tk.Tk()
        window.title('画布')
        window.geometry('300x300')
        
        canvas = tk.Canvas(window,
                           bg='blue',       # 设置背景色
                           height=200,      # 设置高度
                           width=300)       # 设置宽度
        
        canvas.pack()
        oval = canvas.create_oval(50, 50, 90, 90, fill='red')
        
        
        def moveit():
            canvas.move(oval, 50, 50)   # x方向移动50, y方向移动50
        
        
        button = tk.Button(window, text='移动圆', command=moveit)
        button.pack()
        
        window.mainloop()
        
      • 显示图片

        tkinter自己的PhotoImage只支持gif格式的图片,因此,我们需要使用PIL的ImageTk,这样,所有格式的图片都可以显示

        import tkinter as tk
        from PIL import ImageTk
        
        window = tk.Tk()
        window.title('画布')
        window.geometry('500x500')
        
        canvas = tk.Canvas(window,
                           bg='blue',       # 设置背景色
                           height=500,      # 设置高度
                           width=500)       # 设置宽度
        
        
        canvas.pack()
        
        image_file = ImageTk.PhotoImage(file='./pic/coolpython.png')
        image = canvas.create_image(10, 10, anchor='nw', image=image_file)
        
        window.mainloop()
        

    关于菜单,我们分清两部分,一部分是在菜单栏里直接显示的,一部分是点击某个菜单后下拉显示的,

    from tkinter import *
    
    window = Tk()
    window.wm_title("菜单")
    window.geometry("400x300")
    window.protocol("WM_DELETE_WINDOW", window.iconify)
    
    def exit():
        window.destroy()
    
    menubar = Menu(window)
    
    # 点击菜单栏下拉显示的菜单
    filemenu = Menu(menubar)
    for item in ['新建','打开','保存','另存为']:
        filemenu.add_command(label=item)
    
    filemenu.add_command(label="退出", command=exit)
    editmenu = Menu(menubar)
    for item in ['复制','粘贴','剪切']:
        editmenu.add_command(label=item)
    
    # 在菜单栏上显示的部分
    menubar.add_cascade(label="文件", menu =filemenu)
    menubar.add_cascade(label="编辑", menu =editmenu)
    
    
    # 这两种方法都可以
    window['menu']= menubar
    # window.config(menu=menubar)
    window.mainloop()
    

    frame 容器布局

    能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame

    import tkinter as tk
    
    window = tk.Tk()
    window.title('frame示例')       # 设置窗口的标题
    window.geometry('200x100')     # 设置窗口的大小
    
    # 在window上创建一个frame
    frm = tk.Frame(window)
    frm.pack()
    
    # 在frm上创建两个frame, 一个在左,一个在右
    frm_left = tk.Frame(frm)
    frm_right = tk.Frame(frm)
    
    frm_left.pack(side='left')      # 设置相对位置,一个在左,一个在右
    frm_right.pack(side='right')
    
    # 创建两个label,一个放在frm_left上,一个放在frm_right上
    tk.Label(frm_left, text='在左侧').pack()
    tk.Label(frm_right, text='在右侧').pack()
    
    window.mainloop()
    

    布局

    • pack可以指定上下左右

      import tkinter as tk
      
      window = tk.Tk()
      window.title('frame示例')       # 设置窗口的标题
      window.geometry('400x300')     # 设置窗口的大小
      
      tk.Label(window, text='1').pack(side='top')      # 上
      tk.Label(window, text='2').pack(side='left')     # 左
      tk.Label(window, text='3').pack(side='bottom')   # 下
      tk.Label(window, text='4').pack(side='right')    # 右
      
      window.mainloop()
      
    • grid可以划分方格

      import tkinter as tk
      
      window = tk.Tk()
      window.title('定位示例')       # 设置窗口的标题
      window.geometry('400x300')     # 设置窗口的大小
      
      for i in range(3):
          for j in range(3):
              tk.Label(window, text=i*3+j).grid(row=i, column=j, padx=10, pady=10)
      #row指定了行,col指定列,padx设置单元格左右间距,pady设置上下行间距
      window.mainloop()
      
    • place

      import tkinter as tk
      
      window = tk.Tk()
      window.title('定位示例')         # 设置窗口的标题
      window.geometry('400x300')     # 设置窗口的大小
      
      tk.Label(window, text="我就在这里x=100,y=150").place(x=100, y=150, anchor='nw')
      
      window.mainloop()
      #place指明了控件出现的位置,但是控件自身也是有大小的,因此,还需要指明使用控件的哪个部分进行定位,我的代码里设置anchor='nw',这就就表示用控件的西北角,也就是左上角进行定位。
      
      #上北,下南,左西,右东, 上n,下s,左w,右e 英语单词north,south,west,east的首字母
      

    Combobox 复合框

    Combobox是ListBox的改进版,用户除了可以选择外,还可以直接输入,因此被称之为复合框

    import tkinter as tk
    from tkinter import ttk, messagebox
    
    
    window = tk.Tk()
    window.title('复合框')       # 设置窗口的标题
    window.geometry('200x200')     # 设置窗口的大小
    
    strVar = tk.StringVar()
    
    def choose():
        messagebox.showinfo(title=None, message=str(cb.get()))
    
    cb = ttk.Combobox(window,
                      textvariable= strVar,       # 绑定到self.strVar变量
                     )
    
    cb.pack(side='top')
    
    # 设置可选项
    cb['values'] = ['Python', 'java', 'c++', 'php']
    
    def click():
        messagebox.showinfo(title='提示', message=strVar.get())
    
    # 点击按钮时,获得复选框里的内容并显示
    tk.Button(window, text='确定', command=click).pack()
    
    window.mainloop()
    

    Spinbox 高级输入框

    Spinbox相比于Entry更高级一些,它不仅支持直接输入,还允许通过点击上下箭头的按钮调节输入内容

    import tkinter as tk
    from tkinter import messagebox
    
    
    window = tk.Tk()
    window.title('Spinbox输入框')        # 设置窗口的标题
    window.geometry('200x200')          # 设置窗口的大小
    
    int_value_var = tk.IntVar()
    sb1 = tk.Spinbox(window,
                      from_=0,          # 最小值0
                      to=100,           # 最大值100
                      increment=5,      # 点击一次变化幅度为5
                      textvariable=int_value_var        # 绑定变量
                      )
    
    sb1.pack()
    
    def press():
        language = sb2.get()
        messagebox.showinfo(title='提示', message='你选择了{language}'.format(language=language))
    
    sb2 = tk.Spinbox(window,
                     values=('python', 'java', 'c++', 'php'),
                     command=press)     # 点击向上按钮或者向下按钮都会粗发press方法
    
    sb2.pack()
    
    window.mainloop()
    

    filedialog 文件对话框

    文件对话框是桌面应用里经常使用的功能,你想从本地选择一个文件,需要使用文件对话框,你想将一个文件保存起来,选择保存路径的时候,需要使用文件对话框

    • 使用文件对话框选择一个文件,获得文件的绝对路径
    import tkinter as tk
    from tkinter import filedialog
    
    
    window = tk.Tk()
    window.title('文件对话框')        # 设置窗口的标题
    window.geometry('300x50')          # 设置窗口的大小
    
    path_var = tk.StringVar()
    entry = tk.Entry(window, textvariable=path_var)
    entry.place(x=10, y=10, anchor='nw')
    
    
    def click():
        # 设置可以选择的文件类型,不属于这个类型的,无法被选中
        filetypes = [("文本文件", "*.txt"), ('Python源文件', '*.py')]
        file_name= filedialog.askopenfilename(title='选择单个文件',
                                      filetypes=filetypes,
                                      initialdir='./'           # 打开当前程序工作目录
                                                 )
        path_var.set(file_name)
    
    tk.Button(window, text='选择', command=click).place(x=220, y=10, anchor='nw')
    window.mainloop()
    
    • 使用文件对话框选择一个文件目录
    import tkinter as tk
    from tkinter import filedialog
    
    
    window = tk.Tk()
    window.title('文件对话框')        # 设置窗口的标题
    window.geometry('300x50')          # 设置窗口的大小
    
    path_var = tk.StringVar()
    entry = tk.Entry(window, textvariable=path_var)
    entry.place(x=10, y=10, anchor='nw')
    
    
    def click():
        file_name= filedialog.askdirectory(title='选择一个文件夹',
                                      initialdir='./'           # 打开当前程序工作目录
                                                 )
        path_var.set(file_name)
    
    tk.Button(window, text='选择', command=click).place(x=220, y=10, anchor='nw')
    window.mainloop()
    
    • 获取保存文件的路径
    import tkinter as tk
    from tkinter import filedialog, messagebox
    
    
    window = tk.Tk()
    window.title('文件对话框')        # 设置窗口的标题
    window.geometry('300x50')          # 设置窗口的大小
    
    
    path_var = tk.StringVar()
    entry = tk.Entry(window, textvariable=path_var)
    entry.place(x=10, y=10, anchor='nw')
    
    def click():
        filetypes = [("文本文件", "*.txt"), ('Python源文件', '*.py')]
        file_name= filedialog.asksaveasfilename(title='保存文件',
                                                filetypes=filetypes,
                                                initialdir='./'           # 打开当前程序工作目录
                                                 )
        path_var.set(file_name)
    
    tk.Button(window, text='选择', command=click).place(x=220, y=10, anchor='nw')
    window.mainloop()
    

    LabelFrame 容器控件

    LabelFrame与Frame十分相似,都可以用来做布局控件,不同之处在于,LabelFrame有明显的边界,并且可以在边界上设置文字,它划分的区域更加明显。

    #假设我们想让用户选择一门编程语言进行学习,可以使用一组RadioButton供用户选择,这组RadioButton就可以放在LabelFrame中
    import tkinter as tk
    from tkinter import ttk
    
    
    window = tk.Tk()
    window.title('labelframe')       # 设置窗口的标题
    window.geometry('300x100')       # 设置窗口的大小
    
    lf = ttk.Labelframe(window, text='请选择教程', padding=20)
    lf.pack()
    
    language_lst = ['python', 'java', 'php', 'go']
    i = 0
    intVar = tk.IntVar()
    
    for language in language_lst:
        tk.Radiobutton(lf, text=language, value=i,
                variable=intVar).pack(side='left')
        i += 1
    
    window.mainloop()
    

    Panedwindow 管理窗口布局的容器

    Panedwindow 允许添加多个子组件,不需要使用pack,grid,place进行布局,它为每个子组件划分一个区域,你可以通过移动各个区域的分割线来改变区域的大小。在创建Panedwindow时,你可以指定它是垂直布局还是水平布局,Panedwindow可以嵌入到另一个Panedwindow中。

    #现在,我们来设计一个布局,将界面分割成3部分
    #首先创建一个水平的Panedwindow,然后加入一个label,再加入一个垂直布局的Panedwindow,在这个垂直布局的Panedwindow中,加入两个label
    import tkinter as tk
    from tkinter import *
    
    
    window = tk.Tk()
    window.title('PanedWindow')       # 设置窗口的标题
    window.geometry('600x600')        # 设置窗口的大小
    
    
    m1 = PanedWindow(window)          # 默认是左右分布的
    m1.pack(fill=BOTH, expand=1)
    
    left = Label(m1, text='标签1', bg='blue', width=20)
    m1.add(left)
    
    m2 = PanedWindow(orient=VERTICAL)
    m1.add(m2)
    
    top = Label(m2, text='标签2', bg='green', height=20)
    m2.add(top)
    
    bottom = Label(m2, text='标签3', bg='red')
    m2.add(bottom)
    
    window.mainloop()
    
  • 相关阅读:
    【并查集】亲戚
    【图论】Car的旅行线路 NOIP 2001
    【贪心】排座椅
    【DP】花店橱窗布置
    【NOIP】NOIP考纲总结+NOIP考前经验谈
    【NOIP】考前须知
    NOIP 2016 PJ T4 魔法阵
    NOIP 2016 PJ T3 海港
    【高精度】麦森数 NOIP 2003
    【带权并查集】食物链 NOIP 2001
  • 原文地址:https://www.cnblogs.com/hacker-snail/p/14226992.html
Copyright © 2020-2023  润新知