6.1打卡
python电子算盘
from random import randint
from tkinter import *
import tkinter.messagebox as msgbox
from PIL import Image, ImageDraw, ImageTk
# 初始化主窗口
root = Tk()
root.title("电子算盘") # 窗口标题
canvas = Canvas(root, width=1200, height=720, bg='ivory') # 创建画布
canvas.pack() # 显示画布
# 创建左侧框
canvas.create_rectangle(30, 30, 520, 190, width=3)
canvas.create_rectangle(30, 190, 520, 570, width=3)
# 加载珠子的图片
bead_image = PhotoImage(file="hei.png")
bead_image_lower = PhotoImage(file="hei.png")
# 初始化按钮和变量
upper_beads = [Button() for _ in range(5)] # 上珠按钮
lower_beads = [[Button() for _ in range(5)] for _ in range(4)] # 下珠按钮
lower_values = [[0 for _ in range(5)] for _ in range(4)] # 下珠对应的数值
upper_values = [0 for _ in range(5)] # 上珠对应的数值
counter = 0
start_button = Button() # 启动按钮
submit_button = Button() # 确定按钮
equation_label = Label() # 显示算式
answer_label = Label(width=50, height=7) # 显示答题情况
username_entry = Entry() # 用户名输入框
previous_result_label = Label(width=50, height=4) # 显示上一题正确答案
timer_label = Label(root, bg='yellow', fg='blue', height=5, width=25, font='宋体 10 bold') # 计时器
correct_count = 0 # 正确题目计数
incorrect_count = 0 # 错误题目计数
score = 0 # 总得分
current_answer = 0 # 当前题目答案
current_equation = "" # 当前题目
# 计时器功能
def run_timer(timer_label, second):
def update_timer():
global counter
if second == 1:
counter += 1
timer_label.config(text="计时器:" + str(counter))
timer_label.after(1000, update_timer)
update_timer()
# 计算算盘的总和
def calculate_total(lower_values, upper_values):
total = 0
for row in lower_values:
for value in row:
total += value
for value in upper_values:
total += value
return total
# 生成随机算式
def generate_equation():
answer = 0
operator = ""
num1 = 0
num2 = 0
operation_type = randint(1, 2)
if operation_type == 1: # 加法
while True:
num1 = randint(0, 99999)
num2 = randint(0, 99999)
if num1 + num2 <= 99999:
break
answer = num1 + num2
operator = "+"
elif operation_type == 2: # 减法
while True:
num1 = randint(0, 99999)
num2 = randint(0, 99999)
if num1 - num2 > 0:
break
answer = num1 - num2
operator = "-"
equation = f"{num1} {operator} {num2}"
return equation, answer
# 鼠标右键点击事件
def handle_right_click(event):
widget = event.widget
for i in range(5):
if widget == upper_beads[i]:
upper_beads[i].place(x=40 + 100 * i, y=50 + 70)
upper_values[i] = 0
update_current_number()
for i in range(4):
for j in range(5):
if widget == lower_beads[i][j]:
for k in range(i, 4):
lower_beads[k][j].place(x=40 + 100 * j, y=210 + 70 * (k + 1))
lower_values[k][j] = 0
update_current_number()
# 鼠标左键点击事件
def handle_left_click(event):
widget = event.widget
for i in range(5):
if widget == upper_beads[i]:
upper_beads[i].place(x=40 + 100 * i, y=50)
upper_values[i] = 10 ** (4 - i) * 5
update_current_number()
for i in range(4):
for j in range(5):
if widget == lower_beads[i][j]:
for k in range(i + 1):
lower_beads[k][j].place(x=40 + 100 * j, y=210 + 70 * k)
lower_values[k][j] = 10 ** (4 - j)
update_current_number()
# 更新当前显示的数字
def update_current_number():
current_number = calculate_total(lower_values, upper_values)
label = Label(root, text="当前数字:" + str(current_number), width=30, height=4)
label.place(x=780, y=30)
# 开始测试
def start_test():
global username_entry, equation_label, submit_button, current_answer, timer_label, current_equation
start_button.place_forget()
timer_label.place(x=540, y=30)
run_timer(timer_label, 1)
Label(root, text="用户名", bg="ivory").place(x=540, y=150)
username_entry = Entry(root, font=('Arial', 14))
username_entry.place(x=580, y=150)
current_equation, current_answer = generate_equation()
equation_label = Label(root, text=current_equation, width=40, height=4)
equation_label.place(x=540, y=200)
submit_button = Button(root, text="确定", command=evaluate_answer, width=10, height=3)
submit_button.place(x=850, y=200)
# 评估答案
def evaluate_answer():
global correct_count, incorrect_count, score, current_equation, current_answer
if correct_count + incorrect_count == 5:
msgbox.showinfo('温馨提示', '恭喜您已做完所有题目!!!')
answer_label["text"] = f"用户名:{username_entry.get()}\n已答题数:{correct_count + incorrect_count}\n做对题数:{correct_count}\n做错题数:{incorrect_count}\n测试时长:{counter}s\n测试成绩:{score}\n答题完毕!!!"
answer_label.place(x=540, y=400)
else:
current_number = calculate_total(lower_values, upper_values)
if current_number == current_answer:
correct_count += 1
score += 20
else:
incorrect_count += 1
answer_label["text"] = f"总题数:5\n已答题数:{correct_count + incorrect_count}\n已做对题数:{correct_count}\n做错题数:{incorrect_count}\n得分:{score}"
answer_label.place(x=540, y=400)
previous_equation = current_equation
previous_answer = current_answer
current_equation, current_answer = generate_equation()
previous_result_label["text"] = f"上一题题目:{previous_equation}\n上一题正确答案:{previous_answer}"
equation_label["text"] = current_equation
previous_result_label.place(x=540, y=300)
# 初始化上珠按钮
for i in range(5):
upper_beads[i] = Button(root, image=bead_image)
upper_beads[i].bind("<Button-1>", handle_left_click)
upper_beads[i].bind("<Button-3>", handle_right_click)
upper_beads[i]["bg"] = "ivory"
upper_beads[i]["border"] = "0"
upper_beads[i].place(x=40 + 100 * i, y=50 + 70)
# 初始化下珠按钮
for i in range(4):
for j in range(5):
lower_beads[i][j] = Button(root, image=bead_image_lower)
lower_beads[i][j].bind("<Button-1>", handle_left_click)
lower_beads[i][j].bind("<Button-3>", handle_right_click)
lower_beads[i][j]["bg"] = "ivory"
lower_beads[i][j]["border"] = "0"
lower_beads[i][j].place(x=40 + 100 * j, y=210 + 70 * (i + 1))
# 启动测试按钮
start_button = Button(root, text="启动测试", command=start_test, width=50, height=10)
start_button.place(x=600, y=100)
# 绘制人脸自画像
def draw_face(canvas):
face_width = 300
face_height = 200
face_x0 = 600
face_y0 = 410
eye_radius = 10
eye_distance = 60
eye_y_offset = 50
mouth_width = 100
mouth_height = 50
mouth_y_offset = 140
# 画脸部椭圆
canvas.create_oval(face_x0, face_y0, face_x0 + face_width, face_y0 + face_height, width=2)
# 画左眼
canvas.create_oval(face_x0 + eye_distance, face_y0 + eye_y_offset, face_x0 + eye_distance + eye_radius * 2, face_y0 + eye_y_offset + eye_radius * 2, width=2)
# 画右眼
canvas.create_oval(face_x0 + face_width - eye_distance - eye_radius * 2, face_y0 + eye_y_offset, face_x0 + face_width - eye_distance, face_y0 + eye_y_offset + eye_radius * 2, width=2)
# 画嘴巴
canvas.create_arc(face_x0 + face_width / 2 - mouth_width / 2, face_y0 + mouth_y_offset, face_x0 + face_width / 2 + mouth_width / 2, face_y0 + mouth_y_offset + mouth_height, start=0, extent=-180, style=ARC, width=2)
draw_face(canvas)
root.mainloop()
浙公网安备 33010602011771号