tkinter页面及treeview布局

treeview 考虑到需要实现左右和上下的滚动操作,使用了一个PanedWindow组件。

1. 大布局

大方向布局是 self.paned_window.pack(fill=tk.BOTH, expand=True)布满所有

2. paned_window内置布局

paned_window add 操作让 left_pane左边和right_pane右边

3. left_pane 左边

left_pane 里面组件通过 grid 布局, padx,pady 来控制距离。如果需要权重分布的化,可以通过以下方法
grid_rowconfigure(行,权重)每一行的权重

left_pane.grid_rowconfigure(0, weight=1)
left_pane.grid_rowconfigure(1, weight=1)
left_pane.grid_rowconfigure(2, weight=1)
left_pane.grid_rowconfigure(3, weight=3)

4.right_pane右边

right_pane 里面分上、中、下三块布局

上布局:
top_right_frame 对每个标签进行设置权重,让页面大布局不会页面不均匀分布。
grid_columnconfigure(列,权重)每一列的权重

        # 为标签列设置较低的权重
        top_right_frame.grid_columnconfigure(0, weight=1)  # 姓名标签列
        top_right_frame.grid_columnconfigure(2, weight=1)  # 身份证号标签列
        # 为输入框列设置较高的权重
        top_right_frame.grid_columnconfigure(1, weight=2)  # 姓名输入框列
        top_right_frame.grid_columnconfigure(3, weight=2)  # 身份证号输入框列
        # 为按钮列设置适中的权重
        top_right_frame.grid_columnconfigure(4, weight=1)  # 查询按钮列

中 布局:middle_right_frame 保证能使用treeview中的滚动条

right_pane.grid_columnconfigure(0, weight=1)

下 布局:
bottom_right_frame跟上布局基本保持一致操作

# 为标签列设置较低的权重
        bottom_right_frame.grid_columnconfigure(0, weight=1)  # 上一页
        bottom_right_frame.grid_columnconfigure(2, weight=1)  # 下一页
        # 为输入框列设置较高的权重
        bottom_right_frame.grid_columnconfigure(1, weight=2) 

5.详细代码

import tkinter as tk
from tkinter import ttk
from tkinter import *
import sys
sys.path.append("../")  # 返回上层路径
from service import service
from template import center_window
class YourApplication:
    def __init__(self, master):
        self.paned_window = ttk.PanedWindow(master, orient=tk.HORIZONTAL)
        master.geometry("800x395")
        # 主页面可以,里面的页面才可以
        # master.columnconfigure(0, weight=1)  # 设置主窗口第一列具有权重,以便于拉伸填充
        # master.rowconfigure(0, weight=1)  # 设置主窗口第一行具有权重,以便于拉伸填充

        # 创建左侧Frame
        left_pane = tk.Frame(self.paned_window)
        # 在左侧Frame中布局你的控件...
        self.query_button = Button(left_pane, text="查询")
        self.modify_button = Button(left_pane, text="修改")  # 假设存在的修改操作函数
        self.delete_button = Button(left_pane, text="删除")  # 假设存在的删除操作函数
        self.query_button.grid(row=0, column=0, padx=20, pady=5)
        self.modify_button.grid(row=1, column=0, padx=20, pady=5)
        self.delete_button.grid(row=2, column=0, padx=20, pady=5)

        # 添加下部分空白
        # self.spacer_label = Label(left_pane, text="")  #
        # self.spacer_label.grid(row=3, column=0, padx=20, pady=5, sticky="nswe", rowspan=3)  # 根据需要调整rowspan参数以增加空白行数


        # 创建右侧Frame
        right_pane = tk.Frame(self.paned_window, highlightbackground="#d3d3d3", highlightthickness=2)
        # 在右侧Frame中布局你的控件...
        # 右上部Frame
        top_right_frame = Frame(right_pane)
        # 在top_right_frame中添加控件...
        self.query_label_name = Label(top_right_frame, text="姓名:")
        self.query_entry_name = Entry(top_right_frame, width=20)
        self.query_entry_name.bind("<Return>")
        self.query_label_id_number = Label(top_right_frame, text="身份证号:")
        self.query_entry_id_number = Entry(top_right_frame, width=20)
        self.query_entry_id_number.bind("<Return>")
        self.query_button = Button(top_right_frame, text="查询")
        self.query_label_name.grid(row=0, column=0, padx=5, pady=5)
        self.query_entry_name.grid(row=0, column=1, padx=5, pady=5)
        self.query_label_id_number.grid(row=0, column=2, padx=5, pady=5)
        self.query_entry_id_number.grid(row=0, column=3, padx=5, pady=5)
        self.query_button.grid(row=0, column=4, padx=5, pady=5)
        # 右中部Frame
        middle_right_frame = Frame(right_pane)
        # 在middle_right_frame中添加控件...
        # self.frame = Frame(middle_right_frame)
        self.tree = ttk.Treeview(middle_right_frame,
                                 columns=("name", "id_type", "id_number", "gender", "birth_date", "contact_info",
                                          "education_level", "annual_family_income", "main_income_source", "area",
                                          "street", "community"
                                          , "address", "main_disease", "illness_duration", "claim_overall_status",
                                          "illness_start_date", "illness_end_date", "medical_assistance",
                                          "user_name", "create_time", "is_valid"), show='headings')
        self.scrollbar_v = Scrollbar(middle_right_frame, orient=VERTICAL, command=self.tree.yview)
        self.scrollbar_h = Scrollbar(middle_right_frame, orient=HORIZONTAL, command=self.tree.xview)
        # 确保滚动条被添加到middle_right_frame中,并且正确配置
        # self.scrollbar_v.pack(side=tk.RIGHT, fill=tk.Y)
        # self.scrollbar_h.pack(side=tk.BOTTOM, fill=tk.X)
        # 确保TreeView也被添加到布局中,并且配置了滚动条
        # self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        # 设置treeview与滚动条关联
        self.tree.configure(xscrollcommand=self.scrollbar_h.set, yscrollcommand=self.scrollbar_v.set)
        self.columns_dict = {
            "name": "姓名", "id_type": "证件类型",
            "id_number": "身份证", "gender": "性别",
            "birth_date": "出生日期", "contact_info": "联系方式",
            "education_level": "学历", "annual_family_income": "家庭年收入(万元)",
            "main_income_source": "主要收入来源",
            "area": "所在区", "street": "所在街道", "community": "所在村社区",
            "address": "详细地址",  # 注意这里合并了“所在区”、“所在街道”、“所在村社区”,因为原始英文字段只有"address"
            "main_disease": "主要疾病", "illness_duration": "患病年限(年)",
            "claim_overall_status": "理赔情况(总体)", "illness_start_date": "患病开始时间",
            "illness_end_date": "患病结束时间", "medical_assistance": "医疗救助情况",
            "user_name": "操作人", "create_time": "创建时间", "is_valid": "是否有效"
        }
        for col in ["name", "id_type", "id_number", "gender", "birth_date", "contact_info",
                    "education_level", "annual_family_income", "main_income_source", "area", "street", "community"
            , "address", "main_disease", "illness_duration", "claim_overall_status",
                    "illness_start_date", "illness_end_date", "medical_assistance",
                    "user_name", "create_time", "is_valid"]:
            self.tree.column(col, width=150, anchor='center')  # 设置列宽
            self.tree.heading(col, text=self.columns_dict[col])  # 设置列标题
        query = f"SELECT * FROM basic_information WHERE is_valid=1 "
        rows = service.query(query)
        self.tree.delete(*self.tree.get_children())

        # 插入数据
        for row in rows:
            self.tree.insert('', 'end', values=tuple(row))
        self.tree.grid(row=0, column=0, sticky='nsew')
        # 将垂直滚动条放置在TreeView的右侧
        self.scrollbar_v.grid(row=0, column=1, sticky='ns')
        # # 将水平滚动条放置在TreeView的底部
        self.scrollbar_h.grid(row=1, column=0, sticky='ew')
        middle_right_frame.grid_columnconfigure(0, weight=1)
        middle_right_frame.grid_rowconfigure(0, weight=1)
        '''
        根据每一列设置权重均匀分布数据
        '''
        # 为标签列设置较低的权重
        top_right_frame.grid_columnconfigure(0, weight=1)  # 姓名标签列
        top_right_frame.grid_columnconfigure(2, weight=1)  # 身份证号标签列
        # 为输入框列设置较高的权重
        top_right_frame.grid_columnconfigure(1, weight=2)  # 姓名输入框列
        top_right_frame.grid_columnconfigure(3, weight=2)  # 身份证号输入框列
        # 为按钮列设置适中的权重
        top_right_frame.grid_columnconfigure(4, weight=1)  # 查询按钮列
        # top_right_frame.grid_rowconfigure(0, weight=1)
        # 右下部Frame
        bottom_right_frame = Frame(right_pane)
        # 在bottom_right_frame中添加控件...
        self.prev_button = Button(bottom_right_frame, text="上一页")
        self.next_button = Button(bottom_right_frame, text="下一页")
        self.page_label = Label(bottom_right_frame, text=f"第1页/共1页")
        self.prev_button.grid(row=0, column=0,padx=5, pady=5)
        self.next_button.grid(row=0, column=2, padx=5, pady=5)
        self.page_label.grid(row=0, column=1, padx=5, pady=5)
        # 为标签列设置较低的权重
        bottom_right_frame.grid_columnconfigure(0, weight=1)  # 上一页
        bottom_right_frame.grid_columnconfigure(2, weight=1)  # 下一页
        # 为输入框列设置较高的权重
        bottom_right_frame.grid_columnconfigure(1, weight=2)  # 第1页/共1页
        # 将三个子Frame放入right_pane并使用grid布局
        top_right_frame.grid(row=0, column=0, sticky="nsew", padx=10,ipadx=10, pady=5)
        middle_right_frame.grid(row=1, column=0, sticky="nsew", padx=10,ipadx=10, pady=5)
        bottom_right_frame.grid(row=2, column=0, sticky="nsew", padx=10,ipadx=10, pady=5)

        # 设置right_pane的填充策略以适应其父窗口大小变化
        # 确保右侧Frame(包含TreeView和滚动条)能够适当扩展填充额外空间
        right_pane.grid_columnconfigure(0, weight=1)
        # left_pane.grid_rowconfigure(0, weight=1)
        # left_pane.grid_rowconfigure(1, weight=1)
        # left_pane.grid_rowconfigure(2, weight=1)
        # left_pane.grid_rowconfigure(3, weight=3)
        self.paned_window.add(left_pane)
        self.paned_window.add(right_pane)
        # 将PanedWindow添加到主窗口并设置其大小管理策略
        self.paned_window.pack(fill=tk.BOTH, expand=True)
# 示例运行
root = tk.Tk()
app = YourApplication(root)
root.mainloop()

6.总结

一个好的布局,让元素能够更好的展示,让功能更加的完善。self.tree.insert请用自己的数据尝试。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金融小白数据分析之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值