Python优化软件项目:求替代tktable或tkinter table widget的自定义行列可输入表格方案
不用tktable/tkinter Table Widget的Python表格实现方案
嘿,我之前开发工具类软件时刚好碰到过类似需求,给你几个实用的替代方案,都是亲测能满足「用户输入+自定义行列」的需求:
方案1:纯Tkinter手动构建Entry网格
如果不想引入任何第三方库,直接用Tkinter的Entry组件拼出表格是最省心的——完全原生,不用额外安装依赖,适合轻量场景。
核心思路是根据用户输入的行列数,动态生成网格状的Entry组件,再统一管理这些组件的输入值。
示例代码:
import tkinter as tk from tkinter import ttk class CustomTable: def __init__(self, root): self.root = root self.root.title("自定义行列输入表格") # 输入行列数的控件 ttk.Label(root, text="行数:").grid(row=0, column=0, padx=5, pady=5) self.row_entry = ttk.Entry(root, width=5) self.row_entry.grid(row=0, column=1, padx=5, pady=5) self.row_entry.insert(0, "3") ttk.Label(root, text="列数:").grid(row=0, column=2, padx=5, pady=5) self.col_entry = ttk.Entry(root, width=5) self.col_entry.grid(row=0, column=3, padx=5, pady=5) self.col_entry.insert(0, "4") # 生成表格按钮 ttk.Button(root, text="生成表格", command=self.create_table).grid(row=0, column=4, padx=10, pady=5) # 存储所有Entry组件的二维列表 self.table_entries = [] def create_table(self): # 清空之前的表格(如果有的话) for row in self.table_entries: for entry in row: entry.destroy() self.table_entries.clear() # 获取用户输入的行列数 rows = int(self.row_entry.get()) cols = int(self.col_entry.get()) # 生成表头(可选) for col in range(cols): header = ttk.Label(self.root, text=f"列 {col+1}", font=("Arial", 10, "bold")) header.grid(row=1, column=col, padx=2, pady=2) # 生成输入单元格 for row in range(rows): entry_row = [] for col in range(cols): entry = ttk.Entry(self.root, width=15) entry.grid(row=row+2, column=col, padx=2, pady=2) entry_row.append(entry) self.table_entries.append(entry_row) # 新增获取数据按钮 ttk.Button(self.root, text="获取表格数据", command=self.get_table_data).grid(row=rows+2, column=0, columnspan=cols, pady=10) def get_table_data(self): # 收集所有单元格的输入值 data = [] for row in self.table_entries: row_data = [entry.get() for entry in row] data.append(row_data) # 这里可以替换成你需要的处理逻辑,比如打印、保存等 print("表格输入数据:") for row in data: print(row) if __name__ == "__main__": root = tk.Tk() app = CustomTable(root) root.mainloop()
优缺点:
- ✅ 零第三方依赖,打包体积小
- ✅ 完全自定义样式(字体、颜色、大小都能调)
- ❌ 复杂功能(比如排序、筛选)需要自己实现
方案2:使用PyQt/PySide的QTableWidget
如果你的软件需要更专业的表格功能(比如排序、单元格格式、动态数据更新),PyQt或PySide的QTableWidget是绝佳选择——开箱即用的编辑功能,支持自定义行列,还能轻松扩展。
示例代码(以PyQt5为例):
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QWidget, QHBoxLayout, QLineEdit, QPushButton, QVBoxLayout) import sys class TableWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("自定义行列输入表格") self.setGeometry(100, 100, 600, 400) central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) # 行列输入区 input_layout = QHBoxLayout() self.row_input = QLineEdit() self.row_input.setPlaceholderText("输入行数") self.row_input.setText("3") self.col_input = QLineEdit() self.col_input.setPlaceholderText("输入列数") self.col_input.setText("4") create_btn = QPushButton("生成表格") create_btn.clicked.connect(self.create_table) input_layout.addWidget(self.row_input) input_layout.addWidget(self.col_input) input_layout.addWidget(create_btn) layout.addLayout(input_layout) # 表格组件 self.table = QTableWidget() layout.addWidget(self.table) # 获取数据按钮 get_data_btn = QPushButton("获取表格数据") get_data_btn.clicked.connect(self.get_table_data) layout.addWidget(get_data_btn) def create_table(self): rows = int(self.row_input.text()) cols = int(self.col_input.text()) self.table.setRowCount(rows) self.table.setColumnCount(cols) # 设置表头(可选) self.table.setHorizontalHeaderLabels([f"列 {i+1}" for i in range(cols)]) # 设置单元格可编辑 for row in range(rows): for col in range(cols): item = QTableWidgetItem() self.table.setItem(row, col, item) def get_table_data(self): data = [] for row in range(self.table.rowCount()): row_data = [] for col in range(self.table.columnCount()): item = self.table.item(row, col) row_data.append(item.text() if item else "") data.append(row_data) print("表格输入数据:") for row in data: print(row) if __name__ == "__main__": app = QApplication(sys.argv) window = TableWindow() window.show() sys.exit(app.exec_())
优缺点:
- ✅ 内置大量专业功能(排序、筛选、单元格样式、右键菜单等)
- ✅ 官方文档完善,社区资源多
- ❌ 需要安装PyQt/PySide库(
pip install pyqt5) - ❌ 打包后的体积比纯Tkinter方案大一些
方案3:使用Rich库实现终端表格(如果是CLI工具)
如果你的优化软件是命令行工具,Rich库可以帮你快速构建支持用户输入的交互式表格,颜值还很高。
示例代码:
from rich.table import Table from rich.prompt import Prompt from rich.console import Console console = Console() def create_cli_table(): rows = int(Prompt.ask("请输入行数", default="3")) cols = int(Prompt.ask("请输入列数", default="4")) table = Table(title="自定义输入表格") # 添加表头 for col in range(cols): table.add_column(f"列 {col+1}", justify="center") # 收集用户输入 data = [] for row in range(rows): row_data = [] for col in range(cols): value = Prompt.ask(f"请输入第 {row+1} 行第 {col+1} 列的值") row_data.append(value) data.append(row_data) table.add_row(*row_data) # 展示表格 console.print("\n你输入的表格内容:") console.print(table) # 这里可以处理数据 print("\n原始数据:", data) if __name__ == "__main__": create_cli_table()
优缺点:
- ✅ 终端下的交互体验好,表格美观
- ✅ 轻量,安装简单(
pip install rich) - ❌ 仅适用于命令行工具,不支持GUI
内容的提问来源于stack exchange,提问作者Willy satrio nugroho
相关产品推荐
相关产品推荐

