當前位置:首頁 ? 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://www.chinaengraver.com/post/347.html

    << 上一篇 下一篇 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放