pysdl2 显示图像时的访问冲突

4 投票
1 回答
639 浏览
提问于 2025-04-17 23:48

我正在尝试在Windows电脑上使用pysdl2。到目前为止,我只做了复制粘贴Hello World教程,只是想看看它是否真的能工作!结果并没有。

import sys
import sdl2.ext

RESOURCES = sdl2.ext.Resources(__file__, "resources")

sdl2.ext.init()

window = sdl2.ext.Window("Hello World!", size=(640, 580))
window.show()

factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)
sprite = factory.from_image(RESOURCES.get_path("testimage.png"))

spriterenderer = factory.create_sprite_render_system(window)
spriterenderer.render(sprite)

processor = sdl2.ext.TestEventProcessor()
processor.run(window)

sdl2.ext.quit()

当我运行这个程序时,它会短暂显示一个窗口,然后就崩溃了,出现了这个错误:

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    spriterenderer.render(sprite)
  File "C:\Python27\lib\site-packages\sdl2\ext\sprite.py", line 643, in render
    surface.SDL_BlitSurface(sprites.surface, None, self.surface, r)
WindowsError: exception: access violation reading 0x03F3B000

不过每次的地址都不一样。

这种情况似乎只发生在较大的图片上——如果我把图片缩小到245 x 245像素或更小,它就能正常显示。我在使用Pillow来支持更多的格式,但在bmppngjpg格式上也遇到了同样的问题。

补充说明:

今天,我又在研究这个问题,试图理解它。我的测试图片原本是245x245像素,但现在不再工作,除非我在创建spriterenderer和调用render(sprite)之间做点什么——我出于好奇在这两行之间加了print sprite,想看看变量里到底有没有东西,结果是有的,并且能正常显示。如果把print这一行注释掉,它就会失败。然后我把同样的图片做大,变成500x500,又出现了access violation的错误。我完全不知道发生了什么。

1 个回答

1

你在用哪个版本的SDL?是从Mercurial上下载的最新开发版吗?

如果是的话,那可能不太稳定,里面可能有个bug,导致它在Windows上运行不正常。就我来说,稳定版本在Arch和Windows上都能正常工作。

你看到的那个错误是WindowsError,可能是因为使用了DLL文件的问题。

如果你在用不稳定的版本,试试换成稳定版本。这样可能就能正常工作了。

撰写回答