问题遇到的现象和发生背景
pygame模块,在游戏循环中调用前面循环中的file_name变量,但是%s后被认为file_name是字符串
问题相关代码,请勿粘贴截图
#导入pygame,os,sys,random模块
import pygame,os,sys,random
#初始化pygame
pygame.init()
#创建国语学习窗口
guoyuxuexi = pygame.display.set_mode((800,800))
#设置国语学习窗口标题
pygame.display.set_caption(r'国语学习')
#创建开始界面画布
kaishi = pygame.Surface(guoyuxuexi.get_size())
#创建学习界面画布
xuexi = pygame.Surface(guoyuxuexi.get_size())
kaishi = kaishi.convert()
xuexi = xuexi.convert()
#开始界面画布颜色填充
kaishi.fill((255,255,255))
#学习界面画布颜色填充
xuexi.fill((255,255,255))
def jiazaitupian():
tupian_list = os.listdir(r'国语学习图片\水果')
print(tupian_list)
i = [1,2,3,4,5,6]
x = [0,0,0,600,600,600]
y = [0,250,500,0,250,500]
for fruit,j,x,y in zip(tupian_list,i,x,y):
print(fruit)
exec("pic%s = pygame.image.load(r'%s').convert_alpha()" % (j,fruit))
exec("pic%s = pygame.transform.scale(pic%s,(200,200))" % (j,j))
exec("global pic%s_rect" % (j))
exec("pic%s_rect = pic%s.get_rect()" % (j,j))
exec("xuexi.blit(pic%s,(%s,%s))" % (j,x,y))
#分离路径和文件名
exec("file_path = '%s'" % fruit)
exec("(filepath,tempfilename) = os.path.split(file_path)")
#区分文件名字和后缀
exec("global filename")
exec("(filename,extension) = os.path.splitext(tempfilename)")
#打印文件名(去除后缀)
exec("print(filename)")
初始化混音器
pygame.mixer.init()
music_list = os.listdir(r'.\国语学习音频\水果')
print(music_list)
#获取列表长度
music_number = len(music_list)
def jiazaishengyin():
for i in range(1):
global music_id
music_id = random.randint(0,music_number)
print(music_id)
global id
id = music_id % music_number
pygame.mixer.music.load(r'.\国语学习音频\水果%s' % music_list[id])
pygame.mixer.music.set_volume(0.2)
pygame.mixer.music.play(loops=1)
jiazaitupian()
exec("file_path = '%s'" % music_list[id])
exec("(filepath,tempfilename) = os.path.split(file_path)")
exec("(file_name,extension) = os.path.splitext(tempfilename)")
exec("global file_name")
exec("print(file_name)")
kaishiyouxitu = pygame.image.load(r'开始游戏.png').convert_alpha()
kaishiyouxitu = pygame.transform.scale(kaishiyouxitu,(600,200))
kaishiyouxi = kaishiyouxitu.get_rect()
fayintu = pygame.image.load(r'发音.png').convert_alpha()
fayintu = pygame.transform.scale(fayintu,(300,200))
fayin = fayintu.get_rect()
#设置字体属性
font = pygame.font.SysFont('华文仿宋',40)
#开始界面循环
n1 = True
while n1:
#计时器,设置帧率
pygame.time.Clock().tick(60)
#开始界面鼠标检测结构
buttons = pygame.mouse.get_pressed()
x1,y1 = pygame.mouse.get_pos()
if x1 >=300 and x1 <= 500 and y1 >= 600 and y1 <= 800 and event.type == pygame.MOUSEBUTTONDOWN:
guoyuxuexi.blit(xuexi,(0,0))
if buttons[0]:
n1 = False
else:
guoyuxuexi.blit(kaishi,(0,0))
#遍历事件列表
for event in pygame.event.get():
#退出程序
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
kaishi.blit(kaishiyouxitu,(290,550))
youxishuoming1 = font.render('听语音点击对应图片', True, (0,0,0))
youxishuoming2 = font.render('若选择正确得10分,若错误扣10分', True, (0,0,0))
youxishuoming3 = font.render('玩法说明:',True,(0,0,0))
kaishi.blit(youxishuoming1,(220,230))
kaishi.blit(youxishuoming2,(100,400))
kaishi.blit(youxishuoming3,(320,80))
# 刷新窗口
pygame.display.update()
jiazaishengyin()
#学习界面循环
n2 = True
while n2:
# 计时器,设置帧率
pygame.time.Clock().tick(60)
guoyuxuexi.blit(xuexi,(0,0))
pygame.display.update()
xuexi.blit(fayintu,(250,500))
for event in pygame.event.get():
#退出程序
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# 开始界面鼠标检测结构
buttons = pygame.mouse.get_pressed()
x1, y1 = pygame.mouse.get_pos()
if x1 >= 250 and x1 <= 550 and y1 >= 500 and y1 <= 700 and event.type == pygame.MOUSEBUTTONDOWN:
pygame.mixer.music.load(r'.\国语学习音频\水果\%s' % music_list[id]) # %s 为占位符
pygame.mixer.music.set_volume(0.2)
pygame.mixer.music.play(loops=1)
elif exec("%s.get_rect().collidepoint(x1,y1)" % (file_name)):
pygame.quit()
sys.exit()
运行结果及报错内容
我的解答思路和尝试过的方法
file_name = ''设置全局变量file_name为空字符串
在def jiazaishengyin():中global file_name,但是调用file_name全局变量是还是空字符串
我想要达到的结果
在elif exec("%s.get_rect().collidepoint(x1,y1)" % (file_name)):中调用file_name的值