打开我的Pygame程序的EXE时出现导入错误

4 投票
2 回答
6408 浏览
提问于 2025-04-16 20:18

我用pygame写了一个MP3播放器:

from Tkinter import *
import pygame
import glob
import tkFont
songs=[]
for x in glob.glob('C:\WhaleTunes\Downloaded/*mp3'):

    songs.append(x)
Admin=Tk()
num=0
plpa=-1
songas=Label(Admin,text='',bg='red')
songas.place(relx=0.0,rely=0.7)
def play(number):

    pygame.mixer.music.unpause()
    pygame.mixer.music.load(songs[number])
    pygame.mixer.music.play()

    songas.configure(text=songs[number])


def pause():
     pygame.mixer.music.pause()
def Pre():
    global num
    if num == 0:
        z = len(songs)
        num=z
        num+=1
    num-=1
    play(num)
def Next():
    global num
    num+=1
    play(num)
#init pygame mixer
pygame.mixer.init()
#atach all buttons & labels
fons=tkFont.Font(family="bold", size=40)
fon=tkFont.Font(family="Helvetica", size=20)
tit=Label(Admin,text='Mp3 Player',font=fons,fg='grey',bg='red')
tit.place(relx=0.2,rely=0.0)
playnpause=Button(Admin,text='Play',command=lambda:play(num),fg='yellow',bg='red',font=fon)
playnpause.place(relx=0.0,rely=0.4)
last=Button(Admin,text='Previous',command=Pre,fg='yellow',bg='red',font=fon)
last.place(relx=0.2,rely=0.4)
first=Button(Admin,text='Next',command=Next,fg='yellow',bg='red',font=fon)
first.place(relx=0.5,rely=0.4)
pauses=Button(Admin,text='Pause',command=pause,fg='yellow',bg='red',font=fon)
pauses.place(relx=0.7,rely=0.4)
Admin.minsize(width=500, height=200)
Admin.maxsize(width=500, height=200)
Admin.configure(bg='red')
Admin.mainloop()

然后我尝试用这段代码把它变成一个exe文件:

from distutils.core import setup
import py2exe

setup(console=['mp3player.py'])

但是当我运行mp3player.exe的时候,出现了一堆导入错误:

C:\Users\P'sao\Downloads\dist\mp3player.exe:2: RuntimeWarning: import display: N
o module named _view
(ImportError: No module named _view)
C:\Users\P'sao\Downloads\dist\mp3player.exe:2: RuntimeWarning: import draw: No m
odule named _view
(ImportError: No module named _view)
C:\Users\P'sao\Downloads\dist\mp3player.exe:2: RuntimeWarning: import image: No
module named _view
(ImportError: No module named _view)
C:\Users\P'sao\Downloads\dist\mp3player.exe:2: RuntimeWarning: import pixelcopy:
 No module named _view
(ImportError: No module named _view)
C:\Users\P'sao\Downloads\dist\mp3player.exe:2: RuntimeWarning: import transform:
 No module named _view
(ImportError: No module named _view)

有人知道怎么解决这个问题吗?

而且当我编译所有内容时,我遇到了这个错误:

The following modules appear to be missing
['AppKit', 'Foundation', 'Numeric', 'OpenGL.GL', '_scproxy', 'copyreg', 'dummy.P
rocess', 'numpy', 'pkg_resources', 'queue', 'winreg', 'pygame.sdlmain_osx']

2 个回答

2

我之前也遇到过同样的问题,后来自己找到了解决办法:

经过几周的努力(其实我之前就有这个问题),我很高兴地说我解决了这个问题! :)

问题的第一部分 (https://i.stack.imgur.com/WpkjR.png):

我通过编辑setup.py脚本,添加了一个“excludes”部分来解决这个问题。这样就成功生成了可执行文件!

修改后的setup.py脚本:

from distutils.core import setup
import py2exe
setup(windows=['source_static.py'], options={
          "py2exe": {
              "excludes": ["OpenGL.GL", "Numeric", "copyreg", "itertools.imap", "numpy", "pkg_resources", "queue", "winreg", "pygame.SRCALPHA", "pygame.sdlmain_osx"],
              }
          }
      )

所以,如果你也遇到类似的问题,只需把那些“缺失”的模块放到这个“excludes”行里。

第二部分:

在我成功生成可执行文件后,接下来又遇到了一个问题:应用程序请求运行时以不寻常的方式终止。请联系...。经过几天的搜索和思考,我终于找到了办法。我简直不敢相信这个问题是如此荒谬。问题出在我的代码中,具体是字体的定义:

font1 = pygame.font.SysFont(None, 13)

把“None”改成某个系统字体的名字(比如“Arial”,一定要用字符串),然后重新编译,我简直不敢相信我的.exe文件竟然能用了!

font1 = pygame.font.SysFont("Arial", 13)

当然,你可以使用自己的字体,但必须在程序中指定它的路径并进行定义。

所以对于所有遇到这些问题的人,试试这些步骤,希望你们能成功。我真的希望这能帮到你们,因为我花了好几天和几周的时间来解决这些问题。我甚至尝试用所有版本的python和pygame,以及许多其他的.exe构建工具和setup脚本,但都没有成功。除了这些问题,我之前还遇到过很多其他问题,但我在stackoverflow.com上找到了答案。

我很高兴找到了解决这些问题的方法,也希望能帮助到你们,如果你们也遇到同样的问题。

小贴士(我也做过的事情):

第一:更新你的Microsoft Visual C++库到最新版本。

第二:如果你的可执行程序需要的图片或字体,记得把它们放到dist文件夹里(也就是你的.exe文件生成的地方)。

第三:在制作.exe文件时,把所有需要的文件放到setup.py脚本所在的文件夹里(包括主脚本使用的所有文件和目录)。

使用了Python 2.7 x64pygamepy2exe

8

解决这个问题的方法是在你主要的源文件顶部添加 import pygame._view。这样做之后,任何打包工具都应该可以正常工作。我在使用 cx_Freeze、py2exe 和 pyInstaller 时遇到了这个问题。这是一个严重的错误,影响了很多打包 pygame 程序的工具。

撰写回答