0

我的代码 Vincible.py 位于

C:\Users\Nick\Desktop\Vincible

我正在尝试访问位于

C:\Users\Nick\Desktop\Vincible\Audio

我整理了:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
try:
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'echostheme'))
    pygame.mixer.music.load(os.path.join('Audio', 'town1.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'town2.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'town3.midi'))
except:
    raise UserWarning("Could not load or play soundfiles in 'Audio' folder")  
pygame.init()
size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          sys.exit()
    pygame.mixer.Sound('title.midi').play()

运行它后,它运行了 except 位,我正在努力弄清楚如何成功地做到这一点。我通常不会从 Python 中的不同路径访问文件,因此非常感谢您的帮助。

编辑:根据巧妙的要求,我从我的代码中删除了 try/except 。这是新代码:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()

pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'echostheme'))
pygame.mixer.music.load(os.path.join('Audio', 'town1.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'town2.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'town3.midi'))

size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          sys.exit()
    pygame.mixer.Sound('title.midi').play()

这次推出:

Traceback (most recent call last):
  File "C:\Users\Nick\Desktop\Vincible\Vincible.py", line 8, in <module>
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
pygame.error: Couldn't open 'Audio\title.midi'

该文件没有损坏,并且确实在

Vincible\Audio

但它仍然返回此错误。我想这与我的使用有关

os.path.join

但话又说回来,我是 os.path 模块的新手。很感谢任何形式的帮助。

正如 Fredrik 建议的那样,我尝试将我的代码修改为:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()

def load(midi_file):
    module_directory = os.path.dirname(__file__)
    filename = os.path.join(module_directory, 'Audio', midi_file)
    pygame.mixer.music.load(filename)

load("title.midi")

size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    titlemusic.play(-1)

注意:我删除了所有其他 .midi 文件以使代码更小/更具可读性,在问题解决后,它们将以正确的方式添加。

运行时,解释器在第 13 行(我加载“title.midi”)引发另一个 pygame.error “无法打开文件”。任何帮助表示赞赏。

4

2 回答 2

1

路径是相对于当前目录的,它不一定与您的脚本或模块所在的目录相同。要检查它是什么,请添加:

print os.getcwd()

要计算相对于模块目录的路径,您可以执行以下操作:

module_directory = os.path.dirname(__file__)
filename = os.path.join(module_directory, 'Audio', 'town3.midi')

__file__给你模块的文件名,并os.path.dirname去掉文件部分)

一个简单的辅助函数可能有用:

def load(midi_file):
    filename = os.path.join(module_directory, 'Audio', midi_file)
    pygame.mixer.music.load(filename)

load('town1.midi')
load('town2.midi')
load('town3.midi')
于 2013-07-21T22:33:41.310 回答
0

如果文件与 python 文件不在同一个文件夹中,则需要在打开文件时指定文件夹。我可以建议打开文件,"Audio/file.midi"而不仅仅是"file.midi". 如果没有 Fredrik 建议的功能,那应该可以正常工作。如果您更改文件的存储位置(即重命名文件夹或移动文件),请不要忘记在代码中进行更改。

编辑:另外,一个与您的问题无关但也会很好地帮助您完成项目的旁注,请尝试从文件夹中动态获取文件,而不是对每个文件进行硬编码。尝试:

import os #this is a handy module with operating system functions

def getMusic(place): #where place is the name of the folder in this case "Audio/". Don't forget the slash!
    for file in os.listdir(place): #os.listdir returns a list of all the files in a directory. 
        pygame.mixer.music.load(place+file)
于 2013-07-22T08:32:52.210 回答