m0_60579011 2022-04-12 21:11 采纳率: 0%
浏览 41

python循环怎么调用其他函数中变量

问题遇到的现象和发生背景

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()
运行结果及报错内容

img

我的解答思路和尝试过的方法

file_name = ''设置全局变量file_name为空字符串
在def jiazaishengyin():中global file_name,但是调用file_name全局变量是还是空字符串

img

我想要达到的结果

在elif exec("%s.get_rect().collidepoint(x1,y1)" % (file_name)):中调用file_name的值

  • 写回答

1条回答 默认 最新

  • ningzip 2022-04-12 22:12
    关注

    img

    >>> a = 0
    >>> exec('a = 1', globals())
    >>> a
    1
    

    为什么要用exec()呢?你的第一个代码片段中的全都不必要用,exec()开销很大。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月12日

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大