14、容器PanedWindow和Notebook

14-1 PanedWindow

14-1-1 PanedWindow基本概念

PanedWindow可以翻译为面板,是一个Widget容器控件,可以在此容器内建立任意数量的子控件。不过一般是在此控件内建立二三个子控件,而控件是以水平方式或垂直方式排列。它的构造方法语法如下。

PanedWindow(父对象, options, ...)

参数一:同上

Options:

(1) bg或background:当鼠标光标不在此控件上时,若是有滚动条或方向盒时,滚动条或方向盒的背景颜色。

(2) bd:3D显示时的宽度,默认是2像素。

(3) borderwidth:边界线宽度,默认时2.

(4) cursor:当鼠标光标在标签上方时的光标形状、

(5) handlepad:面板显示宽度,默认是8.。

(6) handlesize:面板显示大小,默认是8。

(7) height:没有默认高度。

(8) orient:面板配置方向默认是HORIZONTAL。

(9) relief:默认是relief=FLAT,可由此控制文字外框。

(10) sashcursor:分隔线光标,没有默认值。

(11) sachrelief:面板分隔线外框,默认是RAISED。

(12) showhandle:滑块属性,可设定是否显示,没有默认值。

(13) width:面板整体宽度,没有默认值。

14-1-2 插入子控件add()

add(child, options)可以插入子对象。

下面程序实例:在PanedWindow对象内插入两个标签子对象,读者可以从缩放窗口了解标签子对象分割此PanedWindow的结果。

from tkinter import *

pw = PanedWindow(orient=VERTICAL)       # 创建PanedWindow对象
pw.pack(fill=BOTH, expand=True)

top = Label(pw, text="Top pane")        # 创建标签Top Pane
pw.add(top)                             # top标签插入PanedWindow

bottom = Label(pw, text="Bottom pane")  # 创建标签Bottom Pane
pw.add(bottom)                          # bottom标签插入PanedWindow
        
pw.mainloop()

执行结果

14-1-3 建立LabelFrame当作子对象

PanedWindow是一个面板,最常的应用是将它分成二三份,然后可以将所设计的控件适度分配位置。

下面程序实例ch14_2:设计三个LabelFrame对象当作PanedWindow的子对象,然后水平排列。

from tkinter import *

root = Tk()
root.title("ch14_2")

pw = PanedWindow(orient=HORIZONTAL)       # 创建PanedWindow对象

leftframe = LabelFrame(pw, text="left Pane", width=120, height=150)
pw.add(leftframe)
middleframe = LabelFrame(pw, text="Middle Pane", width=120)
pw.add(middleframe)
rightframe = LabelFrame(pw, text="Right Pane", width=120)
pw.add(rightframe)

pw.pack(fill=BOTH, expand=True, padx=10, pady=10)
        
root.mainloop()

执行结果

14-1-4 tkinter.ttk模块的weight参数

ch14_2在执行时,若是更改了窗口的宽度,将看到最右边的面板(Right Pane)放大或缩小,如下所示。

在tkinter.ttk模块中吗,若执行add(子对象, options),在options字段可以增加weight参数,weight代表更改窗口宽度时每个Pane更改的比例,如果插入三个子对象LabelFrame时weight都是1,代表放大或缩小窗口时,三个子对象是相同比例的。

监听字符串

self.emp_internation.trace_add('write', self.count_salary)

self.emp_internation为创建的字符串变量,ttk.String()

trace_add('write', 函数名),监听字符串变量写入之后需要干什么。

表头组件

创建表格组件

ttk.Treeview(columns=['', '', ''], show=")

参数    

表头标识 columns, 参数后面可以接列表,列表中有几个元素,就增加几个表头

去除默认表头 show="headings"

ttk样式组件

一、基础使用示例

style = ttk.Style()
# 查看ttk的组件样式
print(style.theme_names())
# ttk组件主题设置
style.theme_use('')
# 设置默认标签样式
style.configure('TLabel', foreground='red', font=('宋体', 16))
# ttk Label组件参数绑定style='login-TLabel',就可以设置下面样式了
style.configure('login-TLabel', foreground='red', font=('宋体', 16))
# 默认按钮样式
style.configure('TButton', font=('宋体', 12))
# 默认单选框样式
style.configure('TRadiobutton', font=('宋体', 12))
# 默认表头标题
style.configure('Treeview.Heading', font=('宋体', 16))
# 默认表内容样式
style.configure('Treeview', font=('宋体', 14))

ttk.Treeview表格组件

一、基础使用示例

先看一个完整的代码示例,可以直接复制运行:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("简易表格示例")

# 创建表格
table = ttk.Treeview(root)

# 定义列(注意:第一列#0是隐藏的树形列,通常留空)
table["columns"] = ("姓名", "年龄", "城市")

# 设置列属性
table.column("#0", width=0, stretch=tk.NO)  # 隐藏第一列
table.column("姓名", width=100, anchor=tk.W)  # 列宽度和对齐方式
table.column("年龄", width=60, anchor=tk.CENTER)
table.column("城市", width=120, anchor=tk.E)

# 设置表头
table.heading("姓名", text="姓名")  # 列标题
table.heading("年龄", text="年龄")
table.heading("城市", text="城市")

# 添加数据
table.insert("", "end", values=("张三", 25, "北京"))  # 插入一行数据
table.insert("", "end", values=("李四", 30, "上海"))
table.insert("", "end", values=("王五", 28, "广州"))

# 显示表格
table.pack(pady=20)

root.mainloop()

二、核心参数详解

1. 列配置(column方法)
  • width:列宽度(单位:像素)

  • anchor:对齐方式(tk.W左对齐,tk.CENTER居中,tk.E右对齐)

  • minwidth:最小宽度(可拖动调整列宽时有效)

  • stretch:是否允许拉伸(tk.YES/tk.NO

table.column('姓名', anchor='center', width=90)
2. 表头设置(heading方法)
  • text:显示的表头文字

  • command:点击表头时触发的回调函数(用于排序功能)

table.heading("年龄", text="年龄", command=lambda: sort_by_age())
3. 插入数据(insert方法)
  • parent:父节点(通常用空字符串表示根节点)

  • index:插入位置("end"表示末尾),tk.END也可以,从最后一行开始追加

  • values:数据内容(元组形式,长度需与列数匹配)

  • iid:可选参数,为行指定唯一标识符

table.insert("", "end", iid="row1", values=("张三", 25, "北京"))
4. 其他常用方法
  • 删除行table.delete(iid)

  • 获取选中行table.selection()

  • 获取行数据table.item(iid, "values")

  • 修改数据table.item(iid, values=新数据)

  • 获取选中行的id:table.identify_row(event.y)

  • 获取所有行的id:table.get_children()

  • 查询id的下标:table.get_children().index(id)


三、样式美化

1. 修改字体颜色
style = ttk.Style()
style.configure("Treeview", 
               rowheight=25,  # 行高
               font=("微软雅黑", 11),
               foreground="#333",
               background="#fff")
               
# 设置斑马线效果(隔行变色)
style.map("Treeview", background=[("selected", "#0078D7"), ("!selected", "#f0f0f0")])
2. 添加滚动条
# 纵向滚动条
y_scroll = ttk.Scrollbar(root, orient="vertical", command=table.yview)
table.configure(yscrollcommand=y_scroll.set)
y_scroll.pack(side=tk.RIGHT, fill=tk.Y)

# 横向滚动条同理(orient="horizontal")

四、常见问题

  1. 为什么表格不显示数据?

    • 检查是否执行了 insert 插入数据

    • 确认列名与 columns 定义一致

  2. 如何实现点击排序?
    需要自定义排序函数:

    def sort_by_col(col, reverse):
        data = [(table.set(child, col), child) for child in table.get_children("")]
        data.sort(reverse=reverse)
        for index, (val, child) in enumerate(data):
            table.move(child, "", index)
        table.heading(col, command=lambda: sort_by_col(col, not reverse))
  3. 如何获取选中行数据?

    selected = table.selection()
    if selected:
        print(table.item(selected[0], "values"))

五、完整功能示例(带编辑功能)

# 点击单元格编辑功能
def edit_cell(event):
    region = table.identify_region(event.x, event.y)
    if region == "cell":
        column = table.identify_column(event.x)
        iid = table.focus()
        current_value = table.item(iid, "values")[int(column[1])-1]
        
        # 创建编辑框
        entry = tk.Entry(root)
        entry.place(x=event.x, y=event.y)
        entry.insert(0, current_value)
        
        def save_edit():
            new_value = entry.get()
            values = list(table.item(iid, "values"))
            values[int(column[1])-1] = new_value
            table.item(iid, values=values)
            entry.destroy()
            
        entry.bind("<Return>", lambda e: save_edit())

table.bind("<Double-1>", edit_cell)
滚动条ttk.Scrollbar

用于滚动一些组件的可见范围,根据方向可分为垂直滚动条和水平滚动条。组件常常被用于实现文本、画布和列表框的滚动。

在名为parent的顶级窗口或框架中创建一个新的滚动条组件:

# 创建滚动条  command=需要绑定的应用组件,yview
scroll_bar = ttk.Scrollbar(main_window, command=table.yview)
# 表格绑定滚动条
table.config(yscrollcommand=scroll_bar.set)
# 滚动条布局
scroll_bar.place(x=1313, y=80, height=645)

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐