豆虫 发表于 2024-11-9 12:42

Python之Tkinter问题请教。

# -*- coding: UTF-8 -*- //字符编码
import tkinter as tk
import sqlite3
import random
import subprocess
dbname='F:\棋谱类\chess.db'
conn=sqlite3.connect(dbname)
cursor=conn.cursor()
def count():
    # 统计未练习数量
    cursor.execute("SELECT COUNT(*) FROM shuju WHERE lianxi < ? and cuowu < ?",(3,3))
    # 获取结果
    rows_count = cursor.fetchone()
    print(f"Number of rows: {rows_count}")
    return rows_count
def shuji():
    # 生成一个随机数
    shulian=count()
    random.seed(shulian)
    num = random.randint(1, shulian)# 随机数
    return num
def lianxi():
    # 查询没练习的局面
    num=shuji()
    row=cursor.execute('SELECT id,chengxu,qipu,lianxi, cuowu FROM shuju WHERE id=? and lianxi < ? or cuowu != ?', (num,3,0))
    rows=cursor.fetchone()#取第一条记录
    print("数据 ",rows)

    return rows

def nextone():
    lujing=lianxi()
    # print(lujing)
    exe = f"{lujing}"
    path = f"{lujing}"
    subprocess.Popen()
def cuowu():
    #提交错误局面
    num=shuji()
    # print(type(num))
    # print("随机数",num)
    cuo=cursor.execute("UPDATE shuju SET cuowu = cuowu+1 WHERE id=?",(num))
    rows = cursor.fetchone()# 取第一条记录
    print("当前id",rows)
    print("错误次数",rows)
# 提交事物
conn.commit()

打谱=tk.Tk()
打谱.title("象棋布局记忆辅助")
打谱.geometry('150x150-50+50')
tk.Button(打谱,text='错误',font=('黑体',15),width=8,command=cuowu).place(x=10,y=30)
tk.Button(打谱,text='下一局',font=('黑体',15),width=8,command=nextone).place(x=10,y=100)
打谱.mainloop()
# 关闭连接
cursor.close()
conn.close()



-----------图片显示-----------------------
https://rs.wzznft.com/i/2024/11/09/k87tq1.png


----------------------问题描述---------------------------------

1,cuo=cursor.execute("UPDATE shuju SET cuowu = cuowu+1 WHERE id=?",(num))
   这句SQL代码没写对,报错。
这句代码的意思是执行一次,往shuju表中的cuowu字段的值累加1,默认值是0.

2,随机数问题:
如果加这个random.seed(shulian),如果加上这个,点击下一局和错误,得到的随机数是一样的,但再次点击,随机数不会变.
如果不加random.seed(shulian),两个按钮得到的随机数不相同。


3,要实现功能:
点击下一局,从数据表中随机取出一条数据,如果错误,点击错按钮,往数据表的cuowu字段值累加1,点击正确按钮,往数据表的lianxi字段值累加1(这个功能还没写到)


问题核心,什么让三个或四个按钮同时传入的随机数是同步的,谢谢各位大虾。麻烦花点时间帮忙解决一下。

Forgetten 发表于 2024-11-9 12:42





index_list =
def shuji():
    # 生成一个随机数
    shulian=count()
    num = random.randint(1, shulian)# 随机数
    index_list = num

在用 随机数的时候直接调用 num = index_list就行,这样只要你不再次调用def shuji():函数,
每次获得的随机数都是同一个数

豆虫 发表于 2024-11-9 12:51

或者说,指定一个数,如果它发生运行改变的话,什么在其他函数中去同步调用这个数。
像Tkinter的这个Button,定义的函数不用实例化就能使用,搞不懂。

Forgetten 发表于 2024-11-9 13:53

给个思路吧
1.先从chess.db读取条数
2.生成随机数作为当前条目的索引值,
3.根据2的索引值去数据库取该索引的数据,如果该索引不存在,则回到2
4.若正确或错误,根据索引修改对应的数据
5.点击下一步 回到2

豆虫 发表于 2024-11-9 14:03

Forgetten 发表于 2024-11-9 13:53
给个思路吧
1.先从chess.db读取条数
2.生成随机数作为当前条目的索引值,


这个代码就是实现你说的第二步

def count():
    # 统计未练习数量
    cursor.execute("SELECT COUNT(*) FROM shuju WHERE lianxi < ? and cuowu < ?",(3,3))
    # 获取结果
    rows_count = cursor.fetchone()
    print(f"Number of rows: {rows_count}")
    return rows_count
def shuji():
    # 生成一个随机数
    shulian=count()
    random.seed(shulian)
    num = random.randint(1, shulian)# 随机数
    return num

豆虫 发表于 2024-11-9 14:54

Forgetten 发表于 2024-11-9 14:11
index_list =
def shuji():
    # 生成一个随机数


# -*- coding: UTF-8 -*- //字符编码
import tkinter as tk
import random

index_list =
def shuji():
    # 生成一个随机数
    num = random.randint(1, 3610)# 随机数
    global index_list
    index_list = num
# 在用 随机数的时候直接调用 num = index_list就行,这样只要你不再次调用def shuji():函数,
# 每次获得的随机数都是同一个数
shuji()
def cuowu():
    global index_list
    num=index_list
    print("错误按钮随机数",num)

def play():
    global index_list
    num = index_list
    print("开始按钮随机数", num)

def next():
    shuji()
    global index_list
    num = index_list
    print("刷新按钮随机数", num)



打谱=tk.Tk()
打谱.title("象棋布局记忆辅助")
打谱.geometry('150x150-50+50')
tk.Button(打谱,text='开始',font=('黑体',15),width=8,command=play).place(x=10,y=30)
tk.Button(打谱,text='错误',font=('黑体',15),width=8,command=cuowu).place(x=10,y=65)
tk.Button(打谱,text='刷新',font=('黑体',15),width=8,command=next).place(x=10,y=100)

打谱.mainloop()


经测试,此代码可行,谢谢!!!
还有一个sqlite数据库更新字段的sql代码帮我看一下,写法是否有误,谢谢了
cuo=cursor.execute("UPDATE shuju SET cuowu = cuowu+1 WHERE id=?",(num))

豆虫 发表于 2024-11-9 14:59

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
File "F:\象棋程序\网友解答测试.py", line 21, in cuowu
    cuo = cursor.execute("UPDATE shuju SET cuowu = cuowu+1 WHERE id=?", (num))
ValueError: parameters are of unsupported type
报错信息

豆虫 发表于 2024-11-9 15:06

CREATE TABLE "shuju" (
        "id"        INTEGER NOT NULL UNIQUE,
        "chengxu"        TEXT NOT NULL,
        "qipu"        TEXT,
        "lianxi"        INTEGER,
        "cuowu"        INTEGER,
        PRIMARY KEY("id" AUTOINCREMENT)
);


数据表信息.

Maxhaha 发表于 2024-11-9 15:07

你update为啥要执行fetchone啊   那个是查询语句   得要 cursor.commit()提交保存   不能执行查询   至于你这个最后面的报错信息   你看下你的第21号   或者把现在的代码发一下   看具体一点的

豆虫 发表于 2024-11-9 15:10

Maxhaha 发表于 2024-11-9 15:07
你update为啥要执行fetchone啊   那个是查询语句   得要 cursor.commit()提交保存   不能执行查询   至于你 ...

# -*- coding: UTF-8 -*- //字符编码
import tkinter as tk
import random
import sqlite3
dbname='F:\棋谱类\chess.db'
conn=sqlite3.connect(dbname)
cursor=conn.cursor()
index_list =
def shuji():
    # 生成一个随机数
    num = random.randint(1, 3610)# 随机数
    global index_list
    index_list = num
# 在用 随机数的时候直接调用 num = index_list就行,这样只要你不再次调用def shuji():函数,
# 每次获得的随机数都是同一个数
shuji()
def cuowu():
    global index_list
    num=index_list
    print("错误按钮随机数",num)
    # num=int(num)
    cuo = cursor.execute("UPDATE shuju SET cuowu = cuowu+1 WHERE id=?", (num))
    conn.commit()
    print(cuo)
    rows = cursor.fetchone()# 取第一条记录
    print("当前id",rows)
    print("错误次数",rows)
def play():
    global index_list
    num = index_list
    print("开始按钮随机数", num)

def next():
    shuji()
    global index_list
    num = index_list
    print("刷新按钮随机数", num)



打谱=tk.Tk()
打谱.title("象棋布局记忆辅助")
打谱.geometry('150x150-50+50')
tk.Button(打谱,text='开始',font=('黑体',15),width=8,command=play).place(x=10,y=30)
tk.Button(打谱,text='错误',font=('黑体',15),width=8,command=cuowu).place(x=10,y=65)
tk.Button(打谱,text='刷新',font=('黑体',15),width=8,command=next).place(x=10,y=100)

打谱.mainloop()
页: [1] 2
查看完整版本: Python之Tkinter问题请教。