什么是记录分页?
如果我们有更多的记录,那么我们就不能一次显示所有的记录。例如,我们的学生表中有 35 条记录。我们将一次显示 10 条记录,然后提供向用户显示下 10 条记录或前 10 条记录的选项。将记录分成多个页面称为记录分页(分页)。
这是输出的屏幕截图。限制设置为 8 ,
即禁用“上一步”按钮的第一页。下一步按钮已启用。
带有下一步按钮的最后一页被禁用。上一个按钮已启用。显示第 35 条记录后,其余行为空白。
首先我们将连接到 SQLite 数据库,我们已经创建并添加了记录到学生表
import sqlite3
my_conn = sqlite3.connect('my_db.db')
我们需要表中的记录总数。我们还必须设置每个显示的记录数。(可变限制)
r_set=my_conn.execute("SELECT count(*) as no from STUDENT")
data_row=r_set.fetchone()
no_rec=data_row[0] # Total number of rows in table
limit = 8; # No of records to be shown per page.
显示 Tkinter 窗口的基础在这里
import tkinter as tk
from tkinter import *
my_w = tk.Tk()
my_w.geometry("350x200")
调用函数my_display()以显示一组行。我们将变量偏移量传递给这个函数。这是从将显示记录的位置开始的值,或者这是显示的起点。offset 的初始值是 0,单击 Next 按钮时,它的值为 8(变量限制设置为 8),然后是 16 ,接下来是 24 等等。单击 Prev 按钮时,该值减少 8(变量limit的值)。
创建查询。
这里我们使用LIMIT Query来获取一组行。在查询中,我们必须传递变量limit和offset的值 。在将值加入 SQL 查询时,我们必须使用str() 函数将变量转换为字符串(从整数)。
q="SELECT * from student LIMIT "+ str(offset) +","+str(limit)
r_set=my_conn.execute(q);
我们使用for 循环显示每行数据,每个数据使用一个Entry显示。
我们的内部循环在每个条目中水平显示每个数据。
i=0 # row value inside the loop
for student in r_set:
for j in range(len(student)):
e = Entry(my_w, width=10, fg='blue')
e.grid(row=i, column=j)
e.insert(END, student[j])
i=i+1
在最后一页显示空白行 我们将Entry值设置为空白字符串。这部分仅在我们必须显示空白行(仅在最后一页)时执行。
while (i<limit):#required to blank the balance rows if they are less
for j in range(len(student)):
e = Entry(my_w, width=10, fg='blue')
e.grid(row=i, column=j)
e.insert(END, "")
i=i+1
带参数的按钮
我们在这里使用了两个按钮,Next 按钮将显示下一组记录,Prev 按钮将显示前一组行。
单击这些按钮将执行my_display(offset)函数并传递新的偏移值。
back = offset - limit # This value is used by Previous button
next = offset + limit # This value is used by Next button
b1 = tk.Button(my_w, text='Next >', command=lambda: my_display(next))
b1.grid(row=12,column=4)
b2 = tk.Button(my_w, text='< Prev', command=lambda: my_display(back))
b2.grid(row=12,column=1)
启用和禁用按钮
我们已经计算了记录总数并将其存储在变量no_rec 中。这个值我们将与变量next进行比较,当它小于或等于next 时,我们将禁用NEXT按钮。
if(no_rec <= next):
b1["state"]="disabled" # disable next button
else:
b1["state"]="active" # enable next button
同样,对于 Previous (Prev) 按钮,我们将检查变量back的值。如果该值大于或等于 0,那么我们可以保持启用上一个按钮。
if(back >= 0):
b2["state"]="active" # enable Prev button
else:
b2["state"]="disabled"# disable Prev button
这是完整的代码。
import sqlite3
my_conn = sqlite3.connect('my_db.db')
###### end of connection ####
r_set=my_conn.execute("SELECT count(*) as no from STUDENT")
data_row=r_set.fetchone()
no_rec=data_row[0] # Total number of rows in table
limit = 8; # No of records to be shown per page.
##### tkinter window ######
import tkinter as tk
from tkinter import *
my_w = tk.Tk()
my_w.geometry("350x200")
def my_display(offset):
q="SELECT * from student LIMIT "+ str(offset) +","+str(limit)
r_set=my_conn.execute(q);
i=0 # row value inside the loop
for student in r_set:
for j in range(len(student)):
e = Entry(my_w, width=10, fg='blue')
e.grid(row=i, column=j)
e.insert(END, student[j])
i=i+1
while (i<limit): # required to blank the balance rows if they are less
for j in range(len(student)):
e = Entry(my_w, width=10, fg='blue')
e.grid(row=i, column=j)
e.insert(END, "")
i=i+1
# Show buttons
back = offset - limit # This value is used by Previous button
next = offset + limit # This value is used by Next button
b1 = tk.Button(my_w, text='Next >', command=lambda: my_display(next))
b1.grid(row=12,column=4)
b2 = tk.Button(my_w, text='< Prev', command=lambda: my_display(back))
b2.grid(row=12,column=1)
if(no_rec <= next):
b1["state"]="disabled" # disable next button
else:
b1["state"]="active" # enable next button
if(back >= 0):
b2["state"]="active" # enable Prev button
else:
b2["state"]="disabled"# disable Prev button
my_display(0)
my_w.mainloop()
MySQL
唯一的更改是带有登录详细信息的连接字符串。这部分突出显示。
from sqlalchemy import create_engine
my_conn = create_engine("mysql+mysqldb://userid:password@localhost/db_name")
###### end of connection ####
r_set=my_conn.execute("SELECT count(*) as no from STUDENT")
data_row=r_set.fetchone()
no_rec=data_row[0] # Total number of rows in table
limit = 8; # No of records to be shown per page.
##### tkinter window ######
import tkinter as tk
from tkinter import *
my_w = tk.Tk()
my_w.geometry("350x200")
def my_display(offset):
q="SELECT * from student LIMIT "+ str(offset) +","+str(limit)
r_set=my_conn.execute(q);
i=0 # row value inside the loop
for student in r_set:
for j in range(len(student)):
e = Entry(my_w, width=10, fg='blue')
e.grid(row=i, column=j)
e.insert(END, student[j])
i=i+1
while (i" ,="" command="lambda:" my_display(next))="" b1.grid(row="12,column=4)" b2="tk.Button(my_w," my_display(back))="" b2.grid(row="12,column=1)" if(no_rec="" = 0):
b2["state"]="active" # enable Prev button
else:
b2["state"]="disabled"# disable Prev button
my_display(0)
my_w.mainloop()