- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了基于 SDL 1.2.15 的 pygame 1.9.2 问题:我看到的以编程方式调整窗口大小的唯一方法是 pygame.display.set_mode(...)
。但是当我调用这个方法时,我的键盘状态被重置,所以所有当前按下的键和修改器发送 KEYUP
事件,重复的键也被停止。
当用户手动调整窗口大小时,键盘状态是完全正常的。事件队列在调整大小时暂停,然后 VIDEORESIZE
和 VIDEOEXPOSE
事件出现并且键仍然被按下,如果它们是这样的话。
有几个问题:
key.set_mods()
,因为我无法获得用户释放键的时刻。示例程序演示了不良行为。向左和向右箭头将窗口大小调整为<em>相同 大小,但如果按下它们,则只有一次按键。如果按住,其他键会正常重复。输出是发生的所有事件的事件日志。
import pygame
import sys
# same size all the time
size = (200, 200)
pygame.init()
pygame.display.set_mode(size, pygame.RESIZABLE)
# if left or right arrow key is held nothing will happen despite this line
pygame.key.set_repeat(500, 200)
run = True
while run:
for event in pygame.event.get():
out = '%s\t%s'%(event.type, str(event.dict))
if event.type == pygame.QUIT:
pygame.display.quit()
run = False
if event.type == pygame.KEYDOWN:
# mods are also reset on set_mode() call
out += ', mods = %i' % (pygame.key.get_mods())
if event.key == pygame.K_LEFT:
pygame.display.set_mode(size, pygame.RESIZABLE)
if event.key == pygame.K_RIGHT:
pygame.display.set_mode(size, pygame.RESIZABLE)
print(out)
pygame.time.Clock().tick(60)
在 Win 机器上测试,但如果 linux 也失败,很快就会报告。
UPD:我一直在深入研究 pygame 的源代码,但不明白为什么,但是与 pygame 源代码捆绑在一起的文档指出,Pygame 在任何时候都只能激活一个显示器。使用 pygame.display.set_mode() 创建一个新的将关闭之前的显示
,这意味着没有办法调整窗口,只能重新创建它.我觉得有点奇怪。
UPD:我已经改变了我的程序行为,以便在用户完全释放键盘之前不会真正发生调整大小。它运作良好,不会破坏可用性。
不过,很高兴知道是否存在针对所述问题的解决方案。
最佳答案
一个解决方案是,像自己一样。已经提到,要存储键的状态,以便您可以忽略此特定的按键事件,而不是仅使用事件。然而,这可能有一个问题。如果您正在尝试创建一个按键控件来调整屏幕大小(您可能正在这样做),那么您也将忽略真实的按键弹起事件。因为这种控制很少实现,所以似乎没有任何一种干净的解决方案,比如只改变屏幕的功能,或者抑制错误按键事件的功能。但是,您可以找到解决关键事件问题的方法。实际上有两个可行的解决方案。第一个(可能是两个中最糟糕的一个)是创建一种方法来识别虚假事件,并有选择地忽略按键事件。执行此操作的最简单方法可能是在一段固定的时间内定期调整屏幕大小,这样您就可以在此时预料到错误的键盘事件并忽略它。下面是一个代码示例,用于阻止 a 键每秒调整大小(具体来说,它假设每次系统时间具有精确的秒值时都会发生屏幕更新,没有秒的小数部分):
import pygame
import datetime
a_keydown = False
for event in pygame.event.get():
if item.type == pygame.KEYDOWN and item.key == pygame.K_a:
a_keydown = True
print "keydown event"
if item.type == pygame.KEYUP and item.key == pygame.K_a:
if datetime.datetime.now().time()[4] > 15: #leaves a window of fifteen microseconds for the screen resize, this may need to be adjusted
a_keydown = False
print "key up event"
然而,这两个解决方案中更好的不是这个。假设由 set_mode 创建的 keyup 事件仅存在于 python 中,您可以从其他地方获取按键事件,例如 pywin32。尝试使用 win32api 模块,以及 GetKeyState() 函数之类的东西来满足您的需要。这将为您提供 key 的最后已知状态。不如 python 事件流方便,但它可能是您的最佳解决方案,因为 pygame 没有为此提供优雅的解决方案。
关于python - 在不丢失键盘状态的情况下调整 pygame 窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20400652/
https://github.com/mattdiamond/Recorderjs/blob/master/recorder.js中的代码 我不明白 JavaScript 语法,比如 (functio
在 iOS 7 及更早版本中,如果我们想在应用程序中找到 topMostWindow,我们通常使用以下代码行 [[[UIApplication sharedApplication] windows]
我已经尝试解决这个问题很长一段时间了:我无法访问窗口的 url,因为它位于另一个域上..有一些解决方案吗? function login() { var cb = window.ope
是否可以将 FFMPEG 视频流传递到 C# 窗口?现在它在新窗口中作为新进程打开,我只是想将它传递给我自己的 SessionWindow。 此时我像这样执行ffplay: public void E
我有一个名为 x 的矩阵看起来像这样: pTime Close 1 1275087600 1.2268 2 1275264000 1.2264 3 1275264300 1.2
在编译时,发生搜索,grep搜索等,Emacs会在单独的窗口中创建一个新的缓冲区来显示结果,有没有自动跳转到那个窗口的方法?这很有用,因为我可以使用 n 和 p 而不是 M-g n 和 M-g p 移
我有一个启动 PowerShell 脚本的批处理文件。 批处理文件: START Powershell -executionpolicy RemoteSigned -noexit -file "MyS
我有一个基于菜单栏的应用程序,单击图标时会显示一个窗口。在 Mac OS X Lion 上一切正常,但由于某种原因,在 Snow Leopard 和早期版本的 Mac OS X 上会出现错误。任何时候
在 macOS 中,如何在 Xcode 和/或 Interface Builder 中创建带有“集成标题栏和工具栏”的窗口? 这是“宽标题栏”类型的窗口,已添加到 OS X 10.10 Yosemit
在浏览器 (Chrome) 中 JavaScript: var DataModler = { Data: { Something: 'value' }, Process: functi
我有 3 个 html 页面。第 1 页链接到第 2 页,第 2 页链接到第 3 页(为了简单起见)。 我希望页面 2 中的链接打开页面 3 并关闭页面 1(选项卡 1)。 据我了解,您无法使用 Ja
当点击“创建节点”按钮时,如何打开一个新的框架或窗口?我希望新框架包含一个文本字段和下拉菜单,以便用户可以选择一个选项。 Create node Search node
我有一个用户控件,用于编辑应用程序中的某些对象。 我最近遇到一个实例,我想弹出一个新的对话框(窗口)来托管此用户控件。 如何实例化新窗口并将需要设置的任何属性从窗口传递到用户控件? 感谢您的宝贵时间。
我有一个Observable,它发出许多对象,我想使用window或buffer操作对这些对象进行分组。但是,我不想指定count参数来确定窗口中应包含多少个对象,而是希望能够使用自定义条件。 例如,
我有以下代码,它打开一个新的 JavaFX 阶段(我们称之为窗口)。 openAlertBox.setOnAction(e -> { AlertBox alert = AlertBox
我要添加一个“在新窗口中打开”上下文菜单项,该菜单项将以新的UIScene打开我的应用程序文档之一。当然,我只想在实际上支持多个场景的设备上显示该菜单项。 目前,我只是在检查设备是否是使用旧设备的iP
我正在尝试创建一个 AIR 应用程序来记录应用程序的使用情况,使用 AIR 从系统获取信息的唯一简单方法是使用命令行工具和抓取 标准输出 . 我知道像 这样的工具顶部 和 ps 对于 OS X,但它们
所以我有这个简单的 turtle 螺旋制作器,我想知道是否有一种方法可以打印出由该程序创建的我的设计副本。 代码: import turtle x= float(input("Angle: ")) y
我正在编写一个 C# WPF 程序,它将文本消息发送到另一个程序的窗口。我有一个宏程序作为我的键盘驱动程序 (Logitech g15) 的一部分,它已经这样做了,尽管它不会将击键直接发送到进程,而是
我尝试使用以下代码通过 UDP 发送,但得到了奇怪的结果。 if((sendto(newSocket, sendBuf, totalLength, 0, (SOCKADDR *)&sendAd
我是一名优秀的程序员,十分优秀!