guozi6

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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_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='purple', 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='pink',
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="yellow", 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()
posted on 2024-03-26 18:05  汀幻  阅读(2)  评论(0编辑  收藏  举报