相关文章推荐
tree.column( 'name', width= 100) tree.column( 'sex', width= 50) tree.column( 'age', width= 50) tree.column( 'height', width= 80) tree.column( 'weight', width= 80) # 设置表头(列名) tree.heading( 'name', text= '姓名') tree.heading( 'sex', text= '性别') tree.heading( 'age', text= '年龄') tree.heading( 'height', text= '身高(CM)') tree.heading( 'weight', text= '体重(KG)') # 添加数据 tree.insert( '', 0, text= 'line1', values=( 'Titan', 'M', 20, 180, 80)) tree.insert( '', 1, text= 'line2', values=( 'Jun', 'M', 19, 170, 65)) tree.insert( '', 2, text= 'line3', values=( 'Coder', 'M', 20, 170, 70)) tree.insert( '', 3, text= 'line4', values=( 'Che', 'W', 18, 165, 45)) # 上面第一个参数为第一层级, 这里目前用不到, 后面树状结构中会用到

效果图如下

2. 树状数据

树状数据这里指的是,类似文件夹的层级目录一样

# 创建表格
tree = ttk.Treeview(window)
tree.pack()
# 添加一级树枝
treeA1 = tree.insert('', 0, '浙', text='浙江', values=('A1'))
treeA2 = tree.insert('', 1, '鲁', text='山东', values=('A2'))
treeA3 = tree.insert('', 2, '苏', text='江苏', values=('A3'))
# 添加二级树枝
treeA1_1 = tree.insert(treeA1, 0, 'H', text='杭州', values=('A1_1'))
treeA1_2 = tree.insert(treeA1, 1, 'Z', text='舟山', values=('A1_2'))
treeA1_3 = tree.insert(treeA1, 2, 'J', text='嘉兴', values=('A1_3'))
treeA2_1 = tree.insert(treeA2, 0, 'N', text='济南', values=('A2_1'))
treeA2_2 = tree.insert(treeA2, 1, 'L', text='临沂', values=('A2_2'))
treeA2_3 = tree.insert(treeA2, 2, 'Q', text='青岛', values=('A2_3'))
treeA2_4 = tree.insert(treeA2, 3, 'Y', text='烟台', values=('A2_4'))
# 三级树枝
treeA1_1_1 = tree.insert(treeA1_1, 0, 'G', text='江干', values=('A1_1_1'))
treeA1_1_1 = tree.insert(treeA1_1, 1, 'X', text='萧山', values=('A1_1_2'))

注意事项
- insert : 参数介绍
- 参数1: 上一层级的目录
- 参数2: 当前数据在当前层级的中的索引值
- 参数3: 当前数据的标识, 所有层及数据的该标识不能相同, 否则报错
- 参数4: 显示的数据
- 注: 所有数据的参数3(标识)不能相同

效果图如下

二. 布局方式

  • 所谓布局,就是指控制窗体容器中各个控件(组件)的位置关系。
  • tkinter 中目前存在的布局方式有三种: 绝对布局( place ), 相对布局( pack )和表格布局( grid )
  • 1. 绝对布局

  • 绝对布局: 窗口的变化对位置没有影响
  • 这里先介绍 place 布局涉及到的相关属性和函数
  • 1-1. 属性介绍

    属性名属性简析取值取值说明 bordermode 如果设置为 INSIDE ,组件内部的大小和位置是相对的,不包括边框;如果是 OUTSIDE ,组件的外部大小是相对的,包括边框 INSIDE (默认)、 OUTSIDE 可以使用常量 INSIDE OUTSIDE ,也可以使用字符串形式 inside outside
    # 创建四个label
    label1 = Label(window, text='11111', bg='red')
    label2 = Label(window, text='22222', bg='yellow')
    label3 = Label(window, text='33333', bg='blue')
    label4 = Label(window, text='44444', bg='orange')
    # 绝对布局
    label1.place(x=10, y=10, width=200)
    label2.place(x=30, y=30)
    label3.place(x=60, y=61)
    label4.place(x=91, y=91, width=200, height=50)

    如下图组件位置固定

    1-2. 相关函数

    place 类提供了下列函数(使用组件实例对象调用)

  • place_slaves() : 以列表方式返回本组件的所有子组件对象
  • place_configure(option=value) : 给 place 布局管理器设置属性,使用属性 option=value 方式设置
  • propagate(boolean) : 设置为 True 表示父组件的几何大小由子组件决定(默认值),反之则无关
  • place_info() : 返回 place 提供的选项所对应得值
  • grid_forget() : Unpack 组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用 pack(option, …) ,将其显示
  • location(x, y) : x/y 为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
  • size() : 返回组件所包含的单元格,揭示组件大小
  • 2. 相对布局

    2-1. 属性介绍

  • 相对布局: 组件位置或大小的变化会随着窗口的变化而变化
  • 这里先介绍 pack 布局涉及到的相关属性和函数
  • expand : 设置组件是否展开,当值为YES时, side 选项无效。组件显示在父容器中心位置;若 fill 选项为 BOTH ,则填充父组件的剩余空间。默认为不展开

    # 创建四个label
    label1 = Label(window, text='11111', bg='red')
    label2 = Label(window, text='22222', bg='yellow')
    label3 = Label(window, text='33333', bg='blue')
    label4 = Label(window, text='44444', bg='orange')
    label1.pack(side=LEFT, fill=Y)
    label2.pack(side=RIGHT, fill=Y)
    label3.pack(side=TOP, fill=X)
    label4.pack(side=BOTTOM, fill=X)

    2-2. 函数介绍

    pack 类提供了下列函数(使用组件实例对象调用)
    - pack_slaves() : 以列表方式返回本组件的所有子组件对象
    - pack_configure(option=value) : 给 pack 布局管理器设置属性,使用属性 option=value 方式设置
    - propagate(boolean) : 设置为 True 表示父组件的几何大小由子组件决定(默认值),反之则无关。
    - ack_info() : 返回pack提供的选项所对应得值。
    - pack_forget() : Unpack 组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用 pack(option, …) ,将其显示。
    - location(x, y) : x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
    - size() : 返回组件所包含的单元格,揭示组件大小

    3. 表格布局

  • grid 布局又被称作网格布局,是最被推荐使用的布局。
  • 程序大多数都是矩形的界面,我们可以很容易把它划分为一个几行几列的网格,然后根据行号和列号,将组件放置于网格之中
  • 使用 grid 布局时,需要在里面指定两个参数,分别用 row 表示行, column 表示列
  • 需要注意的是 row column 的序号都从0开始
  • 3-1. 属性介绍

    属性名属性简析取值取值说明
    # 创建四个label
    label1 = Label(window, text='11111', bg='red')
    label2 = Label(window, text='22222', bg='yellow')
    label3 = Label(window, text='33333', bg='blue')
    label4 = Label(window, text='44444', bg='orange')
    label1.grid(row=0, column=0)
    label2.grid(row=0, column=1)
    label3.grid(row=1, column=0)
    label4.grid(row=1, column=1)

    3-2. 函数介绍

    grid 类提供了下列函数(使用组件实例对象调用):

    函数名描述 grid_slaves() 以列表方式返回本组件的所有子组件对象。 grid_configure(option=value) grid 布局管理器设置属性 grid_propagate(boolean) 设置为 True 表示父组件的几何大小由子组件决定(默认值),反之则无关。 grid_info() 返回 grid 提供的选项所对应得值。 grid_forget() 将组件隐藏并且忽略原有设置,对象依旧存在 grid_location(x, y) x/y 为以像素为单位的点,函数返回此点是否在单元格中 size() 返回组件所包含的单元格,揭示组件大小
  • 一个 Tkinter 应用生命周期中的大部分时间都处在一个消息循环中
  • 它等待事件的发生: 事件可能是按键按下, 鼠标点击, 鼠标移动等.
  • Tkinter 提供了用以处理相关事件的机制, 处理函数可以被绑定给各个控件的各种事件
  • 如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数
  • button.bind(event, handler) 

    1. 鼠标点击事件

    def buttonAction(event):
        print(event.x, event.y)
    button = Button(window, text='这是一个按钮')
    button.bind('<Button-4>', buttonAction)
    button.pack()

    其中 event 的事件类型和描述如下

    EventDescription <Button-1> <Button-3> <Button-2> <Button-4> 鼠标向上滚动 <Button-5> 鼠标向下滚动 <Double-Button-1> 鼠标左键双击 <Double-Button-3> 鼠标右键双击 <Double-Button-2> 鼠标中键双击 <Triple-Button-1> 鼠标左键三击 <Triple-Button-3> 鼠标右键三击 <Triple-Button-2> 鼠标中键三击

    2. 鼠标在某个按键被按下后的移动事件

    label = Label(window, text='https://www.titanjun.top', bg='orange')
    label.place(x=100, y=50, height=30)
    def labelAction(event):
        print(event.x, event.y)
    label.bind('<B1-Motion>', labelAction)

    其中 event 的事件类型和描述如下

    EventDescription <B1-Motion> <B3-Motion> <B2-Motion>

    3. 按钮点击释放事件

    label = Label(window, text='https://www.titanjun.top', bg='orange')
    label.place(x=100, y=50, height=30)
    def labelAction(event):
        print(event.x, event.y)
    label.bind('<ButtonRelease-1>', labelAction)

    其中 event 的事件类型和描述如下

    EventDescription <ButtonRelease-1> 释放鼠标左键 <ButtonRelease-3> 释放鼠标右键 <ButtonRelease-2> 释放鼠标中键

    需要注意的是
    - 以上鼠标操作中, 苹果鼠标没有中键这一说, 所以在苹果鼠标操作中
    - 正常鼠标的中键操作(例如 <Button-2> -2 操作), 响应苹果鼠标的右键操作
    - 正常鼠标的右键操作(例如 <Button-3> -3 操作), 在苹果鼠标中无响应

    4. 鼠标进入/离开控件事件

    # 按钮点击释放事件
    label3 = Label(window, text='加油: https://www.titanjun.top', bg='yellow')
    label3.place(x=100, y=150, height=30)
    def labelAction(event):
        print(event.x, event.y)
    label3.bind('<Leave>', labelAction)

    其中 event 的事件类型和描述如下

    EventDescription <Enter> 鼠标光标进入控件时触发 <Leave> 鼠标光标离开控件时触发 label = Label(window, text= 'https://www.titanjun.top', bg= 'orange') # 设置焦点 label.focus_set() label.place(x= 100, y= 50, height= 30) def labelAction (event): print(event.char, event.keycode) label.bind( '<Key>', labelAction)

    其他按键操作

    EventDescription 响应所有的按键(按下) <KeyRelease> 响应所有的按键(松开) <FocusIn> 控件或控件的子空间获得键盘焦点. <FocusOut> 控件丢失键盘焦点 (焦点移动到另一个控件).
     
    推荐文章