全屏时出现奇怪的 pygame 坐标

Strange pygame coordinates while in fullscreen

我在带触摸屏的 raspberry pi 上使用 pygame 编写了一个应用程序。它在窗口模式下工作得很好,但一旦我切换到全屏模式,它就会表现得很奇怪。 None 我的触摸(点击)return 一个有理数的 x 和 y,它们通常在点击几次后 returned 为 799 和 479(屏幕的右下角)。我该怎么做才能解决这个问题?

我的屏幕的全屏分辨率是 800x480,我不得不说我在台式电脑上工作时没有这个问题,而且只有在使用触摸屏输入时才会出现。这是代码的相关部分:

import pygame, time, math, os
from pygame.locals import *
from sys import exit

pygame.init()        
pygame.mouse.set_visible(0)
pygame.mouse.set_pos(0, 0)
screen = pygame.display.set_mode((800, 480))

它工作正常但是当我切换到全屏时:

screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)

它将检测屏幕结束像素中的每一次点击。奇怪的是,当我在主屏幕上放置对象 (e.g.buttons) 时,它们被正确地放置在正确的坐标上,但我无法点击它们,因为触摸屏输入的 returned 坐标不正确。

多么有趣的问题!我刚刚在我的 Windows 笔记本电脑上使用我的触摸屏测试了一些代码(一次!),它也遇到了一些奇怪的问题,所以你并不孤单!至少在我看来,每当我使用 pygame.mouse.set_visible(False) 结合 pygame.FULLSCREEN 标志隐藏我的鼠标光标时 只有 我的 pygame.MOUSEBUTTONDOWN 事件返回不正确的鼠标位置。使光标可见可以解决这个问题,但对于触摸屏来说显然很烦人。我想出的解决方案(真的是 hack)是使用无边框 window 来模拟全屏模式,而不是将其放置在屏幕的左上角。这是代码;让我知道它是否适合你:

import pygame, time, math, sys, os

os.environ['SDL_VIDEO_WINDOW_POS'] = "{0},{1}".format(0, 0)
pygame.init()        
screen = pygame.display.set_mode((0, 0), pygame.NOFRAME)
pygame.mouse.set_visible(False)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            print(event.pos)
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                pygame.quit()
                sys.exit()

话虽这么说,但我很想知道 为什么 它不适用于 pygame.FULLSCREEN 标志。如果有人可以就 pygame 或 SDL1.2 提供一些见解,将不胜感激...

我发现这个:https://github.com/garthvh/pitftmenu

在 Debian Jessie 上修复 Pygame

Debian Jessie 附带的软件包 "libsdl1.2-15-10" 损坏 pygame。为了让它工作,我们必须从 Wheezy 恢复到 "libsdl1.2-15-5"

最快的方法是在 /etc/apt/sources.list 中注释掉所有内容并临时添加:

deb http://archive.raspbian.org/raspbian wheezy main contrib non-free

导入对应的keys:

deb http://archive.raspbian.org/raspbian wheezy main contrib non-free
gpg -a --export 9165938D90FDDD2E | sudo apt-key add -

删除有问题的包并将其替换为工作包:

sudo apt-get update

sudo apt-get remove libsdl1.2debian python-pygame

apt-get install libsdl-image1.2 libsdl-mixer1.2 libsdl-ttf2.0-0 libsdl1.2debian libsmpeg0 python-pygame

sudo apt-mark hold libsdl1.2debian

"/etc/apt/sources.list"恢复到原来的状态。

就是这样。 Pygame 已修复:-)