我有一个使用 tkinter 和键绑定的 python 程序。该程序调用外部程序,然后询问如何处理它,期望 n 键表示“否”,或 y 键表示“是”。问题:如果我按允许的键两次,第二个键将被存储并稍后处理 - 因此是错误的问题。
import tkinter as tk
import time
class App:
counter = 0
def __init__(self, master): # Constructor
# build GUI
self.label = tk.Label(text="Press <space>", width=40)
self.label.grid(row=1, column=1, sticky='w')
# bind keys to buttons
master.bind('<Key-space>', self.keyPressed)
pass # __init__
def keyPressed(self, event):
print("Step 1")
self.counter = self.counter + 1
self.label.configure(text = str(self.counter))
self.label.update()
time.sleep(3)
print("Step 2")
pass # Key1Pressed
# End of class App
root = tk.Tk()
root.option_add('*font', ('Arial', 11, 'bold')) …Run Code Online (Sandbox Code Playgroud) 铬 (52):
当打开大写锁定时 - 仅触发 keydown(keyUp 或 keyPress 中没有事件)
当关闭大写锁定时 - 仅触发 keyup(keyDown 或 keyPress 中没有事件)
火狐 (46):
对于大写锁定打开和关闭,仅触发 keyDown 事件(无 keyUp 或 keyPress)
我在这里阅读了有关 keyCodes 和事件的信息http://www.quirksmode.org/js/keys.html以及 MDN 中的内容https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent /keyCode, aaa 和这里http://unixpapa.com/js/key.html
但以上链接都没有讨论这种奇怪的行为。这是预期的吗?如果是这样,有什么更简单的方法可以处理吗?
是否可以在不使用KeyboardEvent的情况下检查按下的键?
我有一个名为enterFrameHandler的ENTER_FRAME事件设置,如果按下任何键,我想在函数enterFrameHandler中检查.
使用的KeyboardEvent正常时,我可以检查很容易使用,检查事件的邀请码开关按键,但在一个ENTER_FRAME事件,这是不可能的我.
还有其他方法可以在ENTER_FRAME事件中检查键盘的状态吗?
更新:我发现了这个AS2脚本:
onClipEvent (enterFrame) {
if (Key.isDown(Key.LEFT)) {
_x -= power;
}
if (Key.isDown(Key.RIGHT)) {
_x += power;
}
if (Key.isDown(Key.UP)) {
_y -=power;
}
if (Key.isDown(Key.DOWN)) {
_y +=power;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎正在做我想要的,但它在AS2中,有没有人知道如何将其"翻译"为AS3?
在Qt中,要么实现keyPressEvent或创建QAction并为其分配一个组合键,我就可以根据键盘进行操作.
通常首选哪种方法?
我正在尝试使用InputMap/ActionMap拦截删除键.我让它与Enter一起工作,但它似乎没有回复删除(这是在Mac OSX上,所以我想知道这是否是问题的一部分).
我究竟做错了什么?
private void setupKeyBindings(final JList jlist) {
String delAction = "deleteItems";
KeyStroke delKey = KeyStroke.getKeyStroke("DELETE");
jlist.getInputMap().put(delKey, delAction);
jlist.getActionMap().put(delAction, new AbstractAction()
{
@Override public void actionPerformed(ActionEvent e) {
System.out.println("delete pressed");
doDelete(jlist);
}
});
String enterAction = "useItems";
KeyStroke enterKey = KeyStroke.getKeyStroke("ENTER");
jlist.getInputMap().put(enterKey, enterAction);
jlist.getActionMap().put(enterAction, new AbstractAction()
{
@Override public void actionPerformed(ActionEvent e) {
System.out.println("enter pressed");
}
});
}
Run Code Online (Sandbox Code Playgroud) 我无法将Control-Backspace键映射到KeyStroke.以下对我没有意义.
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
public class TestControlBackspace {
public static void main(String[] args) {
KeyStroke ks1 = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_CONTROL);
KeyStroke ks2 = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, KeyEvent.VK_SHIFT);
KeyStroke ks3 = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0);
System.out.println(ks1);
System.out.println(ks2);
System.out.println(ks3);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
按下BACK_SPACE
按下BACK_SPACE
按下BACK_SPACE
我在这里错过了什么吗?
我最近开始开发一个小的JavaScript游戏,只是为了好玩.我的想法是你在屏幕上的一个方框内用箭头键(或者awsd或者我不关心什么)控制了一个小点.然后,小矩形会随机产生在盒子的所有边缘上并在其上方前进.你必须避免与他们接触.事实证明这个项目比我预期的要困难,我无法让这项运动正常运转.如果你可以帮助我那将是伟大的.此外,随意采取这个概念,到目前为止我做了什么,并做任何你想做的事情.我很想看到你的结果.下面是我用于没有任何移动脚本的产生的代码.我正在使用此代码的基本思想来进行运动:
var x = 5; //Starting Location - left
var y = 5; //Starting Location - top
var dest_x = 300; //Ending Location - left
var dest_y = 300; //Ending Location - top
var interval = 2; //Move 2px every initialization
function moveImage() {
//Keep on moving the image till the target is achieved
if(x<dest_x) x = x + interval;
if(y<dest_y) y = y + interval;
//Move the image to the new location
document.getElementById("ufo").style.top = y+'px';
document.getElementById("ufo").style.left = x+'px';
if …Run Code Online (Sandbox Code Playgroud) 我有以下可视树:
<DockPanel>
<TextBox Name="ElementWithFocus" DockPanel.Dock="Left" />
<ListBox DockPanel.Dock="Left" Width="200" KeyUp="handleListBoxKeyUp">
<ListBoxItem>1</ListBoxItem>
<ListBoxItem>4</ListBoxItem>
<ListBoxItem>3</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
</ListBox>
<TextBox DockPanel.Dock="Left" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
handleListBoxKeyUp 如下:
private void handleListBoxKeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
((UIElement)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
Run Code Online (Sandbox Code Playgroud)
当ListBox有键盘焦点(实际上是ListBoxItem我猜)时,按下Enter将焦点移动到第一个ListBox而不是下面的项目TextBox.为什么会发生这种情况,我怎样才能获得Enter像Tab这里一样的关键?
我在乒乓球游戏中遇到SDL 2.0键盘输入问题.当我按左箭头命令向左移动时,它由SDL_PollEvents()处理,如果按下键一次,则响应正确.但是,如果我按下按键,我会在连续移动之前得到短暂的延迟(只要Windows键重复延迟).
这是函数处理事件:
void Event::PlayerEvent (Player &player)
{
while (SDL_PollEvent (&mainEvent))
{
switch (mainEvent.type)
{
case SDL_KEYDOWN :
switch (mainEvent.key.keysym.sym)
{
case SDLK_ESCAPE :
gameRunning = false;
break;
case SDLK_LEFT :
player.moving = player.left;
break;
case SDLK_RIGHT :
player.moving = player.right;
}
break;
case SDL_QUIT :
gameRunning = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:毕竟,我设法通过在程序开始时调用SystemParametersInfo(SPI_SETKEYBOARDDELAY,0,0,0)和最后调用SystemParametersInfo(SPI_SETKEYBOARDDELAY,1,0,0)来修复此问题,以返回到标准键重复延迟.
我正在研究Godot Engine和GDScript,并且我在互联网上搜索了有关键盘事件的信息,但我听不懂。Godot中是否有类似的东西on_key_down("keycode")?