如何将MongoDB数据在Python Tkinter的Treeview中显示并添加滚动条?
替换Grid布局为Treeview实现滚动展示MongoDB员工数据
步骤1:创建Treeview与滚动条组件
先在界面中替换原Entry展示区域,添加Treeview和滚动条:
import tkinter as tk from tkinter import ttk, messagebox from pymongo import MongoClient, ObjectId # 连接MongoDB(替换为你的连接字符串) client = MongoClient('mongodb://localhost:27017/') db = client['your_database_name'] collection = db['your_collection_name'] # 主窗口初始化 root = tk.Tk() root.title('员工管理系统') # 创建数据展示框架 data_frame = tk.Frame(root) data_frame.grid(row=0, column=0, padx=10, pady=10, sticky='nsew') # 配置Treeview列(替换为你的MongoDB实际字段) columns = ('_id', 'name', 'position', 'salary') tree = ttk.Treeview(data_frame, columns=columns, show='headings') # 设置列标题与宽度 tree.heading('_id', text='员工ID') tree.heading('name', text='姓名') tree.heading('position', text='职位') tree.heading('salary', text='月薪') tree.column('_id', width=120) tree.column('name', width=150) tree.column('position', width=180) tree.column('salary', width=100) # 添加垂直滚动条 scrollbar = ttk.Scrollbar(data_frame, orient='vertical', command=tree.yview) tree.configure(yscrollcommand=scrollbar.set) # 布局组件 tree.grid(row=0, column=0, sticky='nsew') scrollbar.grid(row=0, column=1, sticky='ns') # 让框架自适应窗口大小 data_frame.grid_columnconfigure(0, weight=1) data_frame.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_rowconfigure(0, weight=1)
步骤2:修改creategrid(n)函数
替换原创建Entry的逻辑,改为从MongoDB拉取数据并填充Treeview:
def creategrid(n): # 清空Treeview现有内容 for item in tree.get_children(): tree.delete(item) # 查询MongoDB数据(n为查询条数,若要展示全部可去掉limit(n)) employees = collection.find().limit(n) # 插入数据到Treeview(注意ObjectId需转字符串) for emp in employees: tree.insert( '', tk.END, values=( str(emp['_id']), emp['name'], emp['position'], emp['salary'] ) )
步骤3:适配CRUD其他操作(示例)
增删改操作后调用creategrid(n)刷新Treeview:
新增员工示例
def add_employee(): # 获取输入框数据(假设你有name_entry、position_entry、salary_entry) name = name_entry.get() position = position_entry.get() salary = salary_entry.get() if not all([name, position, salary]): messagebox.showwarning('提示', '请填写完整信息') return # 插入MongoDB collection.insert_one({ 'name': name, 'position': position, 'salary': float(salary) }) # 清空输入框 name_entry.delete(0, tk.END) position_entry.delete(0, tk.END) salary_entry.delete(0, tk.END) # 刷新Treeview creategrid(100)
删除选中员工示例
def delete_employee(): selected_items = tree.selection() if not selected_items: messagebox.showwarning('提示', '请选择要删除的员工') return # 获取选中员工ID并删除 for item in selected_items: emp_id = tree.item(item)['values'][0] collection.delete_one({'_id': ObjectId(emp_id)}) tree.delete(item)
注意事项
- 替换代码中的
your_database_name和your_collection_name为你的MongoDB实际库名、集合名 - 根据员工数据字段,修改
columns列表、列标题及tree.insert中的values参数 - 若需分页展示,可结合
skip()和limit()调整查询逻辑
内容的提问来源于stack exchange,提问作者Nguyễn Quốc Mạnh
相关产品推荐
相关产品推荐

