代码之家  ›  专栏  ›  技术社区  ›  Sun Bear

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

  •  0
  • Sun Bear  · 技术社区  · 8 年前

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

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

    测试代码:

    #!/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()
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Nelfeal    8 年前

    你很困惑 windowID event 窗口ID 是与事件关联的窗口对应的标识符。 是实际事件,是 SDL_WindowEventID .

    event.window.windowID 具有 event.window.event 在你的一系列假设中。