当前位置:首页 » tkinter » 正文

用tkinter做一个text转sqlite的小程序,有源码有截图

  我想把上一篇文章用tkinter做的答题程序做的小程序修改一下,我要把题库源文件由txt文件改成sqlite3数据库,我不想在sqlite编辑软件里手工输入题目及答案等资料,我想找一个可以把我的文本文件转为sqlite数据库文件的工具软件,但是没有找到,于是,我决定自己做一个。

  为了以后也可以方便地转化其它的文本文件为sqlite的db文件,我花了一点时间让转化的很多变量可以自定义,如可以自定义题库的地址,数据库名,数据表名,字段名,字段类型,字段大小等。

  我发现自己容易出现以下错误:如,在数据一行的最后位置,多输入一个英文逗号,或者,在题库的最后多输入了几个空行,为此,在代码我加入了容错代码。

  下面是源代码,源码中大部分都是我以前文章的内容,如果看不明白,可以再回看一下我以前的文章。   丶丌皛

from tkinter import *
import sqlite3
from tkinter import messagebox

def text2sqlite():
    if en1.get()=='' or en2.get()=='' or en3.get()=='' or en4.get()=='' or en5.get()=='':
        messagebox.showinfo("提示:","每一个文本框都要填入相应的文本才能转换")       
        return

    str0=en0.get() # 数据库名
    str1=en1.get() # 数据表名
    str2 = en2.get().split(',') # 字符串分解成字段 名称 列表
    str3 = en3.get().split(',') # 字符串分解成字段 类型 列表
    str4 = en4.get().split(',') # 字符串分解成字段 长度 列表
    
    str2=[i for i in str2 if i !=''] # 去除因为手误多输入逗号引成的空列表
    str3=[i for i in str3 if i !='']
    str4=[i for i in str4 if i !='']

    if len(str2) != len(str3):
        messagebox.showinfo("提示:","字段名称与字段类型数量不一") 
        return
    if len(str2) != len(str4):
        messagebox.showinfo("提示:","字段名称与字段长度数量不一") 
        return
        
    conn=sqlite3.connect(str0+'.db') #创建或打开数据库
    cur=conn.cursor() # 创建游标对象
    strSQL='create table ' + str1 + ' (' # SQL语句

    for i,j in enumerate(str2):
        if i==0:
            strSQL=strSQL + str2[i] +  ' ' + str3[i] + '(' + str4[i] + ') primary key,' # SQL语句,第1个字段默认为主键
        else:
            strSQL=strSQL + str2[i] +  ' ' + str3[i] + '(' + str4[i] + '),' # SQL语句,非主键字段
    # print('strSQL??=',strSQL) # 输出SQL语句看看
    # 会输出 strSQL??= create table text2sqlite (id INTEGER(10) primary key,timu TEXT(500),da1 TEXT(120),da2 TEXT(120),da3 TEXT(120),da4 TEXT(120),da TEXT(10),bmp TEXT(80),
    strSQL=strSQL[0:-1] # 去除最后一个逗号
    strSQL=strSQL+ ')'
    
    # print('strSQL=',strSQL) # 输出SQL语句看看
    # 会输出 strSQL= create table text2sqlite (id INTEGER(10) primary key,timu TEXT(500),da1 TEXT(120),da2 TEXT(120),da3 TEXT(120),da4 TEXT(120),da TEXT(10),bmp TEXT(80))

    cur.execute(strSQL) # 创建表

    strSQL2='insert into ' + str1 + ' ' + str(tuple(str2)) + ' ' + ' values ('  + ','.join('?'*len(str2)) + ')'
    # print('strSQL2=',strSQL2) # 输出SQL2语句,插入记录语句看看
    # 会输出 strSQL2= insert into text2sqlite ('id', 'timu', 'da1', 'da2', 'da3', 'da4', 'da', 'bmp')  values (?,?,?,?,?,?,?,?)

    filename=en5.get()
    with open(filename, 'r', encoding='utf-8') as file:  # 只读方式打开编码为utf-8的文本文件
        line = file.readlines()  # 以读取一行为列表方法读取全部行
    j=0
    for i in line:
        j+=1
        bb=((str(j) + ','+ line[j-1] ).split(','))[0:len(str2)] # 一行最后多了个英文逗号,或者提供过多的数据,通过 [0:len(str2)] 就只取字段个数的数据

        if len(bb)==len(str2):
            cur.execute(strSQL2,bb) # 表user增加一条记录
        else: # 容错,少的的数据行,或空行,就忽略
            print('第'+str(j)+'条记录提供的数据少于字段数')

    cur.close() # 关闭游标对象
    
    conn.commit() # 提交事务
    # --- 数据库的增,改,删要提交事务
    
    conn.close() # 关闭连接对象

root=Tk()
root.title('text转splite    来自:wb98.com')
root.resizable(True,False)
root.columnconfigure(0,weight=1) 

la0=Label(root,text='输入数据库名:')
la0.grid(sticky=W,padx=10)
en0=Entry(root)
en0.grid(sticky=EW,padx=10)

la1=Label(root,text='输入数据表名:')
la1.grid(sticky=W,padx=10)
en1=Entry(root)
en1.grid(sticky=EW,padx=10)

la2=Label(root,text='输入字段名(以英文逗号分隔):')
la2.grid(sticky=W,padx=10)
en2=Entry(root)
en2.grid(sticky=EW,padx=10)

la3=Label(root,text='输入字段类型 (以英文逗号分隔,跟上面的字段名相对应, \
选项:INTEGER,TEXT,REAL,BLOB) :')
la3.grid(sticky=W,padx=10)
en3=Entry(root)
en3.grid(sticky=EW,padx=10)

la4=Label(root,text='输入字段长度(以英文逗号分隔,跟上面的字段名相对应):')
la4.grid(sticky=W,padx=10)
en4=Entry(root)
en4.grid(sticky=EW,padx=10)

la3=Label(root,text='输入数据源txt文件地址:')
la3.grid(sticky=W,padx=10)
en5=Entry(root)
en5.grid(sticky=EW,padx=10)

but1=Button(root,text="    开 始 转 换    ",command=text2sqlite)
but1.grid(pady=5)

en0.insert(END,'student')
en1.insert(END,'text2sqlite')
en2.insert(END,'id,timu,da1,da2,da3,da4,da,bmp')
en3.insert(END,'INTEGER,TEXT,TEXT,TEXT,TEXT,TEXT,TEXT,TEXT')
en4.insert(END,'10,500,120,120,120,120,10,80')
en5.insert(END,'car3.txt')

root.mainloop()

运行结果:

未命名.GIF

以上代码在win10测试运行成功,转换成功后,会在源码目录里生成 db文件。

db文件内容如下:

未命名.GIF

对了,我源码中提到的 car3.txt的内容请回看我上一篇文章。

此文章来自:wb98.com  网站还有相关的系列课程文章,感兴趣的可以前往。

打赏 支付宝打赏 微信打赏

来源:济亨网

本文链接:http://wb86.com/post/347.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号