Python Tkinter GUI 使用 SQLite 和MySQL数据库实现分页显示

什么是记录分页?

如果我们有更多的记录,那么我们就不能一次显示所有的记录。例如,我们的学生表中有 35 条记录。我们将一次显示 10 条记录,然后提供向用户显示下 10 条记录或前 10 条记录的选项。将记录分成多个页面称为记录分页(分页)。

这是输出的屏幕截图。限制设置为 8 ,

即禁用“上一步”按钮的第一页。下一步按钮已启用。
 

Tkinter 窗口中的第一页分页记录


带有下一步按钮的最后一页被禁用。上一个按钮已启用。显示第 35 条记录后,其余行为空白。

Tkinter 窗口中分页记录的最后一页


首先我们将连接到 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来获取一组行。在查询中,我们必须传递变量limitoffset的值 。在将值加入 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()

猜你喜欢

转载自blog.csdn.net/allway2/article/details/121501208