如何避免 sdl2.SDL_Event().window.windowID 总是返回值 2?

How to avoid sdl2.SDL_Event().window.windowID from always returning value 2?

问题: 我写了下面的测试代码来说明我的问题。每当有 sdl2 window 事件时,sdl2.SDL_Event().window.windowID 总是返回值 2,这意味着 window 是隐藏的,这是不正确的。当鼠标指针移入和移出window时,也会返回值2,当window移动、调整大小、最小化、最大化、……

问题:如何让它正常工作?

测试代码:

#!/bin/env python3.5

'''
test sdl2 event.window.windowID values

'''
# Python3 modules
import ctypes

# PyPI module
import sdl2


class Window (object):
    '''Create SDL2 WINDOW.'''

    def __init__(self, title='SDL2 Window', width=400, height=400):
        self.title = title
        self.width = width
        self.height = height
        self.window = None             # SDL2 Window Object
        self.event =sdl2.SDL_Event()   # SDL2 Event object

        if sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO) != 0:
            err = 'sdl2.SDL_Init failed: {}'.format(sdl2.SDL_GetError())
            print(err)

        flags = sdl2.SDL_WINDOW_RESIZABLE
        self.window = sdl2.SDL_CreateWindow(self.title.encode('utf-8'),
                                            sdl2.SDL_WINDOWPOS_UNDEFINED,
                                            sdl2.SDL_WINDOWPOS_UNDEFINED,
                                            ctypes.c_int(self.width),
                                            ctypes.c_int(self.height),
                                            ctypes.c_uint32(flags))  

    def end(self):
        '''Method to destroy SDL2 window and clean up SDL2'''
        sdl2.SDL_DestroyWindow(self.window) #Close and destroy SDL2 window.
        sdl2.SDL_Quit()                     #Clean up SDL2
        print('Ended Window')



def mainloop():
    running = True
    print('sdl2.SDL_WINDOWEVENT ', sdl2.SDL_WINDOWEVENT)
    print('sdl2.SDL_WINDOWEVENT_SHOWN ', sdl2.SDL_WINDOWEVENT_SHOWN)
    print('sdl2.SDL_WINDOWEVENT_HIDDEN ', sdl2.SDL_WINDOWEVENT_HIDDEN)
    print('sdl2.SDL_WINDOWEVENT_EXPOSED ', sdl2.SDL_WINDOWEVENT_EXPOSED)
    print('sdl2.SDL_WINDOWEVENT_MOVED ', sdl2.SDL_WINDOWEVENT_MOVED)
    print('sdl2.SDL_WINDOWEVENT_RESIZED ', sdl2.SDL_WINDOWEVENT_RESIZED)
    print('sdl2.SDL_WINDOWEVENT_SIZE_CHANGED ', sdl2.SDL_WINDOWEVENT_SIZE_CHANGED)
    print('sdl2.SDL_WINDOWEVENT_MINIMIZED ', sdl2.SDL_WINDOWEVENT_MINIMIZED)
    print('sdl2.SDL_WINDOWEVENT_MAXIMIZED ', sdl2.SDL_WINDOWEVENT_MAXIMIZED)
    print('sdl2.SDL_WINDOWEVENT_RESTORED ', sdl2.SDL_WINDOWEVENT_RESTORED)
    print('sdl2.SDL_WINDOWEVENT_ENTER ', sdl2.SDL_WINDOWEVENT_ENTER)
    print('sdl2.SDL_WINDOWEVENT_LEAVE ', sdl2.SDL_WINDOWEVENT_LEAVE)
    print('sdl2.SDL_WINDOWEVENT_FOCUS_GAINED ', sdl2.SDL_WINDOWEVENT_FOCUS_GAINED)
    print('sdl2.SDL_WINDOWEVENT_FOCUS_LOST ', sdl2.SDL_WINDOWEVENT_FOCUS_LOST)
    print('sdl2.SDL_WINDOWEVENT_CLOSE ', sdl2.SDL_WINDOWEVENT_CLOSE)
    print('sdl2.SDL_WINDOWEVENT_TAKE_FOCUS ', sdl2.SDL_WINDOWEVENT_TAKE_FOCUS)
    print('sdl2.SDL_WINDOWEVENT_HIT_TEST ', sdl2.SDL_WINDOWEVENT_HIT_TEST)

    while running:
        event = sdl2.SDL_Event()

        #while sdl2.SDL_PollEvent(ctypes.byref(event)) != 0:
        while sdl2.SDL_PollEvent(event) != 0:

            if event.type == sdl2.SDL_QUIT:
                running = False
                print('sdl2.SDL_QUIT')
                break

            if event.type == sdl2.SDL_WINDOWEVENT:
                print('event.window.windowID = {}'.format(
                    event.window.windowID))      

                if event.window.windowID == sdl2.SDL_WINDOWEVENT_SHOWN:
                    print("Window shown")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_HIDDEN:
                    print("Window hidden")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_EXPOSED:
                    print("Window exposed")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_MOVED:
                    print("Window moved to {},{}".format(event.window.data1,
                        event.window.data2))
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_RESIZED:
                    print("Window resized to {}x{}".format(event.window.data1,
                        event.window.data2))
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_SIZE_CHANGED:
                    print("Window size changed to {}x{}".format(
                        event.window.data1, event.window.data2))
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_MINIMIZED:
                    print("Window minimized")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_MAXIMIZED:
                    print("Window maximized")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_RESTORED:
                    print("Window restored")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_ENTER:
                    print("Mouse entered window.")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_LEAVE:
                    print("Mouse left window")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_FOCUS_GAINED:
                    print("Window gained keyboard focus")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_FOCUS_LOST:
                    print("Window lost keyboard focus")
                    break
                if event.window.windowID == sdl2.SDL_WINDOWEVENT_CLOSE:
                    print("Window closed")
                    break



def main():
    window = Window()
    mainloop()
    window.end()                    


if __name__== "__main__":
    main()

您混淆了 windowIDeventwindowID 是与事件关联的 window 对应的标识符。 event 是实际事件,是 SDL_WindowEventID

将你的 ifs 系列中的 event.window.windowID 替换为 event.window.event