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()

posted @ 2024-06-01 10:57  aallofitisst  阅读(11)  评论(0)    收藏  举报