gpt4 book ai didi

python - 如何编写双键按下程序,使非修饰键在我的程序中表现得像修饰键?

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:56 26 4
gpt4 key购买 nike

我正在编写一个打字程序,其中包含比标准键盘上可用的字符更多的字符。为了实现这一点,我需要将一些字母键转换为修饰键 CTRL+A。例如 f+j 会输出 a。输入 f 然后 j 对用户来说很慢,我需要他们能够按 fj同时接收一个输出。如果在程序运行时键盘的某些正常功能停止,那也没关系(甚至更可取)。

我研究过 pygame Keydown,但它似乎只有增加按键重复的功能,而不是停止按键输出。 Pyglet 也是一种可能性,但它没有关于如何制作额外修饰键的确切文档。我能弄清楚的唯一方法是不断扫描整个键盘以查看是否按下了任何键,但这不会确定按下键的顺序并且会为用户造成错误,因为用户按下 f 然后j 的读取方式与用户按 j 然后按 f 相同,我只需要 f 然后 j 组合被系统理解为击键。

最佳答案

这是一个 Pyglet 版本,说明您如何做到这一点。
我基于常见的 GUI class that I use often here on SO因为它是模块化的,并且更容易在 40 行后代码不会变得困惑的情况下构建。

import pyglet
from pyglet.gl import *

key = pyglet.window.key

class main(pyglet.window.Window):
def __init__ (self):
super(main, self).__init__(800, 800, fullscreen = False)
self.x, self.y = 0, 0

#self.bg = Spr('background.jpg')
self.output = pyglet.text.Label('',
font_size=14,
x=self.width//2, y=self.height//2,
anchor_x='center', anchor_y='center')

self.alive = 1
self.pressed = []
self.key_table = {213 : 'a'}

def on_draw(self):
self.render()

def on_close(self):
self.alive = 0

def on_key_release(self, symbol, modifiers):
if symbol == key.LCTRL:
pass # Again, here's how you modify based on Left CTRL for instance

## All key presses represents a integer, a=97, b=98 etc.
## What we do here is have a custom key_table, representing combinations.
## If the sum of two pressed matches to our table, we add that to our label.
## - If no match was found, we add the character representing each press instead.
## This way we support multiple presses but joined ones still takes priority.

key_values = sum(self.pressed)
if key_values in self.key_table:
self.output.text += self.key_table[key_values]
else:
for i in self.pressed:
self.output.text += chr(i)
self.pressed = []

def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
elif symbol == key.LCTRL:
pass # Modify based on left control for instance
else:
self.pressed.append(symbol)

def render(self):
self.clear()
#self.bg.draw()

self.output.draw()

self.flip()

def run(self):
while self.alive == 1:
self.render()

# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()

x = main()
x.run()

它可能看起来像很多代码,尤其是对于 Pygame 答案。但是你也可以将它压缩到 ~15 行,但是同样,如果你试图在它的基础上进一步构建,代码会变得困惑。

希望这能奏效。现在我还没有想通这个数学问题。两个重复的键组合可能会产生与另一个键表示相同的值,只需将字典键 213 替换为例如元组键,例如 self.key_table = {(107, 106) : 'a'} 代表 k+j

一些好处:

  • 无需跟踪延误情况
  • react 迅速
  • 任何键都可以变成修改器或映射到自定义键盘布局,这意味着您可以单独将 QWERTY 变成 DWORAK 用于此应用程序。不知道您为什么想要那个,但是嘿..不关我的事:D
  • 覆盖默认键盘输入,因此您可以拦截它们并用它们做任何您想做的事。

编辑:一个很酷的功能是注册每个键,但用连接的组合替换最后一个字符。同样,这都是手动工作,因为键盘不打算进行双键表示,而且它更多一个图形化的想法..但是会很酷:)

关于python - 如何编写双键按下程序,使非修饰键在我的程序中表现得像修饰键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41465246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com