美文网首页
Python 编程之Tkinter的使用02

Python 编程之Tkinter的使用02

作者: TitanCoder | 来源:发表于2018-06-25 19:56 被阅读126次
    Tkinter.png
    • 原文博客地址: Python编程之Tkinter的使用02
    • TkinterPython的标准GUI库。Python使用 Tkinter可以快速的创建GUI应用程序。
    • 由于Tkinter是内置到python的安装包中、只要安装好Python之后就能import Tkinter库、而且IDLE也是用Tkinter编写而成、对于简单的图形界面Tkinter还是能应付自如
    • 上一篇文章介绍了Tkinter模块和Button, Label等部分控件
    • 这里主要介绍Listbox, Scale, Menu, Frame等部分控件的使用
    • GitHub代码示例目地址

    Listbox列表框

    一个可以包含一个或多个文本项的列表框,可以设置为单选或多选

    创建Listbox

    lb = Listbox(window, selectmode = EXTENDED)
    lb.pack()
    
    • selectmode: 设置列表框的样式(默认值-BROWSE), 有四个可选项
      • SINGLE: 单选, 不能通过鼠标的移动选中新的item, 只能点选
      • BROWSE: 单选, 可以通过鼠标的移动选中新的位置(item并不会移动)
      • MULTIPLE: 多选, 但是只能通过鼠标点击进行多选
      • EXTENDED: 多选, 按住Shift可以实现连选, 按住Control可以实现多选

    添加元素

    • Listbox使用insert来添加一个元素,其中参数一为添加的索引值, 参数二为要添加的元素
    • 索引ACTIVE是向当前选中的item前插入一个(即使用当前选中的索引作为插入位置)
    • 索引END是想最后添加一个元素
    for item in ["good", "nice", "handsome", "vg", "vn"]:
        # 按顺序添加
        lb.insert(END, item)
    # 在开始位置添加
    lb.insert(ACTIVE, 'Titan')
    # 在最后添加
    lb.insert(END, 'jun')
    # 在具体的索引出添加元素
    lb.insert(2, 'lululu')
    # 把列表当成一个元素添加
    lb.insert(ACTIVE, [1, 2, 3])
    # 添加元组
    lb.insert(ACTIVE, ('che', '09'))
    

    删除/选中

    def selection_set(self, first, last=None):
    
    • 该函数为选中操作的函数, 需要两个参数, 其中
    • 参数1: 开始的索引值
    • 参数2: 结束的索引值(可选值, 可不指定)
    • 若不指定参数2, 则函数只对参数1的索引值进行操作
    • 删除/取消选中/取值等函数类似
    #删除  参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只删除第一个索引处的内容
    # lb.delete(1, 2)
    # lb.delete(1)
    
    #选中   参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只选中第一个索引处的内容
    lb.selection_set(2, 5)
    lb.selection_set(0)
    
    # 取消
    lb.selection_clear(3, 4)
    lb.selection_clear(0)
    
    #获取到列表中的元素的个数
    print(lb.size())
    
    #从列表中取值  参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只获取第一个索引处的内容
    print(lb.get(1, 3))
    print(lb.get(5))
    
    #返回当前的索引项,不是item元素
    print(lb.curselection())
    
    # 判断某选项是否被选中
    print(lb.selection_includes(3))
    print(lb.selection_includes(5))
    

    变量和事件绑定

    • 变量绑定和之前的控件帮定变量一样
    • Listbox不支持command属性来设置回调函数了,使用bind来指定回调函数
    # 绑定变量
    lbv = StringVar()
    lb = Listbox(window, selectmode = SINGLE, listvariable = lbv)
    lb.pack()
    
    for item in ["good", "nice", "handsome", "jun", "titan"]:
        lb.insert(END, item)
    
    # 打印当前列表中的选项
    print(lbv.get())
    print(lb.get(1))
    
    # 设置选项(所有重新赋值)
    # lbv.set((1, 2, 3))
    
    # 绑定事件
    def listboxAction(event):
        print(lb.get(lb.curselection()))
    
    # 第一个参数表示操作样式, 这里是双击操作, 1代表鼠标左键
    lb.bind('<Double-Button-1>', listboxAction)
    

    滚动显示

    Listbox的内容超过所容纳范围时, 内容需要滚动显示, 类似上文中提到的Text文本的多行显示, 这里就需要添加滚动条

    效果图如下

    Listbox.gif
    # 滚动
    lb = Listbox(window, selectmode=EXTENDED)
    for item in ["good", "nice", "handsome", "from", "thinter","good1", "nice1", "handsome1", "vg1", "vn1","good3", "nice3", "handsome3", "vg3", "vn3"]:
        lb.insert(END, item)
    
    # 滚动条
    sc = Scrollbar(window)
    sc.pack(side = RIGHT, fill = Y)
    lb.configure(yscrollcommand = sc.set)
    lb.pack(side = LEFT, fill = BOTH)
    # 额外给属性赋值
    sc["command"] = lb.yview
    

    Scale拽指示器

    供用户通过拖拽指示器改变变量的值,可以水平,也可以竖直, 下面是相关属性介绍

    • from_: 设置最小值
    • to: 设置最大值
    • resolution: 步距, 每次移动增加的最小单位
    • orient: 显示方向(水平-HORIZONTAL, 垂直-Variable)
    • variable: 绑定变量
    • command: 绑定回调函数
    • length: 控件的长度(垂直方向上则是高度)
    • digits: 控制显示的数字位数
    scale = Scale(window, from_ = 0, to = 100, orient = HORIZONTAL, length = 200, label='choice:')
    scale.pack()
    
    # 设置初始值
    scale.set(34)
    
    # 取值
    def showNumber(event):
        print(scale.get())
    
    scale["command"] = showNumber
    

    效果图如下

    Spinbox数值范围控制器

    • 组件Spinbox和组件Scale类似, 都是根据需求显示一个范围内的内容
    • 区别: Spinbox去能拖拽, 只能点击增加或减少; Scale可以拖拽选择
    # 绑定变量
    spinStr = StringVar()
    
    # 事件监听
    def updateAction():
        # 在最后拼接上'12'
        # spin1.insert(END, 12)
        print(spinStr.get())
    
    
    '''属性介绍:
    from_: 起始值
    to: 最大值
    increment: 步长
    textvariable: 绑定变量
    command: 绑定函数, 事件监听
    values: 设置后, 每次更新值将使用values指定的值
    '''
    
    # spin = Spinbox(window, from_ = 0, to = 100, increment = 10, textvariable = spinStr, command = updateAction)
    # spin.pack()
    
    spin1 = Spinbox(window, values=[0, 10, 30, 50, 80, -9], increment = 10, textvariable = spinStr, command = updateAction, bg='red')
    spin1.pack()
    

    效果图如下

    Spinbox控件.png

    Menu菜单

    Menu是被用来显示在标题栏/窗口或者其他顶层窗口上的菜单栏

    顶层菜单

    添加菜单项, 单纯的添加之后没有任何效果

    # 菜单条
    menubar = Menu(window)
    window.configure(menu=menubar)
    

    下面给菜单添加菜单列表选项, 添加之后只有菜单列表, 但是每一个菜单却没有下拉列表

    # 创建一个菜单选项
    menu1 = Menu(menubar, tearoff=False)
    # 想菜单条上添加菜单选项
    menubar.add_cascade(label='语言', menu=menu1)
    
    menu2 = Menu(menubar, tearoff=False)
    menubar.add_cascade(label='颜色', menu=menu2)
    

    给每一个菜单添加下拉列表和监听事件

    def menuAction1():
        print('menubar')
    
    # 菜单条
    menubar = Menu(window)
    window.configure(menu=menubar)
    
    
    # 创建一个菜单选项
    menu1 = Menu(menubar, tearoff=False)
    # 菜单选项添加内容
    for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
        if item == 'Exit':
            # 添加分割线
            menu1.add_separator()
            menu1.add_command(label=item, command=window.quit)
        else:
            menu1.add_command(label=item, command=menuAction1)
    
    # 想菜单条上添加菜单选项
    menubar.add_cascade(label='语言', menu=menu1)
    
    
    # 菜单2的事件处理
    def menuAction2():
        print(menuStr.get())
    
    menuStr = StringVar()
    
    menu2 = Menu(menubar, tearoff=True)
    for item in ['red', 'orange', 'blue', 'gray']:
        menu2.add_radiobutton(label=item, variable=menuStr, command=menuAction2)
    # 添加到菜单列表
    menubar.add_cascade(label='颜色', menu=menu2)
    
    

    效果图如下

    Menu顶层菜单.png

    tearoff属性介绍

    • tearoff是控制菜单能否独立出来的属性, 取值有TrueFalse
    • tearoff设置为True以后,就是表明这个菜单是可以独立出来的,如果是False的话就不可以独立出来
    • 我在Mac中尝试了一下, 发现没有什么效果; 在Windows系统中会有一条虚线, 点击虚线, 会跳出一个悬浮菜单; 有Windows系统的童鞋可以试一下

    右键菜单

    # 鼠标右键菜单
    menubar2 = Menu(window)
    
    menu3 = Menu(menubar2, tearoff=False)
    for item in ['Python', 'PHP', 'CPP', 'C', 'Java', 'JavaScript', 'VBScript', 'Exit']:
        menu3.add_command(label=item)
    
    menubar2.add_cascade(label='开发语言', menu=menu3)
    
    # 用于显示菜单
    def showMenu(event):
        print('window')
        # 鼠标点击处的坐标
        menubar2.post(event.x_root, event.y_root)
    
    # window绑定鼠标事件
    window.bind("<Button-2>", showMenu)
    

    效果图如下

    Menu右键菜单.png

    添加删除菜单

    菜单中每一项的删除和添加都是根据索引操作的

    # 添加/删除菜单
    def menuClick():
        print("menu3")
    
    # 添加command项
    menu3.insert_command(1, label='command', command=menuClick)
    
    # 添加radiobutton项
    menu3.insert_radiobutton(3, label='radiobutton', command=menuClick)
    
    # 添加checkbutton项
    menu3.insert_checkbutton(5, label='checkbutton', command=menuClick)
    
    # 添加分割线
    menu3.insert_separator(4)
    # menu3.insert_separator(0)
    
    
    # 删除
    # 两个参数: 参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只获取第一个索引处的内容
    menu3.delete(2, 4)
    menu3.delete(0)
    

    Combobox下拉控件

    # 绑定变量
    cv = StringVar()
    combo = ttk.Combobox(window, textvariable=cv)
    combo.pack()
    
    # 设置下拉菜单数据(元组数据)
    combo['value'] = ('杭州', '湖州', '温州', '嘉兴', '舟山')
    
    # 设置默认值
    combo.current(0)
    
    # 绑定事件
    def comboboxClick(event):
        print(cv.get())
        print(combo.get())
    
    combo.bind('<<ComboboxSelected>>', comboboxClick)
    

    效果图如下

    Combobox.png

    Frame布局

    Frame就是屏幕上的一块矩形区域,多是用来作为容器(container)来布局窗体

    # 第一层容器
    frame = Frame(window)
    frame.pack()
    
    # 左边容器
    leftFrame = Frame(frame)
    Label(leftFrame, text='左上位置', bg='red', height=5, width=10).pack(side=TOP)
    Label(leftFrame, text='左下位置', bg='yellow', height=5, width=10).pack(side=TOP)
    leftFrame.pack(side=LEFT)
    
    # 右边容器
    rightFrame = Frame(frame)
    Label(rightFrame, text='右上位置', bg='orange', height=5, width=10).pack(side=TOP)
    Label(rightFrame, text='右下位置', bg='blue', height=5, width=10).pack(side=TOP)
    rightFrame.pack(side=RIGHT)
    

    效果图如下

    Python-Frame.png
    • 至此, Tkinter的大部分组件已经基本都介绍完了
    • 接下来将会介绍一些Tkinter涉及到的数据类型和布局方式
    • 以及鼠标的点按事件和一些特殊的事件操作
    • 未完待续.............

    相关文章

      网友评论

          本文标题:Python 编程之Tkinter的使用02

          本文链接:https://www.haomeiwen.com/subject/mxhuyftx.html