周四的乒乓球课一直在练习 至少没有像打比赛那样累 过的挺快的
下午在宿舍睡醒以后继续整理实验和作业
完成了珠算测试器的实验
from tkinter import * import tkinter.messagebox as msg from random import randint def initWindow(): rect = canvas.create_rectangle(25, 40, 450, 400, width=3) # 算盘边框 x0, y0, x1, y1 = 0, 0, 0, 0 for i in range(5): # 生成串算珠的线 line_shu = canvas.create_line(70 + x0, 40 + y0, 70 + x1, 400 + y1, width=3) x0 += 80 x1 += 80 line_fenge = canvas.create_line(25, 100, 450, 100, width=3) # 生成上下珠的分割线 x0, y0, x1, y1 = 0, 0, 0, 0 for i in range(5): # 生成5个上珠 top_oval\[i\] = canvas.create_oval(40 + x0, 60 + y0, 100 + x1, 90 + y1, fill='orange', tags=f"top{i}") x0 += 80 x1 += 80 x0, y0, x1, y1 = 0, 0, 0, 0 for i in range(4): # 生成4*5个下珠 for j in range(5): below_oval\[i\]\[j\] = canvas.create_oval(40 + x0, 160 + y0, 100 + x1, 190 + y1, fill='yellow', tags=f"below{i}{j}") chushi\[i\]\[j\] = canvas.coords(below_oval\[i\]\[j\]) x0 += 80 x1 += 80 x0 = 0 x1 = 0 y0 += 60 y1 += 60 global start_button, label_sum, username, entry_username, username_text, window_showusername global label_time, window_time, window_question global var_username, var_question, var_msg, window_answer, window_msg sum = Label(window, width=20, height=2, bg="grey", textvariable=var, font=('Arial', 14)) label_sum = canvas.create_window(750, 80, window=sum, anchor=NE) canvas.itemconfigure(label_sum, state="hidden") button = Button(window, width=30, height=4, bg="grey", text="开始测试吧!", command=adjust) start_button = canvas.create_window(750, 300, window=button, anchor=NE) text = Label(window, text="用户名:", width=10, height=2, bg="white") username_text = canvas.create_window(500, 200, window=text, anchor=CENTER) username = Entry(window, font=('Arial', 14)) entry_username = canvas.create_window(640, 200, window=username, anchor=CENTER) label_showusername = Label(window, textvariable=var_username, width=15, height=2, bg="grey", font=('Arial', 14)) window_showusername = canvas.create_window(770, 0, window=label_showusername, anchor=NE) canvas.itemconfigure(window_showusername, state="hidden") label_time = Label(window, width=10, height=2, bg="grey", font=('Arial', 14)) window_time = canvas.create_window(600, 0, window=label_time, anchor=NE) canvas.itemconfigure(window_time, state="hidden") label_question = Label(window, width=30, height=2, bg="grey", font=('Arial', 14), textvariable=var_question) window_question = canvas.create_window(630, 180, window=label_question, anchor=CENTER) canvas.itemconfigure(window_question, state="hidden") answer_button = Button(window, width=10, height=2, bg="grey", text="提交答案", command=judge, font=('Arial', 14)) window_answer = canvas.create_window(630, 400, window=answer_button, anchor=CENTER) canvas.itemconfigure(window_answer, state="hidden") msg_label = Label(window, width=30, height=6, bg="grey", font=('Arial', 14), textvariable=var_msg) window_msg = canvas.create_window(630, 260, window=msg_label, anchor=CENTER) canvas.itemconfigure(window_msg, state="hidden") def run_time(target): def counting(): global time time += 1 global li print(li) if li != 5: target.config(text=f"所用时间:{str(time)}s") else: target.config(text="游戏结束") target.after(1000, counting) # 间隔1000毫秒再次执行counting函数 counting() def adjust(): global ques, li, true, false, all_username myusername = username.get() all_username = myusername if myusername != "": """对画布中的部件进行一些调整""" for i in range(5): ques\[i\] = get_question() canvas.itemconfigure(label_sum, state="normal") canvas.itemconfigure(window_showusername, state="normal") canvas.itemconfigure(window_time, state="normal") canvas.itemconfigure(window_question, state="normal") canvas.itemconfigure(window_answer, state="normal") canvas.itemconfigure(window_msg, state="normal") var_question.set(f"问题:{ques\[0\]\[0\]}") run_time(label_time) var_username.set(f"用户名:{myusername}") sum = get_sum() var.set(f"当前数值:{sum}") var_msg.set(f"总题数:5\\n已经做了0题\\n已做对0题\\n已做错0题") canvas.itemconfigure(start_button, state="hidden") canvas.itemconfigure(entry_username, state="hidden") canvas.itemconfigure(username_text, state="hidden") else: msg.showinfo("错误", "用户名不能为空白") def judge(): def next(): var_question.set(f"问题:{ques\[li\]\[0\]}") global li, false, true sum = get_sum() myanw[li][0] = ques[li][0] myanw[li][1] = sum if sum == int(ques[li][1]): true += 1 msg.showinfo("答案正确", f"恭喜你做对了") else: false += 1 msg.showinfo("答案错误", f"做错了!正确答案是{ques\[li\]\[1\]}") li += 1 var_msg.set(f"总题数:5\n已经做了{li}题\n已做对{true}题\n已做错{false}题") if li != 5: next() else: msg.showinfo("游戏结束", f"以下是你的战绩\\n总题数:5\\n总用时:{time}s\\n总成绩:{true \* 20}分\\n做对了{true}题\\n做错了{false}题") msg.showinfo("游戏结束", f"{all_username},你好\\n以下是你的答题明细\\n总题数:5\\n1.{myanw\[0\]\[0\]}={myanw\[0\]\[1\]}\\n" f"2.{myanw\[1\]\[0\]}={myanw\[1\]\[1\]}\\n3.{myanw\[2\]\[0\]}={myanw\[2\]\[1\]}\\n" f"4.{myanw\[3\]\[0\]}={myanw\[3\]\[1\]}\\n5.{myanw\[4\]\[0\]}={myanw\[4\]\[1\]}\\n") exit() def get_question(): answer, num1, num2 = 0, 0, 0 operator = "" temp = randint(1, 2) if temp == 1: while 1: num1 = randint(0, 99999) num2 = randint(0, 99999) if num1 + num2 <= 99999: break answer = num1 + num2 operator = "+" elif temp == 2: while 1: num1 = randint(0, 99999) num2 = randint(0, 99999) if num1 - num2 > 0: break answer = num1 - num2 operator = "-" equation = str(num1) + operator + str(num2) return equation, answer def get_sum(): sum = 0 temp = 5 for i in range(5): temp -= 1 if num2\[i\] == 1: sum += 10 \*\* temp \* 5 temp = 5 for j in range(5): temp -= 1 for i in range(4): if num\[i\]\[j\] == 1: sum += 10 \*\* temp return sum def bind(): def handler_adaptor(handler, fun, row, col): """事件处理函数的适配器,相当于中介,可以帮助tag_bind函数传递参数""" return lambda event, handler=handler, fun=fun, col=col, row=row: handler(event=event, fun=fun, row=row, col=col) def handler_adaptor2(handler2, fun, row): """事件处理函数的适配器,相当于中介,可以帮助tag_bind函数传递参数""" return lambda event, handler2=handler2, fun=fun, row=row: handler2(event=event, fun=fun, row=row) def handler(event, fun, row, col): """下珠上划""" content = fun # 这个就是被点击的算珠id if row == 0: if float(canvas.coords(content)\[1\]) - 40 >= 100 and num\[row\]\[col\] == 0: canvas.move(content, 0, -40) num\[row\]\[col\] = 1 else: if num\[row - 1\]\[col\] == 1: if float(canvas.coords(content)\[1\]) - 40 >= 110 + 10 \* (row + 1) and num\[row\]\[col\] == 0: canvas.move(content, 0, -40) num\[row\]\[col\] = 1 sum = get_sum() var.set(f"当前数值:{sum}") def handler2(event, fun, row): """上珠上划""" content = fun # 这个就是被点击的算珠id if float(canvas.coords(content)\[1\]) - 20 >= 40: canvas.move(content, 0, -20) num2\[row\] = 1 sum = get_sum() var.set(f"当前数值:{sum}") def handler3(event, fun, row, col): """下珠下划""" content = fun # 这个就是被点击的算珠id if row == 3: if num\[row\]\[col\] == 1: canvas.move(content, 0, 40) num\[row\]\[col\] = 0 else: if num\[row + 1\]\[col\] == 0 and num\[row\]\[col\] == 1: canvas.move(content, 0, 40) num\[row\]\[col\] = 0 sum = get_sum() var.set(f"当前数值:{sum}") def handler4(event, fun, row): """上珠下划""" content = fun # 这个就是被点击的算珠id if float(canvas.coords(content)\[1\]) + 20 <= 60: canvas.move(content, 0, 20) num2\[row\] = 0 sum = get_sum() var.set(f"当前数值:{sum}") for i in range(5): canvas.tag_bind(top_oval\[i\], "<Button-1>", handler_adaptor2(handler2, fun=top_oval\[i\], row=i)) canvas.tag_bind(top_oval\[i\], "<Button-3>", handler_adaptor2(handler4, fun=top_oval\[i\], row=i)) for i in range(4): for j in range(5): canvas.tag_bind(below_oval\[i\]\[j\], "<Button-1>", handler_adaptor(handler, fun=below_oval\[i\]\[j\], row=i, col=j)) canvas.tag_bind(below_oval\[i\]\[j\], "<Button-3>", handler_adaptor(handler3, fun=below_oval\[i\]\[j\], row=i, col=j)) if _name_ == "_main_": window = Tk() window.title("电子算盘") window.geometry("800x500") canvas = Canvas(window, width="800", height="500", bg="white") canvas.pack() ques = [0 for i in range(5)] myanw = [[0, 0]for i in range(5)] li = 0 time, true, false = 0, 0, 0 start_button, label_sum, username, entry_username = 0, 0, 0, 0 username_text, window_showusername, window_time = 0, 0, 0 label_time, window_question, window_answer = 0, 0, 0 all_username = "" window_msg = 0 var = StringVar() var_username = StringVar() var_question = StringVar() var_msg = StringVar() top_oval = [int for i in range(5)] # 定义列表存储5个上珠 below_oval = [[int for i in range(5)] for i in range(4)] # 定义列表存储4*5个下珠 chushi = [[0 for j in range(5)] for i in range(4)] # 所有下珠的初始坐标 num = [[0 for i in range(5)] for j in range(4)] # 4*5个下珠分别是否被拨动 num2 = [0 for i in range(5)] # 五个上珠分别是否被拨动 initWindow() bind() window.mainloop()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律