python计算器

一、上代码 

import tkinter
from tkinter import messagebox

import pygame
import sys
from pygame.locals import *

wnd = tkinter.Tk()
wnd.withdraw()


def draw(pictrue_name, x2, y2, blit_button):
    a1 = pygame.image.load(pictrue_name + ".png")
    a2 = a1.get_rect()
    a2.x = x2
    a2.y = y2
    screen.blit(a1, a2)
    if blit_button == 'yes':
        if pictrue_name.isdigit():
            action.append([a2, int(pictrue_name), a1])
        else:
            action.append([a2, pictrue_name, a1])


def error1():
    messagebox.showinfo("ERROR  错误", "ERROR:THE HIGHEST DIGIT CANNOT BE 0\n错误:数字最高位不可为0")


def error2():
    messagebox.showinfo("ERROR  错误",
                        "ERROR:THE NUMBER FIELD IS EMPTY AND CANNOT BE DELETED\n错误:数字区为空,不可删除")


def error3():
    messagebox.showinfo("ERROR  错误",
                        "ERROR:DIVIDER CANNOT BE 0\n错误:除数不能为0")


def error4():
    messagebox.showinfo("ERROR  错误",
                        "ERROR:ARITHMETIC ERROR\n错误:算式错误")


pygame.init()
screen = pygame.display.set_mode((480, 320))
pygame.display.set_caption("计算器")
screen.fill((255, 255, 255))
action = []
a1 = pygame.image.load("宇宙背景图.png")
a2 = pygame.transform.scale(a1, (480, 320))
screen.blit(a1, (0, 0))
draw('0', 400, 0, 'no')
ii = 1
number = 0
flag = 1
anser_list = []
anser = ''
questions = []
for i in range(3):
    for j in range(3):
        draw(str(ii), j * 80, 80 + i * 80, 'yes')
        ii += 1
draw('0', 240, 80, 'yes')
draw('=', 400, 240, 'yes')
draw('AC', 400, 160, 'yes')
a1 = pygame.image.load("+.png")
a2 = a1.get_rect()
a2.x = 240
a2.y = 160
screen.blit(a1, a2)
action.append([a2, "+", a1])
pygame.display.update()
a1 = pygame.image.load("-.png")
a2 = a1.get_rect()
a2.x = 240
a2.y = 240
screen.blit(a1, a2)
action.append([a2, "-", a1])
a1 = pygame.image.load("X.png")
a2 = a1.get_rect()
a2.x = 320
a2.y = 80
screen.blit(a1, a2)
action.append([a2, "*", a1])
a1 = pygame.image.load("÷.png")
a2 = a1.get_rect()
a2.x = 320
a2.y = 160
screen.blit(a1, a2)
action.append([a2, "//", a1])
a1 = pygame.image.load("小数点.png")
a2 = a1.get_rect()
a2.x = 320
a2.y = 240
screen.blit(a1, a2)
action.append([a2, ".", a1])
draw('线', 0, 80, 'no')
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            p = pygame.mouse.get_pos()
            for sss in action:
                if sss[0].collidepoint(p):
                    for x in range(len(questions)):
                        questions[x][1] = questions[x][1].move(-80, 0)
                        screen.blit(questions[x][0], questions[x][1])
                        pygame.display.update()
                    if sss[1] == '=':
                        a1 = pygame.image.load("宇宙背景图2.png")
                        screen.blit(a1, (0, 0))
                        j = ''
                        ch = 'y'
                        d = 0
                        flag1 = 0
                        if len(anser) == 0 or (len(anser) > 1 and (not anser[0].isdigit())) or (
                                not anser[-1].isdigit()):
                            a1 = pygame.image.load("宇宙背景图2.png")
                            screen.blit(a1, (0, 0))
                            a1 = pygame.image.load("0.png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            pygame.display.update()
                            error4()
                            flag1 = 1
                        num = 0
                        for iss in anser:
                            if not iss.isdigit():
                                num += 1
                        if num == 0 and anser[-1].isdigit():
                            a1 = pygame.image.load("宇宙背景图2.png")
                            screen.blit(a1, (0, 0))
                            a1 = pygame.image.load("0.png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            pygame.display.update()
                            error4()
                            flag1 = 1
                        if flag1 != 1:
                            flag5 = 0
                            for yunsuan in anser:
                                if not yunsuan.isdigit():
                                    if len(ch) == 0:
                                        a1 = pygame.image.load("宇宙背景图2.png")
                                        screen.blit(a1, (0, 0))
                                        a1 = pygame.image.load("0.png")
                                        a2 = a1.get_rect()
                                        a2.x = 400
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                        pygame.display.update()
                                        break
                                    else:
                                        flag5 = 1
                                        ch = ''
                                        continue
                                if flag5 == 1:
                                    ch += yunsuan
                        if flag1 != 1:
                            flag6 = 0
                            for jj in anser:
                                if jj.isdigit() or jj == '.':
                                    j += jj
                                else:
                                    if len(j) > 1 and j[0] == '0' and j[1] != '.':
                                        a1 = pygame.image.load("宇宙背景图2.png")
                                        screen.blit(a1, (0, 0))
                                        a1 = pygame.image.load("0.png")
                                        a2 = a1.get_rect()
                                        a2.x = 400
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                        pygame.display.update()
                                        error1()
                                        flag1 = 1
                                        flag6 = 1
                                        break
                                    j = ''
                            if flag6 == 0:
                                if len(j) > 1 and j[0] == '0' and j[1] != '.':
                                    a1 = pygame.image.load("宇宙背景图2.png")
                                    screen.blit(a1, (0, 0))
                                    a1 = pygame.image.load("0.png")
                                    a2 = a1.get_rect()
                                    a2.x = 400
                                    a2.y = 0
                                    screen.blit(a1, a2)
                                    pygame.display.update()
                                    error1()
                                    flag1 = 1
                        if flag1 == 0:
                            flag4 = 0
                            flag3 = 0
                            ch = ''
                            for ch2 in anser:
                                if ch2 == '/':
                                    if len(ch) > 1:
                                        if ch[0] == '0' and ch[1] != '.':
                                            flag4 = 1
                                            a1 = pygame.image.load("宇宙背景图2.png")
                                            screen.blit(a1, (0, 0))
                                            a1 = pygame.image.load("0.png")
                                            a2 = a1.get_rect()
                                            a2.x = 400
                                            a2.y = 0
                                            screen.blit(a1, a2)
                                            pygame.display.update()
                                            error3()
                                            break
                                    elif ch == '0':
                                        flag4 = 1
                                        a1 = pygame.image.load("宇宙背景图2.png")
                                        screen.blit(a1, (0, 0))
                                        a1 = pygame.image.load("0.png")
                                        a2 = a1.get_rect()
                                        a2.x = 400
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                        pygame.display.update()
                                        error3()
                                        break
                                    ch = ''
                                    flag3 = 1
                                    continue
                                elif not ch2.isdigit() and ch2 != ".":
                                    flag3 = 0
                                    if ch == "0":
                                        flag4 = 1
                                        a1 = pygame.image.load("宇宙背景图2.png")
                                        screen.blit(a1, (0, 0))
                                        a1 = pygame.image.load("0.png")
                                        a2 = a1.get_rect()
                                        a2.x = 400
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                        pygame.display.update()
                                        error3()
                                if flag3 == 1:
                                    ch += ch2
                            if len(ch) > 1:
                                if ch[0] == '0' and ch[1] != '.':
                                    flag4 = 1
                                    a1 = pygame.image.load("宇宙背景图2.png")
                                    screen.blit(a1, (0, 0))
                                    a1 = pygame.image.load("0.png")
                                    a2 = a1.get_rect()
                                    a2.x = 400
                                    a2.y = 0
                                    screen.blit(a1, a2)
                                    pygame.display.update()
                                    error3()
                            elif ch == '0' and len(ch) == 1:
                                flag4 = 1
                                a1 = pygame.image.load("宇宙背景图2.png")
                                screen.blit(a1, (0, 0))
                                a1 = pygame.image.load("0.png")
                                a2 = a1.get_rect()
                                a2.x = 400
                                a2.y = 0
                                screen.blit(a1, a2)
                                pygame.display.update()
                                error3()
                            if flag4 == 0:
                                number = eval(anser)
                                if type(number) == float:
                                    floa = ''
                                    index = 0
                                    for xx in str(number):
                                        if xx == '.':
                                            floa = str(number)[index + 1:]
                                            if len(floa) > 2:
                                                number = str(number)[:index + 1]
                                                floa = floa[:2]
                                                number = float(str(number) + floa)
                                        index += 1
                                real_x = 480 - len(str(number)) * 80
                                for ssss in str(number):
                                    if ssss == '.':
                                        a1 = pygame.image.load("小数点.png")
                                        a2 = a1.get_rect()
                                        a2.x = real_x
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                    else:
                                        a1 = pygame.image.load(str(ssss) + ".png")
                                        a2 = a1.get_rect()
                                        a2.x = real_x
                                        a2.y = 0
                                        screen.blit(a1, a2)
                                    real_x += 80
                                    anser_list.append([a1, a2])
                        flag = 1
                        questions = []
                        number = 0
                        anser = ''
                    elif sss[1] == "AC":
                        a1 = pygame.image.load("宇宙背景图2.png")
                        screen.blit(a1, (0, 0))
                        a1 = pygame.image.load("0.png")
                        a2 = a1.get_rect()
                        a2.x = 400
                        a2.y = 0
                        screen.blit(a1, a2)
                        questions = []
                        number = 0
                        flag = 1
                        anser = ''
                        anser_list = []
                    else:
                        if sss[1] == '*':
                            a1 = pygame.image.load("X.png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            anser += '*'
                        elif sss[1] == '//':
                            a1 = pygame.image.load("÷.png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            anser += '/'
                        elif sss[1] == '.':
                            a1 = pygame.image.load("小数点.png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            anser += '.'
                        else:
                            if flag == 1:
                                a1 = pygame.image.load("宇宙背景图2.png")
                                screen.blit(a1, (0, 0))
                                flag = 0
                            a1 = pygame.image.load(str(sss[1]) + ".png")
                            a2 = a1.get_rect()
                            a2.x = 400
                            a2.y = 0
                            screen.blit(a1, a2)
                            anser += str(sss[1])
                        questions.append([sss[2], a2])
        if event.type == KEYDOWN:
            if event.key == 8:
                if len(questions) == 0:
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    a1 = pygame.image.load("0.png")
                    a2 = a1.get_rect()
                    a2.x = 400
                    a2.y = 0
                    screen.blit(a1, a2)
                    pygame.display.update()
                    error2()
                else:
                    questions.pop(-1)
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    for x in range(len(questions)):
                        questions[x][1] = questions[x][1].move(80, 0)
                        screen.blit(questions[x][0], questions[x][1])
                        pygame.display.update()
                    anser = anser[:len(anser) - 1]
                    if len(questions) == 0:
                        a1 = pygame.image.load("宇宙背景图2.png")
                        screen.blit(a1, (0, 0))
                        a1 = pygame.image.load("0.png")
                        a2 = a1.get_rect()
                        a2.x = 400
                        a2.y = 0
                        screen.blit(a1, a2)
                        pygame.display.update()
            elif event.key == 1073741904:
                if len(questions) != 0:
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    if len(anser_list) == 0:
                        for x in range(len(questions)):
                            questions[x][1] = questions[x][1].move(80, 0)
                            screen.blit(questions[x][0], questions[x][1])
                            pygame.display.update()
                elif len(anser_list) != 0:
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    for x in range(len(anser_list)):
                        anser_list[x][1] = anser_list[x][1].move(80, 0)
                        screen.blit(anser_list[x][0], anser_list[x][1])
                        pygame.display.update()
            elif event.key == 1073741903:
                if len(questions) != 0:
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    if len(anser_list) == 0:
                        for x in range(len(questions)):
                            questions[x][1] = questions[x][1].move(-80, 0)
                            screen.blit(questions[x][0], questions[x][1])
                            pygame.display.update()
                elif len(anser_list):
                    a1 = pygame.image.load("宇宙背景图2.png")
                    screen.blit(a1, (0, 0))
                    for x in range(len(anser_list)):
                        anser_list[x][1] = anser_list[x][1].move(-80, 0)
                        screen.blit(anser_list[x][0], anser_list[x][1])
                        pygame.display.update()
            elif event.key == 27:
                pygame.quit()
                sys.exit()
    pygame.display.update()

二、分步详解

如果你是新手,请仔细看完这篇blog:Pygame教程(非常详细)-优快云博客

(1)设置背景及数字块资源

资源请自己准备,thank you

1.导入库

你需要这些库,so:

import tkinter
from tkinter import messagebox

import pygame
import sys
from pygame.locals import *

2.初始化

你需要准备一个pygame环境,so:

pygame.init()
screen = pygame.display.set_mode((480, 320))
pygame.display.set_caption("计算器")
screen.fill((255, 255, 255))
action = []
a1 = pygame.image.load("宇宙背景图.png")
a2 = pygame.transform.scale(a1, (480, 320))
screen.blit(a1, (0, 0))

3.填加数字块

你需要绘制出每个角色,so:

def draw(pictrue_name, x2, y2, blit_button):#定义一个绘图的函数
    a1 = pygame.image.load(pictrue_name + ".png")
    a2 = a1.get_rect()
    a2.x = x2
    a2.y = y2
    screen.blit(a1, a2)
    if blit_button == 'yes':
        if pictrue_name.isdigit():
            action.append([a2, int(pictrue_name), a1])#action这些列表可以暂时放一放,稍后再讲
        else:
            action.append([a2, pictrue_name, a1])

剩下的只要不断用这个函数。

Tip:如果你又不知道的参数,如blit_botton,还是放一放。

段总结

import tkinter
from tkinter import messagebox

import pygame
import sys
from pygame.locals import *

wnd = tkinter.Tk()
wnd.withdraw()


def draw(pictrue_name, x2, y2, blit_button):
    a1 = pygame.image.load(pictrue_name + ".png")
    a2 = a1.get_rect()
    a2.x = x2
    a2.y = y2
    screen.blit(a1, a2)
    if blit_button == 'yes':
        if pictrue_name.isdigit():
            action.append([a2, int(pictrue_name), a1])
        else:
            action.append([a2, pictrue_name, a1])



pygame.init()
screen = pygame.display.set_mode((480, 320))
pygame.display.set_caption("计算器")
screen.fill((255, 255, 255))
action = []
a1 = pygame.image.load("宇宙背景图.png")
a2 = pygame.transform.scale(a1, (480, 320))
screen.blit(a1, (0, 0))
#......

(2)进入主循环

1.创建循环

很easy,来一个while,so:

while True:

2.加入亿点点python指令

也很easy,so:

while True:
    for event in pygame.event.get():#检测事件
        
    pygame.display.update()#更新

​

段总结

while True:
    for event in pygame.event.get():#检测事件
        
    pygame.display.update()#更新

​

(3)!!!重点来了!!! !!!检测事件中的代码!!!

请务必确认您准备好了,因为代码可能会有几百行长哦

请见上方代码👆


作者写代码时还不知道捕捉错误😑

请谅解这份十分复杂的代码吧!


请点个赞呗

马上结为您献上一份 捕捉错误的超短代码!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值