千纬认字app再次更新并发布正式版(增加25格、积分、计时功能)

以前见:用Beeware做一个app-CSDN博客 千纬认字app更新源代码和说明-CSDN博客

一、更新内容:增加3个表,一个是记录每题用时的表,一个是积分表,一个是app参数表,这些在app.py中都要说明。增加功能:可以变换16格到25格,需要在下一次打开app才变化。心得:在程序中设置dncs变量,就每次生成程序不要去动太多代码。PS:app更新后,我觉得如果给大家使用每次都要去授权app的读写权限,对普通人来说很困难,经过探索终于可以不用授权app的读写权限也能记忆数据库内容了,就是把数据库复制到data/data/【app包名】/的文件夹中。其实原来的数据库也在该文件夹的更深地方,但是不清楚为什么就不会保存数据,为此,我认为app可以发布正式版了,当然这个正式版只是我认为的正式版,也没有公开在应用商店发布,仅供有缘人使用。

二、上主程序:

from functools import partial
import toga
from toga.style.pack import COLUMN, LEFT, RIGHT, ROW, Pack
import sqlite3
import random
from time import time, sleep
from pathlib import Path
import miniaudio
import datetime
import threading
import shutil
#导入必要的库,其中这个miniaudio库是可以在Android上运行的,我尝试了很多播放声音的库,只有这个能被Beeware编译到安卓程序上

resources_folder = Path(__file__).joinpath("../resources/").resolve()
resources_folder1 = Path(__file__).joinpath("../resources/sy1").resolve()
resources_folder2 = Path(__file__).joinpath("../resources/sy2").resolve()
resources_folder3 = Path(__file__).joinpath("../resources/sy3").resolve()
#方便测试我这里写了个变量sjcs,1为手机,0为电脑
db_filepath = resources_folder.joinpath("qwrznew.db")
sjcs = 0
if sjcs == 1:
    sj_file = '/data/data/com.qwrz.qwrz2/qwrznew.db'
    if Path(sj_file).exists():
        db_filepath = sj_file
    else:
        shutil.copy(db_filepath, sj_file)
        db_filepath = sj_file
#使用手机将数据库存放在手机的/data/data/文件夹中,不用获取权限,减少麻烦,我以前的版本是放在文档中方便分析数据
conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
c = conn.cursor()
cursor = c.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='setupme'")
row = cursor.fetchone()
have_set = row[0]
if have_set ==0:
    c.execute('''CREATE TABLE setupme (
    have_record2 INTEGER,
    have_jfen    INTEGER,
    set_gz       INTEGER,
    g16_fs       INTEGER,
    g16_width    INTEGER,
    g16_height   INTEGER,
    g25_fs       INTEGER,
    g25_width    INTEGER,
    g25_height   INTEGER,
    app_name     TEXT);
    ''')
    conn.commit()
    c.execute("INSERT INTO setupme(app_name,g25_height,g25_width,g25_fs,g16_height,g16_width,g16_fs,set_gz,have_jfen,have_record2) VALUES ('千纬认字(积分版)',68,68,22,85,85,25,16,0,0);")
    conn.commit()
    cursor = c.execute("SELECT app_name,g25_height,g25_width,g25_fs,g16_height,g16_width,g16_fs,set_gz,have_jfen,have_record2 FROM setupme")
    row = cursor.fetchone()
    globals()['app_name'] = row[0]
    globals()['g25_height'] = row[1]
    globals()['g25_width'] = row[2]
    globals()['g25_fs'] = row[3]
    globals()['g16_height'] = row[4]
    globals()['g16_width'] = row[5]
    globals()['g16_fs'] = row[6]
    globals()['set_gz'] = row[7]
    globals()['have_jfen'] = row[8]
    globals()['have_record2'] = row[9]
else:
    cursor = c.execute("SELECT app_name,g25_height,g25_width,g25_fs,g16_height,g16_width,g16_fs,set_gz,have_jfen,have_record2 FROM setupme")
    row = cursor.fetchone()
    globals()['app_name'] = row[0]
    globals()['g25_height'] = row[1]
    globals()['g25_width'] = row[2]
    globals()['g25_fs'] = row[3]
    globals()['g16_height'] = row[4]
    globals()['g16_width'] = row[5]
    globals()['g16_fs'] = row[6]
    globals()['set_gz'] = row[7]
    globals()['have_jfen'] = row[8]
    globals()['have_record2'] = row[9]
#创建setupme表,用于记录app的有关参数,这个是以前做网站的经验,这样有利于让app多功能
if globals()['have_record2'] == 0:
    cursor = c.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='record2'")
    row = cursor.fetchone()
    have_record2a = row[0]
    if have_record2a == 0:
        c.execute('''
        CREATE TABLE record2 (
            rid INTEGER PRIMARY KEY AUTOINCREMENT,
            hid INTEGER REFERENCES hz (id),
            cid INTEGER REFERENCES record (cid),
            yt  INTEGER);
        ''')
        conn.commit()
        c.execute("update setupme set have_record2 = 1")
        conn.commit()
    else:
        c.execute("update setupme set have_record2 = 1")
        conn.commit()  
#是否存在record2表,没有就建表,并在参数表设置为1,该表用于记录答题时长
if globals()['have_jfen'] == 0:
    cursor = c.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='jfen'")
    row = cursor.fetchone()
    have_jfena = row[0]
    if have_jfena == 0:
        c.execute('''CREATE TABLE jfen (
        jid INTEGER PRIMARY KEY AUTOINCREMENT,
        rq  TEXT,
        jf  INTEGER);
        ''')
        conn.commit()
        c.execute("update setupme set have_jfen = 1")
        conn.commit()
    else:
        c.execute("update setupme set have_jfen = 1")
        conn.commit()
#是否存在jfen表,没有就建表,并在参数表设置为1,下次就不要判断是否有这个表
current_date = datetime.datetime.now()
formatted_date = current_date.strftime("%Y-%m-%d")
cursor = c.execute("SELECT count(*) FROM jfen WHERE rq='"+ formatted_date +"'")
row = cursor.fetchone()
if row[0] == 0:
    query_sql = "INSERT INTO jfen (rq,jf) VALUES (?,?);"
    c.execute(query_sql, (formatted_date,0,))
    conn.commit()
c.close()
conn.close()
#在积分表中写入今天的一行,用于记录今天的积分
global duihz, duipy, duizc1, duizc2, duizc3,duizc4,duizc5, duid, kw, jj
global stime, etime, ytime, begintime, testcs, cuo_cs, yshen, cid, tjcs
names = globals()
cid = 0
yshen = 0
testcs = 0
cuo_cs = 0
stime = time()
begintime = time()
rid = 0
cuot = 0
duid = 0
jf = 0
kn = 0
zjf = 0
global njt,njt1
njt = '一年级'
#上面是全局参数和默认值
def bfsy(hzid,idsc):
    if hzid < 1001:
        stream = miniaudio.stream_file(str(resources_folder1.joinpath(str(hzid) + '.wav')))
    elif hzid > 1000 and hzid < 2001:
        stream = miniaudio.stream_file(str(resources_folder2.joinpath(str(hzid) + '.wav')))
    elif hzid > 2000 and hzid < 3001:
        stream = miniaudio.stream_file(str(resources_folder3.joinpath(str(hzid) + '.wav')))
    elif hzid > 3000 and hzid < 4000:
        stream = miniaudio.stream_file(str(resources_folder3.joinpath('cuo.wav')))
        #大于3000为错,其余为对
    else:
        stream = miniaudio.stream_file(str(resources_folder3.joinpath('dui.wav')))
    with miniaudio.PlaybackDevice() as device:
        device.start(stream)
        sleep(idsc)
def bfsya(hzid,idsc):
    if hzid < 1001:
        stream = miniaudio.stream_file(str(resources_folder1.joinpath(str(hzid) + 'a.wav')))
    elif hzid > 1000 and hzid < 2001:
        stream = miniaudio.stream_file(str(resources_folder2.joinpath(str(hzid) + 'a.wav')))
    elif hzid > 2000 and hzid < 3001:
        stream = miniaudio.stream_file(str(resources_folder3.joinpath(str(hzid) + 'a.wav')))
    with miniaudio.PlaybackDevice() as device:
        device.start(stream)
        sleep(idsc)
#播放声音函数,bfsya是用于播放带a的wav文件
def maxmin(xzng):
    if xzng < 9:
        yshen = 0
    else:
        yshen = 1
    if xzng > 16:
        globals()['rongy'] = 1
    else:
        globals()['rongy'] = 0
    if xzng in (1,9,17):
        njt = '一年级'
        njt1 = '二年级上'
    elif xzng in (2,10,18):
        njt = '二年级'
        njt1 = '三年级上'
    elif xzng in (3,11,19):
        njt = '三年级'
        njt1 = '四年级上'
    elif xzng in (4,12,20):
        njt = '四年级'
        njt1 = '五年级上'
    elif xzng in (5,13,21):
        njt = '五年级'
        njt1 = '六年级上'
    elif xzng in (6,14,22):
        njt = '六年级'
        njt1 = '五年级'
    else:
        njt = '二年级'
        njt1 = '三年级'
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    if xzng == 15:
        query_sql = "update setupme set set_gz = 16"
        c.execute(query_sql)
        conn.commit()
    if xzng == 16:
        query_sql = "update setupme set set_gz = 25"
        c.execute(query_sql)
        conn.commit()
    #16格和25格的设置,写入setupme参数表用于下次打开        
    c.close()
    conn.close()
    return(njt,njt1,yshen)

njt,njt1,yshen = maxmin(3)
#选择年级和有声无声的函数,默认是3
def u_record(testcs,cuo_cs,etime,begintime,cid):
    if testcs > 0:
        conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
        c = conn.cursor()
        if (etime-begintime) > (testcs * 45):#每题做超过45秒,按每题45秒计算
            c.execute("UPDATE record SET ts = ?,ct = ?,mt = ? WHERE cid = ?;", (testcs,cuo_cs,45,cid))
        else:
            c.execute("UPDATE record SET ts = ?,ct = ?,mt = ? WHERE cid = ?;", (testcs,cuo_cs,int((etime-begintime) / testcs),cid))
        conn.commit()
        c.close()
        conn.close()
#记录每次的题数,错题数,每题用多少秒,每个界面用一个cid  
def u_cs1(duid):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()  
    query_sql = "update hz set cs1 = cs1 + 1 where id= ?"
    c.execute(query_sql, (str(duid),))
    conn.commit()
    c.close()
    conn.close()
def u_jfen(jf):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    current_date = datetime.datetime.now()
    formatted_date = current_date.strftime("%Y-%m-%d")
    cursor = c.execute("SELECT count(*) FROM jfen WHERE rq='"+ formatted_date +"'")
    row = cursor.fetchone()
    if row[0] ==0:
        query_sql = "INSERT INTO jfen (rq,jf) VALUES (?,?);"
        c.execute(query_sql, (formatted_date,0,))
        conn.commit()
        query_sql = "update jfen set jf = jf + ? where rq= ?"
        c.execute(query_sql, (jf,formatted_date,))
        conn.commit()
    else:
        query_sql = "update jfen set jf = jf + ? where rq= ?"
        c.execute(query_sql, (jf,formatted_date,))
        conn.commit()
    c.close()
    conn.close()
#记录这个汉字的练习次数+1
def u_cs(addcs,duid):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    query_sql = "update hz set cs = cs + ? where id= ?"
    c.execute(query_sql, (str(addcs),str(duid),))
    conn.commit()
    c.close()
    conn.close()
#为某个汉字加积分
def j_cs(addcs,duid):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    query_sql = "update hz set cs = cs - ? where id= ?"
    c.execute(query_sql, (str(addcs),str(duid),))
    conn.commit()
    c.close()
    conn.close()
#为某个汉字减少积分
def tj_cs():
    if globals()['testcs'] == 0:
        conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
        c = conn.cursor()
        query_str = 'select rq,sum(ts),sum(ct),sum(ts * mt) from record group by rq order by rq desc limit 0,4;'
        cursor = c.execute(query_str)
        rows = cursor.fetchall()
        stext3 = ""
        for row in rows:
            cursor = c.execute("SELECT avg(yt) FROM record2 where cid in (select cid from record where rq ='"+ row[0] +"') and yt < 45000;")
            row1 = cursor.fetchone()
            mt = row1[0]
            if mt == None:
                mt = 0
            stext3 += "%s:做%d题,错%d题,用%d分钟,每题%d毫秒\n" % (row[0],row[1],row[2],int(row[1]*mt/60000),mt)
        c.close()
        conn.close()
        globals()['tjcs'] = stext3
    else:
        stext3 = globals()['tjcs']
    return(stext3)
#在界面的下面显示最近4天学习总题数等信息,方便家长检查孩子的学习情况
def in_record2(hid,cid,ytime):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    query_str = 'INSERT INTO record2 (hid,cid,yt) VALUES (?,?,?);'
    c.execute(query_str,(hid,cid,ytime,))
    conn.commit()
    c.close()
    conn.close()
def set_all(njt,njt1):
    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
    c = conn.cursor()
    cursor = c.execute("SELECT round(avg(cs)) from (SELECT *,rank() over (PARTITION by hz order by id desc) as rank FROM hz where nj like '%" + njt + "%' or nj like '%" + njt1 + "%' order by cs asc) where rank = 1;")
    row = cursor.fetchone()
    csavg = row[0]
    randomi = random.randint(0, 2)
    #三种难度,1是按积分最小的练习,2是按积分在平均值以内的练习,3是随机练习
    if randomi == 0:
        globals()['kn'] = 3
        cursor = c.execute("SELECT id, hz, py, zc1, zc2, zc3, zc4, zc5, kw, cs1, sc from (SELECT *,rank() over (PARTITION by hz order by id desc) as rank FROM hz where nj like '%" + njt + "%' or nj like '%" + njt1 + "%' order by cs asc) where rank = 1 limit 0," + str(globals()['set_gz']))
    elif randomi == 1:
        globals()['kn'] = 2
        cursor = c.execute("SELECT id, hz, py, zc1, zc2, zc3, zc4, zc5, kw, cs1, sc from (SELECT *,rank() over (PARTITION by hz order by id desc) as rank FROM hz where nj like '%" + njt + "%' or nj like '%" + njt1 + "%' order by cs asc) where rank = 1 and cs <= " + str(csavg) + " ORDER BY RANDOM() LIMIT " + str(globals()['set_gz']))
    else:
        globals()['kn'] = 1
        cursor = c.execute("SELECT id, hz, py, zc1, zc2, zc3, zc4, zc5, kw, cs1, sc from (SELECT *,rank() over (PARTITION by hz order by id desc) as rank FROM hz where nj like '%" + njt + "%' or nj like '%" + njt1 + "%' order by cs asc) where rank = 1 ORDER BY RANDOM() LIMIT " + str(globals()['set_gz']))
    #print(randomi)
    rows = cursor.fetchall()
    hz = []
    py = []
    zc1 = []
    zc2 = []
    zc3 = []
    zc4 = []
    zc5 = []
    hzid = []
    kw = []
    cs1 = []
    idsc = []
    i = 1
    for row in rows:
        if i < (globals()['set_gz'] + 1):
            hzid.append(row[0])
            hz.append(row[1])
            py.append(row[2])
            zc1.append(row[3])
            zc2.append(row[4])
            zc3.append(row[5])
            zc4.append(row[6])
            zc5.append(row[7])
            kw.append(row[8])
            cs1.append(row[9])
            idsc.append(row[10])
        i = i + 1
    ii = list(range(1,(globals()['set_gz'] + 1)))
    random.shuffle(ii)
    c.close()
    conn.close()
    return ii,hzid,hz,py,zc1,zc2,zc3,zc4,zc5,kw,cs1,idsc
#按年级返回16/25个汉字的拼音组词、课文、id、答题次数和音频文件的播放长度
def build(app):
    # 定义组件
    c_box = toga.Box()
    b1_box = toga.Box()
    b2_box = toga.Box()
    b3_box = toga.Box()
    b4_box = toga.Box()
    if globals()['set_gz'] == 25:
        b5_box = toga.Box()
    box = toga.Box()
    c_input = toga.TextInput(readonly=True,style=Pack(font_size=22))
    c_label = toga.Label("请选择几年级,带括号为有声,还可以选择16或25格为下次模式", style=Pack(text_align=LEFT))
    c_label1 = toga.Label("", style=Pack(text_align=LEFT, font_size=12))
    c_label2 = toga.Label("", style=Pack(text_align=LEFT))
    c_label3 = toga.Label("", style=Pack(text_align=LEFT))
    #界面设置
    def bt1(bb, widget):
        xzng = int(bb)
        globals()['testcs'] += 1
        globals()['etime'] = time()
        globals()['ytime'] = int(etime - stime)
        yytime = int((etime - stime)*1000)
        if duid > 0 and cid > 0 and rid > 0:
            in_record2(duid,cid,yytime)
        #记录用时
        if rid == 0:
            current_date = datetime.datetime.now()
            formatted_date = current_date.strftime("%Y-%m-%d")
            formatted_time = current_date.strftime("%H:%M:%S")
            #每次rid=0时,生成一个记录,记录学习情况
            conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
            c = conn.cursor()
            c.execute("INSERT INTO record (rq,sj,ts,ct,mt) VALUES (?,?,?,?,?);", (formatted_date,formatted_time,0,0,0))
            conn.commit()
            cursor = c.execute("SELECT sum(jf) from jfen")
            row = cursor.fetchone()
            globals()['zjf'] = row[0]
            #获取总积分
            cursor = c.execute("SELECT jf from jfen order by jid desc limit 0,1")
            row = cursor.fetchone()
            globals()['jtjf'] = row[0]
            #获取今日积分
            cursor = c.execute("SELECT cid from record order by cid desc")
            row = cursor.fetchone()
            c.close()
            conn.close()
            globals()['cid'] = row[0]
            #提取cid到全局变量中
            globals()['testcs'] = 0
            #rid为0时,测试次数重计
            globals()['cuo_cs'] = 0
            #错误次数也重计
            globals()['begintime'] = time()
            #设定rid为0是的开始时间,可以计算做完16个汉字的时间
            globals()['njt'],globals()['njt1'],globals()['yshen'] = maxmin(xzng)
            #将年级和有声的变量按选择存入到全局变量
            globals()['ii'],globals()['hzid'],globals()['hz'],globals()['py'],globals()['zc1'],globals()['zc2'],globals()['zc3'],globals()['zc4'],globals()['zc5'],globals()['kw'],globals()['cs1'],globals()['idsc']=set_all(globals()['njt'],globals()['njt1'])
            #将全部要用到的变量存入全局变量
            globals()['stime'] = time()
            #设定本次开始时间
            for i in range(1,(globals()['set_gz'] + 1)):
                setattr(names['button_' + str(i)],"text",hz[ii[i-1]-1])
                #设置按键名称,即把汉字显示在按钮上,汉字通过随机错排列,这个ii就是打乱了的1到16顺序,2个-1是因为最小是0
            globals()['rid'] = 1
            #rid变为1,算第一次,答对了rid才会增加1
            globals()['duid'] = hzid[rid-1]
            #这个是对的汉字在数据库中的id
            globals()['jj'] = ii.index(rid) + 1
            #这个变量是记忆对的汉字选择的按钮的编码,index是寻址,寻找rid在ii列中的位置,这个位置+1为按钮的参数
            if yshen == 0:
                if zc2[rid-1] == '':
                    c_value = py[rid-1] + "  " + zc1[rid-1].replace(hz[rid-1],'□')
                else:
                    zc = []
                    zc.append(zc1[rid-1])
                    zc.append(zc2[rid-1])
                    c_value = py[rid-1] + " " + zc1[rid-1].replace(hz[rid-1],'□') + "、" + zc2[rid-1].replace(hz[rid-1],'□')
                    if zc3[rid-1] != '':
                        zc.append(zc3[rid-1])
                        if zc4[rid-1] != '':
                            zc.append(zc4[rid-1])
                        if zc5[rid-1] != '':
                            zc.append(zc5[rid-1])
                        zc = random.sample(zc,2)
                        c_value = py[rid-1] + " " + zc[0].replace(hz[rid-1], '□')+ "、" + zc[1].replace(hz[rid-1],'□')
            #无声是在输入栏显示拼音和隐去本字的组词,这里面采用随机数,在多个组词中随机选择2个
            c_text = '来自:' + kw[rid-1]
            #显示来自年级和课文
            c_label.text = c_text
            c_label3.text = tj_cs()
            #rid为0是,显示统计的4天学习情况
            if yshen == 0:
                c_input.value = c_value
            else:
                if zc4[rid-1] != '' and random.randint(0,1) == 0:
                    play_sound_backgrounda(hzid[rid-1],idsc[rid-1])
                else:
                    play_sound_background(hzid[rid-1],idsc[rid-1])
            #当选择有声时,用miniaudio发出声音,不使用sleep就不会播放声音,sleep的时长就是播放声音的时长,后台播放,虽然会重音但比较流畅
        #rid为0为一开始设置第一题
        else:
            text5 = ""
            if rid >=1:
                text5 = text5 + hz[rid-1] + "(" + py[rid-1] + ") " + zc1[rid-1] + " " + zc2[rid-1] + " " + zc3[rid-1] + " " + zc4[rid-1] + " " + zc5[rid-1]
            #text5是复习内容
            if testcs > 0:
                stext = '%d秒,共答%d题,错%d题,每题%d秒。' % (int(etime-begintime),testcs,cuo_cs,int((etime-begintime) / testcs))
            if xzng == globals()['jj']:
                c_label1.text = "复习:" + text5
                #回答正确才显示复习内容
                if yshen == 1:
                    c_input.value = hz[rid-1] + "√ (" + py[rid-1] + ") " + zc1[rid-1] + " " + zc2[rid-1] + " " + zc3[rid-1]
                    c_label2.text = '本轮学习' + stext
                else:
                    c_label2.text = '答对。本轮' + stext
                if cs1[rid-1] < 100:
                    jf1 = kn + int((100 - cs1[rid-1]) / 10)
                else:
                    jf1 = kn
                #如果答题次数小于100,按100-次数后除以10取整为增加积分
                if yshen ==1:
                    jf1 = jf1 - 1
                else:
                    jf1 = jf1 + 2
                #无声模式积分加2分,有声减1分
                if globals()['set_gz'] == 25:
                    jf1 = jf1 + 2
                #25格再加2分
                if ytime <= 3:
                    u_cs(4,hzid[rid-1])
                    jfen = jf1 + 4
                    u_jfen(jfen)
                    #用时小于3秒加4分
                elif ytime > 3 and ytime <= 4:
                    u_cs(3,hzid[rid-1])
                    jfen = jf1 + 3
                    u_jfen(jfen)
                    #用时小于4秒加3分
                elif ytime > 4 and ytime <= 5:
                    u_cs(2,hzid[rid-1])
                    jfen = jf1 + 2
                    u_jfen(jfen)
                    #用时小于5秒加2分
                else:
                    u_cs(1,hzid[rid-1])
                    jfen = jf1 + 1
                    u_jfen(jfen)
                    #用时大于5秒加1分
                #play_sound_background(0,1.174) 播放正确的声音
                globals()['stime'] = time()
                globals()['rid'] += 1
                #回答正确,开始下一个汉字的计时和rid
                if rid == (globals()['set_gz'] + 1):
                    if yshen != 0:
                        play_sound_background(4500,1.174)
                        sleep(1.1)
                    #切换16个字界面时,播放答对了,让孩子知道过篇了
                    u_record(testcs,cuo_cs,etime,begintime,cid)
                    current_date = datetime.datetime.now()
                    formatted_date = current_date.strftime("%Y-%m-%d")
                    formatted_time = current_date.strftime("%H:%M:%S")
                    conn = sqlite3.connect(db_filepath, timeout=10, check_same_thread=False)
                    c = conn.cursor()
                    c.execute("INSERT INTO record (rq,sj,ts,ct,mt) VALUES (?,?,?,?,?);", (formatted_date,formatted_time,0,0,0))
                    conn.commit()
                    cursor = c.execute("SELECT sum(jf) from jfen")
                    row = cursor.fetchone()
                    globals()['zjf'] = row[0]
                    cursor = c.execute("SELECT jf from jfen where rq = '" + formatted_date + "' limit 0,1")
                    row = cursor.fetchone()
                    globals()['jtjf'] = row[0]
                    cursor = c.execute("SELECT cid from record order by cid desc")
                    row = cursor.fetchone()
                    globals()['cid'] = row[0] 
                    c.close()
                    conn.close()
                    globals()['testcs'] = 0
                    globals()['cuo_cs'] = 0
                    globals()['begintime'] = time()
                    njt = globals()['njt']
                    globals()['ii'],globals()['hzid'],globals()['hz'],globals()['py'],globals()['zc1'],globals()['zc2'],globals()['zc3'],globals()['zc4'],globals()['zc5'],globals()['kw'],globals()['cs1'],globals()['idsc']=set_all(njt,globals()['njt1'])
                    globals()['stime'] = time()
                    for i in range(1,(globals()['set_gz'] + 1)):
                        setattr(names['button_' + str(i)],"text",hz[ii[i-1]-1])
                    globals()['rid'] = 1
                    #当rid等于17是,实际就是第二轮开始,初始化一些变量,重新写入cid
                globals()['duid'] = hzid[rid-1]
                globals()['jj'] = ii.index(rid) + 1
                #因为上面rid加1了,所以这2个全局变量都要变。
                if yshen == 0:
                    if zc2[rid-1] == '':
                        c_value = py[rid-1] + "  " + zc1[rid-1].replace(hz[rid-1],'□')
                    else:
                        zc = []
                        zc.append(zc1[rid-1])
                        zc.append(zc2[rid-1])
                        c_value = py[rid-1] + " " + zc1[rid-1].replace(hz[rid-1],'□') + "、" + zc2[rid-1].replace(hz[rid-1],'□')
                        if zc3[rid-1] != '':
                            zc.append(zc3[rid-1])
                            if zc4[rid-1] != '':
                                zc.append(zc4[rid-1])
                            if zc5[rid-1] != '':
                                zc.append(zc5[rid-1])
                            zc = random.sample(zc,2)
                            c_value = py[rid-1] + " " + zc[0].replace(hz[rid-1], '□')+ "、" + zc[1].replace(hz[rid-1],'□')
                if yshen == 0:
                    c_input.value = c_value
                else:
                    if zc4[rid-1] != '' and random.randint(0,1) == 0:
                        play_sound_backgrounda(hzid[rid-1],idsc[rid-1])
                    else:
                        play_sound_background(hzid[rid-1],idsc[rid-1])
            #上面为选择正确时的程序
            else:
                globals()['cuo_cs'] += 1
                c_label1.text = "提示:" + text5
                if yshen == 1:
                    c_input.value = "答错了!请重新选择!"
                    c_label2.text = '累计学习' + stext
                    play_sound_background(3500,1.325)
                    sleep(1.2)
                    #播放错误的声音,还是需要sleep,不然不会停下来
                    if zc4[rid-1] != '' and random.randint(0,1) == 0:
                        play_sound_backgrounda(hzid[rid-1],idsc[rid-1])
                    else:
                        play_sound_background(hzid[rid-1],idsc[rid-1])
                    #选择错误时的程序,重新读一遍
                else:
                    if zc2[rid-1] == '':
                        c_value = py[rid-1] + "  " + zc1[rid-1].replace(hz[rid-1],'□')
                    else:
                        zc = []
                        zc.append(zc1[rid-1])
                        zc.append(zc2[rid-1])
                        c_value = py[rid-1] + " " + zc1[rid-1].replace(hz[rid-1],'□') + "、" + zc2[rid-1].replace(hz[rid-1],'□')
                        if zc3[rid-1] != '':
                            zc.append(zc3[rid-1])
                            if zc4[rid-1] != '':
                                zc.append(zc4[rid-1])
                            if zc5[rid-1] != '':
                                zc.append(zc5[rid-1])
                            zc = random.sample(zc,2)
                            c_value = py[rid-1] + " " + zc[0].replace(hz[rid-1], '□')+ "、" + zc[1].replace(hz[rid-1],'□')
                    c_input.value = "重答:" + c_value
                    c_label2.text = '答错!累计' + stext
                j_cs(5,hzid[rid-1])
                jfen = -6
                u_jfen(jfen)
                #选择错误,扣6分
                globals()['stime'] = time()
            if jfen > 0:
                c_text = '总分:' + str(zjf) + ',今日:' + str(jtjf) + ',本题获得' + str(jfen) +'分。来自:' + kw[rid-1]
            else:
                c_text = '总分:' + str(zjf) + ',今日:' + str(jtjf) + ',本题扣' + str(abs(jfen)) +'分。来自:' + kw[rid-1]
            c_label.text = c_text
            c_label3.text = tj_cs()
        if globals()['cid'] > 0:
            u_record(testcs,cuo_cs,etime,begintime,cid)
            u_cs1(hzid[rid-1])
        #记录学习情况   
    if globals()['set_gz'] == 16:
        aaa = '一 二 三 四 五 六 无 声 ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ 16 25'.split()
        for i in range(1,17):
            names['button_' + str(i)] = toga.Button(aaa[i-1], on_press=partial(bt1, str(i)),style=Pack(font_size=25))
    else:
        aaa = '一 二 三 四 五 六 无 声 ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ 16 25 ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ 有 声 音'.split()
        for i in range(1,26):
            names['button_' + str(i)] = toga.Button(aaa[i-1], on_press=partial(bt1,str(i)),style=Pack(font_size=22))
    #用set_g参数控制16格和25格的初始界面
    # 设置组件样式和布局
    c_box.add(c_input)
    box.add(c_box)
    if globals()['set_gz'] == 16:
        for i in range(1,5):
            b1_box.add(names['button_' + str(i)])
        for i in range(5,9):
            b2_box.add(names['button_' + str(i)])
        for i in range(9,13):
            b3_box.add(names['button_' + str(i)])
        for i in range(13,17):
            b4_box.add(names['button_' + str(i)])
    else:
        for i in range(1,6):
            b1_box.add(names['button_' + str(i)])
        for i in range(6,11):
            b2_box.add(names['button_' + str(i)])
        for i in range(11,16):
            b3_box.add(names['button_' + str(i)])
        for i in range(16,21):
            b4_box.add(names['button_' + str(i)])
        for i in range(21,26):
            b5_box.add(names['button_' + str(i)])
    box.add(b1_box)
    box.add(b2_box)
    box.add(b3_box)
    box.add(b4_box)
    if globals()['set_gz'] == 25:
        box.add(b5_box)
    box.add(c_label)
    box.add(c_label1)
    box.add(c_label2)
    box.add(c_label3)
    # 设置 outer box 和 inner box 的样式
    box.style.update(direction=COLUMN, padding=5)
    b1_box.style.update(direction=ROW, padding=1)
    b2_box.style.update(direction=ROW, padding=1)
    b3_box.style.update(direction=ROW, padding=1)
    b4_box.style.update(direction=ROW, padding=1)
    if globals()['set_gz'] == 25:
        b5_box.style.update(direction=ROW, padding=1)
    c_box.style.update(direction=ROW, padding=5)

    # 设置单个组件的样式
    c_input.style.update(width=345, flex=1)

    # button.style.update(padding=15)
    c_label.style.update(width=345, padding_left=4)
    c_label1.style.update(width=345, padding_left=4)
    c_label2.style.update(width=345, padding_left=4)
    c_label3.style.update(width=345, padding_left=4)
    if globals()['set_gz'] == 16:
        for i in range(1,17):
            names['button_' + str(i)].style.update(width=85, height=85, padding=1, background_color = 'white')
    else:
        for i in range(1,26):
            names['button_' + str(i)].style.update(width=68, height=68, padding=1, background_color = 'white')
    return box
def play_sound_background(hzid,idsc):
    thread = threading.Thread(target=bfsy, args=(hzid,idsc,))
    thread.daemon = True
    thread.start()
def play_sound_backgrounda(hzid,idsc):
    thread = threading.Thread(target=bfsya, args=(hzid,idsc,))
    thread.daemon = True
    thread.start()
#用线程,在后台播放声音
def main():
    return toga.App(globals()['app_name'], "org.qwrz2", startup=build)

if __name__ == "__main__":
    main().main_loop()

三、正式版app下载:链接:https://pan.baidu.com/s/1dhgHYlG6mNTeilg11viO4w?pwd=4lrh 
提取码:4lrh

四、界面:

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值