zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/hacker-snail/p/14226992.html
Copyright © 2011-2022 走看看