python tk 对查询的数据进行分页显示,python tk 对查询的数据进行分页显示并获取点击的对应行的信息,并获取点击的对应行的信息
时间: 2023-12-03 19:46:43 浏览: 169
实现查询数据分页显示可以使用 Python Tkinter 中的 Treeview 控件,结合数据库查询和分页算法实现。以下是一个简单的示例代码:
```python
import tkinter as tk
import sqlite3
class App(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.create_widgets()
self.page_num = 1
self.page_size = 10
self.total_records = 0
self.total_pages = 0
self.current_records = []
def create_widgets(self):
self.treeview = tk.ttk.Treeview(self.master, columns=('col1', 'col2', 'col3'), show='headings')
self.treeview.heading('col1', text='ID')
self.treeview.heading('col2', text='Name')
self.treeview.heading('col3', text='Age')
self.treeview.pack()
self.prev_button = tk.Button(self.master, text='Prev', command=self.prev_page)
self.prev_button.pack(side='left')
self.next_button = tk.Button(self.master, text='Next', command=self.next_page)
self.next_button.pack(side='right')
self.status_label = tk.Label(self.master, text='')
self.status_label.pack(side='bottom')
def load_data(self):
conn = sqlite3.connect('data.db')
cursor = conn.cursor()
cursor.execute('SELECT COUNT(*) FROM users')
self.total_records = cursor.fetchone()[0]
self.total_pages = (self.total_records + self.page_size - 1) // self.page_size
cursor.execute(f'SELECT * FROM users LIMIT {self.page_size} OFFSET {(self.page_num - 1) * self.page_size}')
self.current_records = cursor.fetchall()
conn.close()
def display_data(self):
self.treeview.delete(*self.treeview.get_children())
for record in self.current_records:
self.treeview.insert('', 'end', values=record)
self.status_label.config(text=f'Page {self.page_num}/{self.total_pages}')
def prev_page(self):
if self.page_num > 1:
self.page_num -= 1
self.load_data()
self.display_data()
def next_page(self):
if self.page_num < self.total_pages:
self.page_num += 1
self.load_data()
self.display_data()
root = tk.Tk()
app = App(master=root)
app.load_data()
app.display_data()
app.mainloop()
```
上述示例代码中,我们首先创建了一个包含三列的 Treeview 控件用于显示查询数据。然后在 `load_data` 方法中查询数据库中的记录总数和当前页的记录,并保存在 `total_records`、`total_pages` 和 `current_records` 变量中。在 `display_data` 方法中,我们将 `current_records` 中的记录插入到 Treeview 控件中,并更新底部状态栏的信息。
分页算法使用 `(total_records + page_size - 1) // page_size` 计算总页数,其中 `//` 表示整除运算符。在 `prev_page` 和 `next_page` 方法中,我们根据当前页码和总页数判断是否可以上一页或下一页,并更新 `page_num` 的值,最后调用 `load_data` 和 `display_data` 方法重新加载和显示数据。
如果要获取点击的对应行的信息,可以在 Treeview 控件中绑定 `<<TreeviewSelect>>` 事件,并在事件处理函数中获取所选行的信息,例如:
```python
def on_treeview_select(self, event):
selected_items = self.treeview.selection()
if selected_items:
selected_item = selected_items[0]
item_values = self.treeview.item(selected_item)['values']
print(f'Selected item: {item_values}')
# 在 create_widgets 方法中添加以下代码
self.treeview.bind('<<TreeviewSelect>>', self.on_treeview_select)
```
上述代码中,我们定义了一个名为 `on_treeview_select` 的事件处理函数,用于获取所选行的信息并输出到控制台。然后在 `create_widgets` 方法中绑定 `<<TreeviewSelect>>` 事件到 Treeview 控件,并指定事件处理函数为 `on_treeview_select`。
阅读全文