pyglet.window
子模块
细节
窗口和用户界面事件。
此模块允许应用程序创建和显示具有OpenGL上下文的窗口。窗口可以创建多种边框样式或设置全屏。
您可以为键盘、鼠标和窗口事件注册事件处理程序。对于游戏和Kiosk,您还可以将输入限制到您的窗口,例如,禁止用户使用特定的组合键从应用程序切换,或者捕获和隐藏鼠标。
快速入门
调用窗口构造函数以创建新窗口::
from pyglet.window import Window
win = Window(width=960, height=540)
附加您自己的事件处理程序::
@win.event
def on_key_press(symbol, modifiers):
# ... handle this event ...
将窗口的绘图代码放在 Window.on_draw 事件处理程序::
@win.event
def on_draw():
# ... drawing code ...
打电话 pyglet.app.run 要进入主事件循环(默认情况下,在关闭所有打开的窗口后返回):
from pyglet import app
app.run()
创建游戏窗口
使用 set_exclusive_mouse()
隐藏鼠标光标并接收相对的鼠标移动事件。指定 fullscreen=True
作为关键字参数传递给 Window
用于呈现到整个屏幕而不是打开窗口的构造函数::
win = Window(fullscreen=True)
win.set_exclusive_mouse()
使用多个屏幕
默认情况下,全屏窗口在主显示器上打开(通常由用户在其操作系统设置中设置)。如果愿意,您可以检索附加屏幕的列表并手动选择一个屏幕。这对于在每个屏幕上打开全屏窗口非常有用:
display = pyglet.canvas.get_display()
screens = display.get_screens()
windows = []
for screen in screens:
windows.append(window.Window(fullscreen=True, screen=screen))
如果窗口不是全屏的,则指定屏幕不起作用。
指定OpenGL上下文属性
每个窗口都有自己的上下文,该上下文是在创建窗口时创建的。您可以在创建上下文之前通过创建“模板”配置来指定它的属性:
from pyglet import gl
# Create template config
config = gl.Config()
config.stencil_size = 8
config.aux_buffers = 4
# Create a window using this config
win = window.Window(config=config)
要确定是否支持给定的配置,请查询屏幕(请参阅上面的“使用多个屏幕”):
configs = screen.get_matching_configs(config)
if not configs:
# ... config is not supported
else:
win = window.Window(config=configs[0])
班级
- class Window
-
平台无关的应用程序窗口。
窗口是占用操作系统资源的“重量级”对象。窗口的“客户端”或“内容”区域完全由OpenGL视区填充。应用程序无法访问操作系统窗口小部件或控件;所有渲染都必须通过OpenGL完成。
窗口可以显示为浮动区域,也可以设置为填满整个屏幕(全屏)。浮动时,窗口可能显示为无边框或装饰有特定于平台的框架(例如,包括标题栏、最小化和关闭按钮、调整大小手柄等)。
虽然可以设置窗口的位置,但建议应用程序允许平台根据本地约定放置窗口。这将确保它不会被其他窗口遮挡,并显示在适合用户的屏幕上。
若要呈现到窗口中,必须首先调用其
switch_to()
方法以使其成为活动的OpenGL上下文。如果在应用程序中只使用一个窗口,则可以跳过此步骤,因为它将始终是活动上下文。方法
- abstract activate() None
尝试将键盘焦点恢复到窗口。
根据窗口管理器或操作系统的不同,这可能不会成功。例如,在Windows XP上,不允许一个应用程序从另一个应用程序“窃取”焦点。取而代之的是,窗口的任务栏图标将闪烁,表明它需要注意。
- 返回类型:
- static clear() None
把窗户清空。
这是清除颜色和深度缓冲区的一种方便方法。该窗口必须是活动上下文(请参见
switch_to()
)。- 返回类型:
- close() None
关上窗户。
关闭窗口后,总账上下文将无效。窗口实例一旦关闭就不能再使用。要重新使用Windows,请参见
set_visible()
取而代之的是。这个
pyglet.app.EventLoop.on_window_close()
事件由pyglet.app.event_loop
在调用此方法时。- 返回类型:
- dispatch_event(*args: Any) None
将事件调度到附加的事件处理程序。
该事件被传播到堆栈中所有已注册的事件处理程序,从开始到顶部再向下传播。如果任何注册的事件处理程序返回
EVENT_HANDLED
,则堆栈下面的其他处理程序都不会收到此事件。此方法有几个可能的返回值。如果任何事件处理程序已返回
EVENT_HANDLED
,则此方法也将返回EVENT_HANDLED
。如果不是,此方法将返回EVENT_UNHANDLED
。如果没有注册接收该事件的事件,False
是返回的。- 返回类型:
- 返回:
EVENT_HANDLED
如果返回任何事件处理程序EVENT_HANDLED
;EVENT_UNHANDLED
如果调用了一个或多个事件处理程序而没有返回任何事件处理程序 EVENT_HANDLED ;False
如果没有注册任何事件处理程序。
- abstract dispatch_events() None
轮询操作系统事件队列以查找新事件和调用附加事件处理程序。
此方法是为面向Piglet 1.0的遗留应用程序和必须将其事件循环集成到另一个框架中的高级应用程序提供的。
典型的应用程序应该使用
pyglet.app.run()
。- 返回类型:
- draw_mouse_cursor() None
绘制自定义鼠标光标。
如果当前鼠标光标具有
drawable
设置,则在翻转缓冲区以呈现它之前调用此方法。几乎不需要重写此方法;相反,子类
MouseCursor
并提供您自己的draw()
方法。- 返回类型:
- abstract flip() None
交换OpenGL前台和后台缓冲区。
在双缓冲窗口上调用此方法以使用后台缓冲区更新可见显示。默认情况下,Windows是双缓冲的,除非您关闭此功能。
执行此操作后,后台缓冲区的内容未定义。
默认设置
event_loop
在窗口的on_draw()
事件。- 返回类型:
- get_framebuffer_size() tuple[int, int]
返回窗口帧缓冲区的实际像素大小。
使用HiDPI屏幕时,窗口的帧缓冲区大小可能大于请求的窗口大小。如果执行的操作需要知道窗口中的实际像素数,则应使用此方法,而不是
Window.get_size()
。例如,设置窗口投影或设置glViewport大小。
- get_pixel_ratio() float
返回帧缓冲区/窗口大小比率。
某些平台和/或窗口系统支持亚像素缩放,从而使帧缓冲区大小大于窗口大小。OSX上的视网膜屏幕和Linux上的Gnome就是一些例子。
在Retina系统上,返回比率通常为2.0,因为大小为500 x 500的窗口将具有1000 x 1000的帧缓冲区。也可能遇到介于1.0和2.0之间的分数值,以及高于2.0的数值。
- 返回类型:
- get_system_mouse_cursor(name: str) MouseCursor
获取系统鼠标光标。
使用
set_mouse_cursor()
若要激活此方法返回的光标,请执行以下操作。此方法接受的名称是CURSOR_*
在此类上定义的常量。- 返回类型:
- abstract set_caption(caption: str) None
设置窗口的标题。
标题会出现在窗口的标题栏中(如果有的话),以及Windows和许多X11窗口管理器的任务栏中。
- 返回类型:
- set_exclusive_keyboard(exclusive: bool = True) None
防止用户使用键盘快捷键从此窗口切换。
启用后,该功能会禁用某些特定于操作系统的组合键,如Alt+Tab(OS X上的Command+Tab)。这在某些Kiosk应用程序中可能很有用,但在一般应用程序或游戏中应该避免。
- 返回类型:
- set_exclusive_mouse(exclusive: bool = True) None
隐藏鼠标光标并将所有鼠标事件定向到此窗口。
启用时,此功能可防止鼠标离开窗口。它对于需要完全控制鼠标的某些类型的游戏很有用。启用独占鼠标时,后续事件中报告的鼠标位置没有意义;您应该只使用相对运动参数
dx
和dy
。- 返回类型:
- set_fullscreen(
- fullscreen: bool = True,
- screen: Screen | None = None,
- mode: ScreenMode | None = None,
- width: int | None = None,
- height: int | None = None,
切换到全屏或从全屏切换到全屏。
切换全屏后,GL上下文应该保留其状态和对象,但是需要清除并重新绘制缓冲区。
如果
width
和height
是指定的,并且fullscreen
为True,则屏幕可能会切换到与给定大小最匹配的不同分辨率。如果分辨率不完全匹配,则选择更高的分辨率,并且窗口将在覆盖屏幕其余部分的黑色边框内居中。- 参数:
fullscreen (
bool
) -- 如果窗口应全屏显示,则为True;如果应设置窗口,则为False。screen (
Screen
|None
) -- 如果不是None且Full Screen为True,则窗口将移动到给定屏幕。屏幕必须与窗口属于同一显示器。mode (
ScreenMode
|None
) -- 屏幕将切换到给定模式。该模式必须是通过枚举get_modes()
。如果没有,将从给定的模式中选择合适的模式width
和height
。width (
int
|None
) -- int可选窗口宽度。 如果未指定,则默认为窗口时之前的窗口大小,如果是全屏,默认为屏幕大小。 ..已添加版本::1.2height (
int
|None
) -- 窗口的可选高度。 如果未指定,则默认为窗口时之前的窗口大小,如果是全屏,默认为屏幕大小。 ..已添加版本::1.2
- 返回类型:
- set_icon(*images: AbstractImage) None
设置窗口图标。
如果提供了多个图像,则会选择一个大小合适的图像(如果没有提供正确的大小,则会对图像进行缩放)。
可提供的有用尺寸包括16x16、32x32、64x64(仅限Mac)和128x128(仅限Mac)。
- 返回类型:
- set_maximum_size(width: int, height: int) None
设置窗口的最大大小。
一旦设置,用户将不能调整大于给定尺寸的窗口大小。无法取消对窗口的最大尺寸限制(但可以将其设置为较大的值)。
如果设置的最大大小小于窗口的当前大小,则行为未定义。
窗口大小不包括边框或标题栏。
- set_minimum_size(width: int, height: int) None
设置窗口的最小大小。
一旦设置,用户将不能调整小于给定尺寸的窗口大小。无法删除窗口的最小大小限制(但可以将其设置为0,0)。
如果设置的最小大小大于窗口的当前大小,则行为未定义。
窗口大小不包括边框或标题栏。
- set_mouse_cursor(cursor: MouseCursor | None = None) None
更改鼠标光标的外观。
仅当鼠标光标位于此窗口内时,才会更改其外观。
- 参数:
cursor (
MouseCursor
|None
) -- 要设置的指针,或None
恢复默认指针。- 返回类型:
- set_mouse_platform_visible(platform_visible: bool | None = None) None
设置平台绘制的鼠标指针可见性。
更改鼠标指针或独占模式后自动调用。
应用程序通常不需要调用此方法。
- 看见:
set_mouse_visible()
取而代之的是。- 参数:
platform_visible (
bool
|None
) -- 如果None
,将平台可见性设置为当前独占模式和指针类型所需的可见性。 否则,布尔值将覆盖并强制可见性。- 返回类型:
- set_size(width: int, height: int) None
调整窗口大小。
如果窗口不能调整大小,或者它当前是全屏的,则行为是未定义的。
窗口大小不包括边框或标题栏。
- 返回类型:
- abstract switch_to() None
使该窗口成为当前的OpenGL渲染上下文。
一次只能有一个OpenGL上下文处于活动状态。此方法将当前窗口上下文设置为活动窗口上下文。
在大多数情况下,应该使用此方法,而不是直接调用
set_current()
。后者不会为您执行特定于平台的状态管理任务。- 返回类型:
事件
- on_activate() None
窗户被激活了。
此事件可以通过单击标题栏将其带到前台来触发;也可以通过某种特定于平台的方法来触发。
当窗口处于“活动”状态时,它具有键盘焦点。
- 活动:
- 返回类型:
- on_close() None
用户尝试关闭窗口。
此事件可通过单击窗口标题栏中的“X”控件框或通过某种其他与平台相关的方式触发。
默认处理程序设置 has_exit 至
True
。在pyglet1.1中,如果 pyglet.app.event_loop 正在被利用, close 也被调用,并立即关闭窗口。- 活动:
- 返回类型:
- on_context_lost() None
窗口的总账上下文丢失。
当上下文丢失时,在重新创建上下文之前,不能再调用GL方法。这是一种罕见的事件,可能是由用户切换到不兼容的视频模式触发的。当它发生时,应用程序将需要重新加载所有对象(显示列表、纹理对象、着色器)以及恢复GL状态。
- 活动:
- 返回类型:
- on_context_state_lost() None
窗口的GL上下文的状态已丢失。
如果窗口被移动到另一个视频设备,或者在全屏或窗口模式之间移动,则Piglet有时可能需要重新创建窗口的GL上下文。在这种情况下,它将尝试在新旧上下文之间共享对象(显示列表、纹理对象、着色器)。如果这是可能的,则只丢失GL上下文的当前状态,并且应用程序应该简单地恢复状态。
- 活动:
- 返回类型:
- on_draw() None
应重新绘制窗口内容。
这个 EventLoop 时将调度此事件。 draw 方法已被调用。该窗口将已经具有GL上下文,因此不需要调用 switch_to 。窗子里的 flip 方法将在此事件之后立即调用,因此您的事件处理程序不应该调用。
You should make no assumptions about the window contents when this event is triggered; a resize or expose event may have invalidated the framebuffer since the last time it was drawn. :rtype:
None
Added in version 1.1.
- 活动:
- on_expose() None
窗口的一部分需要重新绘制。
此事件在窗口首次出现时触发,并且在任何时候窗口内容因其他窗口遮挡而无效时都会触发此事件。
无法确定窗口的哪一部分需要重绘。请注意,随着较新的窗口管理器自动组合窗口并保留窗口内容的后备存储,这种方法的使用正变得越来越不常见。
- 活动:
- 返回类型:
- on_file_drop(x: int, y: int, paths: list[str]) None
文件已放入窗口。
- 参数:
- 返回类型:
Added in version 1.5.1.
- 活动:
- on_key_press(symbol: int, modifiers: int) None
键盘上的一个键被按下(并被按住)。
自pyglet 1.1以来,默认处理程序将
on_close()
事件,如果ESC
已按下键。
- on_mouse_scroll(x: int, y: int, scroll_x: float, scroll_y: float) None
鼠标滚轮已滚动。
请注意,大多数鼠标只有一个垂直滚动轮,因此scroll_x通常为0。 Apple Mighty Mouse是一个例外,它有一个鼠标球来代替轮子,允许两者
scroll_x
和scroll_y
有动静。
- on_refresh(dt: float) None
应重新绘制窗口内容。
这个
EventLoop
时将调度此事件。draw
方法已被调用。该窗口将已经具有GL上下文,因此不需要调用switch_to()
。窗子里的flip()
方法将在此事件之后立即调用,因此您的事件处理程序不应该调用。You should make no assumptions about the window contents when this event is triggered; a resize or expose event may have invalidated the framebuffer since the last time it was drawn. :rtype:
None
Added in version 2.0.
- 活动:
- on_resize(width: int, height: int) None
窗户的大小被调整了。
调度此事件时,窗口将具有GL上下文;不需要调用
switch_to()
在这个操控器里。- 活动:
- 返回类型:
- on_text(text: str) None
用户输入一些文本。
通常,这是在
on_key_press()
在此之前on_key_release()
,但如果按键(重复按键)也可以调用多次;或者如果使用另一种输入法(例如,笔输入),则在不按键的情况下调用。您应该始终使用此方法来解释文本,因为关键符号通常具有到其Unicode表示形式的复杂映射,而此事件负责这些表示形式。
- 活动:
- 返回类型:
- on_text_motion(motion: int) None
用户移动了文本输入光标。
通常,这是在
on_key_press()
在此之前on_key_release()
,但如果键是Help Down(重复按键),也可以多次调用。您应该始终使用此方法来移动文本输入光标(脱字符),因为不同的平台有不同的默认键盘映射,并且正确处理重复键。
The values that motion can take are defined in
pyglet.window.key
: :rtype:None
MOTION_UP
MOTION_RIGHT
MOTION_DOWN
MOTION_LEFT
MOTION_NEXT_WORD
MOTION_PREVIOUS_WORD
MOTION_BEGINNING_OF_LINE
MOTION_END_OF_LINE
MOTION_NEXT_PAGE
MOTION_PREVIOUS_PAGE
MOTION_BEGINNING_OF_FILE
MOTION_END_OF_FILE
MOTION_BACKSPACE
MOTION_DELETE
- 活动:
- on_text_motion_select(motion: int) None
用户在扩展选择时移动了文本输入光标。
通常,这是在
on_key_press()
在此之前on_key_release()
,但如果键是Help Down(重复按键),也可以多次调用。您应该始终使用此方法来响应文本选择事件,而不是原始
on_key_press()
,因为不同的平台有不同的默认键盘映射,并且键重复被正确处理。The values that motion can take are defined in
pyglet.window.key
: :rtype:None
MOTION_UP
MOTION_RIGHT
MOTION_DOWN
MOTION_LEFT
MOTION_NEXT_WORD
MOTION_PREVIOUS_WORD
MOTION_BEGINNING_OF_LINE
MOTION_END_OF_LINE
MOTION_NEXT_PAGE
MOTION_PREVIOUS_PAGE
MOTION_BEGINNING_OF_FILE
MOTION_END_OF_FILE
- 活动:
属性
- aspect_ratio
窗口的纵横比。只读。
- caption
窗口标题(标题)。只读。
- config
描述此窗口的上下文的GL配置。只读。
- context
附加到此窗口的OpenGL上下文。只读。
- display
此窗口所属的显示器。只读。
- fullscreen
如果窗口当前为全屏,则为真。只读。
- height
窗口的高度,以像素为单位。读写。
- projection
OpenGL窗口投影矩阵。读写。
在使用任何内置可绘制类时,此矩阵用于变换顶点。 view 是先完成的,然后 projection 。
默认投影矩阵为正交(2D),但自定义
Mat4
可以设置实例。或者,您可以提供由16个值组成的平面元组。(2D),但可以更改为任何所需的4x 4矩阵。 :see:
Mat4
。
- resizeable
如果窗口大小可调,则为真。只读。
- screen
此窗口全屏显示的屏幕。只读。
- size
窗口的大小。读写。
- style
窗口样式;其中一个
WINDOW_STYLE_*
常量。只读。
- view
OpenGL窗口视图矩阵。读写。
在使用任何内置可绘制类时,此矩阵用于变换顶点。 view 是先完成的,然后 projection 。
默认视图是标识矩阵,但自定义
Mat4
可以设置实例。或者,您可以提供由16个值组成的平面元组。
- viewport
窗口视图。
窗口视口用(x,y,宽度,高度)表示。
- visible
如果窗口当前可见,则为真。只读。
- vsync
如果缓冲区翻转与屏幕的垂直倒带同步,则为真。只读。
- width
窗口的宽度,以像素为单位。读写。
类属性:游标名称
- CURSOR_DEFAULT = None
类属性:窗样式
- __init__(
- width: int | None = None,
- height: int | None = None,
- caption: str | None = None,
- resizable: bool = False,
- style: str | None = None,
- fullscreen: bool = False,
- visible: bool = True,
- vsync: bool = True,
- file_drops: bool = False,
- display: Display | None = None,
- screen: Screen | None = None,
- config: Config | None = None,
- context: Context | None = None,
- mode: ScreenMode | None = None,
创建一个窗口。
所有参数都是可选的,如果未指定参数,则假设合理的默认值。
这个
display
,screen
,config
和context
参数形成控制层次结构:不需要指定多个参数。 例如,如果您指定screen
这个display
将被推断,并默认config
和context
将被创建。config
是一种特殊情况;它可以是用户创建的指定所需属性的模板,也可以是完整的config
从get_matching_configs()
'或类似的。创建窗口后,上下文将立即处于活动状态,就好像
switch_to()
'刚刚打电话。- 参数:
width (
int
|None
) -- 窗口的宽度(以像素为单位)。 默认为960,或屏幕宽度,如果fullscreen
是真的。height (
int
|None
) -- 窗口的高度(以像素为单位)。 默认为540,或屏幕高度,如果fullscreen
是真的。resizable (
bool
) -- 如果为True,则窗口的大小可以调整。 默认为假。fullscreen (
bool
) -- 如果为True,则窗口将覆盖整个屏幕而不是浮动。 默认为假。visible (
bool
) -- 确定窗口在创建后是否立即可见。 切换到True。 如果您想在窗口显示给用户之前更改窗口的属性,请将其设置为False。vsync (
bool
) -- 如果为True,缓冲区翻转将与主屏幕的垂直倒带同步,从而消除闪烁。file_drops (
bool
) -- 如果为True,窗口将接受放入其中的文件并调用on_file_drop
事件。mode (
ScreenMode
|None
) -- 如果出现以下情况,屏幕将切换到此模式 fullscreen 是真的 如果无,则选择适当的模式来适应width
和 ``height` 。
- __new__(**kwargs)
- class FPSDisplay
基类:
object
显示窗口的帧速率。
这是一个方便的类,可以帮助分析和调试。典型用法是创建一个 FPSDisplay ,并在窗口的末尾绘制显示。
on_draw()
事件处理程序::from pyglet.window import Window, FPSDisplay window = Window() fps_display = FPSDisplay(window) @window.event def on_draw(): # ... perform ordinary window drawing operations ... fps_display.draw()
显示的样式和位置可以通过
label
属性通过设置 update_period 属性。- update_period = 0.25
两次更新之间的时间(秒)。
- class MouseCursor
抽象的鼠标光标。
- class DefaultMouseCursor
基类:
MouseCursor
操作系统设置的默认鼠标光标。
- __init__()
- __new__(**kwargs)
- class ImageMouseCursor
基类:
MouseCursor
从图像创建的用户定义的鼠标光标。
使用此类创建您自己的鼠标光标并将其分配给窗口。光标可以由OpenGL绘制,也可以选择传递给操作系统进行本机渲染。OpenGL绘制的光标没有限制,但本机呈现的光标可能有一些平台限制(如颜色深度或大小)。通常,大小合理的游标将正确呈现
- __init__(
- image: AbstractImage,
- hot_x: int = 0,
- hot_y: int = 0,
- acceleration: bool = False,
从图像创建鼠标指针。
- 参数:
image (
AbstractImage
) -- 用于鼠标指针的图像。 它必须有有效的texture
属性。hot_x (
int
) -- 图像中“热点”点相对于图像锚点的X坐标。如果启用加速,可能会被夹在最大图像宽度。hot_y (
int
) -- 图像中“热点”点相对于图像锚点的Y坐标。如果启用加速,可能会被夹在最大图像高度。acceleration (
bool
) -- 如果True
,本地绘制鼠标,而不是使用GL。图像可能会被缩减采样或减少颜色以适应平台限制。