一、上代码
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)!!!重点来了!!! !!!检测事件中的代码!!!
请务必确认您准备好了,因为代码可能会有几百行长哦
请见上方代码👆
作者写代码时还不知道捕捉错误😑
请谅解这份十分复杂的代码吧!
请点个赞呗
马上结为您献上一份 捕捉错误的超短代码!