python tk 对查询的数据进行分页显示,并在首列添加复选框,可以获取被选中的行对应行信息
时间: 2023-12-03 17:46:57 浏览: 56
可以使用Python的Tkinter库中的Treeview控件实现对查询数据的分页显示,并在首列添加复选框,同时也可以获取被选中的行对应的行信息。
以下是一个简单的示例代码:
```python
import tkinter as tk
from tkinter import ttk
class Page(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent)
self.parent = parent
self.page = 1
self.total_pages = 0
self.data = []
self.create_widgets()
def create_widgets(self):
# 创建表格
self.treeview = ttk.Treeview(self, show="headings")
self.treeview["columns"] = ("checkbox", "column1", "column2", "column3")
self.treeview.column("checkbox", width=50)
self.treeview.column("column1", width=150)
self.treeview.column("column2", width=150)
self.treeview.column("column3", width=150)
self.treeview.heading("checkbox", text="选择")
self.treeview.heading("column1", text="列1")
self.treeview.heading("column2", text="列2")
self.treeview.heading("column3", text="列3")
self.treeview.pack(side="top", fill="both", expand=True)
# 创建分页按钮
self.prev_button = ttk.Button(self, text="<<上一页", command=self.prev_page)
self.prev_button.pack(side="left", padx=5, pady=5)
self.page_label = ttk.Label(self, text="")
self.page_label.pack(side="left", padx=5, pady=5)
self.next_button = ttk.Button(self, text="下一页>>", command=self.next_page)
self.next_button.pack(side="left", padx=5, pady=5)
# 创建全选按钮
self.select_all_button = ttk.Button(self, text="全选", command=self.select_all)
self.select_all_button.pack(side="right", padx=5, pady=5)
def set_data(self, data, page_size=10):
# 设置数据和每页数据数量,计算总页数
self.data = data
self.page_size = page_size
self.total_pages = (len(data) + page_size - 1) // page_size
self.page = 1
self.show_data()
def show_data(self):
# 显示当前页数据
start = (self.page - 1) * self.page_size
end = min(start + self.page_size, len(self.data))
for i in self.treeview.get_children():
self.treeview.delete(i)
for row in self.data[start:end]:
self.treeview.insert("", "end", values=row)
# 更新分页按钮和页码信息
self.page_label.config(text="第{}页,共{}页".format(self.page, self.total_pages))
self.prev_button.config(state="disabled" if self.page == 1 else "normal")
self.next_button.config(state="disabled" if self.page == self.total_pages else "normal")
def prev_page(self):
# 上一页
self.page -= 1
self.show_data()
def next_page(self):
# 下一页
self.page += 1
self.show_data()
def select_all(self):
# 全选
for i in self.treeview.get_children():
self.treeview.set(i, "checkbox", "1")
def get_checked_rows(self):
# 获取被选中的行对应行信息
checked_rows = []
for i in self.treeview.get_children():
if self.treeview.set(i, "checkbox") == "1":
checked_rows.append(self.treeview.item(i, "values"))
return checked_rows
if __name__ == "__main__":
# 示例数据
data = []
for i in range(1, 101):
data.append(("row{}".format(i), "value{}".format(i), "data{}".format(i)))
# 创建窗口和分页控件
root = tk.Tk()
root.title("分页控件示例")
page = Page(root)
page.pack(side="top", fill="both", expand=True)
# 设置数据和每页数据数量
page.set_data(data)
# 获取被选中的行对应行信息
def get_checked_rows():
checked_rows = page.get_checked_rows()
print(checked_rows)
# 创建获取被选中的行按钮
get_checked_rows_button = ttk.Button(root, text="获取被选中的行", command=get_checked_rows)
get_checked_rows_button.pack(side="bottom", padx=5, pady=5)
root.mainloop()
```
在这个示例代码中,我们首先创建了一个`Page`类,它继承自Tkinter库中的`ttk.Frame`类。在`Page`类中,我们创建了一个`Treeview`控件作为表格,它有四列,分别为复选框、列1、列2和列3。我们还创建了三个按钮,用于分页和全选操作。在`set_data`方法中,我们设置了数据和每页数据数量,计算出总页数。在`show_data`方法中,我们根据当前页码显示当前页的数据,并更新分页按钮和页码信息。在`get_checked_rows`方法中,我们遍历表格中的所有行,找出被选中的行,并将它们的信息添加到`checked_rows`列表中。最后,在窗口中创建了一个获取被选中的行的按钮,并将它与`get_checked_rows`方法关联起来。这样,当用户点击该按钮时,就可以获取被选中的行对应的行信息了。