这绝不像看起来那么明显。
下面的代码,使用“one-shot”wx.Timer在 250 毫秒后重新设置前一个键,解决“快速连续”的问题。您当然可以将其设置为任何合适的值。
对于旧版本的 wxPython,计时器没有 StartOnce 选项,您必须使用 Start(250, oneShot=True)
我通过允许Shift 以外的键将其稍微复杂化,并且名称字典仅用于测试目的。
我应该指出,因为这必须检查每个按键按下,它不是很有效,但我想你知道这一点并愿意付出代价。
我确实有一个警告,我不知道按住某个键(例如 shift 键)会如何在非 Linux 机器上做出反应。如果证明它不像Linux,那么你应该将Bind从wx.EVT_KEY_DOWN更改为wx.EVT_KEY_UP。
import wx
import time
class Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ (self, parent, -1, title = "Test Frame", size = (500,360))
self.text_window = wx.TextCtrl(self, wx.ID_ANY, "", size = (450,250), style = wx.TE_MULTILINE)
self.text_window.Bind(wx.EVT_KEY_DOWN, self.key_info)
#Define a timer to reset the key values
self.key_timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.Ontimer, self.key_timer)
#Define storage for the previous key
self.prev_key = 0
#Define the set of double keys we are looking for and a dict of their names
# Shift is 306 (on my keyboard), Alt is 307 and Ctrl is 308
self.double_keys = (306,307,308)
self.names = {'306':'Shift','307':'Alt','308':'Ctrl'}
sizer1= wx.BoxSizer(wx.VERTICAL)
sizer1.Add(self.text_window, 0, wx.ALL, 5)
self.SetSizer(sizer1)
self.Show()
def key_info(self, event):
self.key = event.GetKeyCode()
if self.key in self.double_keys and self.prev_key == self.key:
self.text_window.AppendText("Double key "+self.names[str(self.key)]+" used within a quarter second\n")
self.prev_key = self.key
#fire up the timer to execute once to reset the previous key
if self.key in self.double_keys:
self.key_timer.StartOnce(250)
# Skip so this doesn't consume the key event itself
event.Skip()
def Ontimer(self,event):
# Re-set the previous key after 250 milliseconds
self.prev_key = 0
app = wx.App()
frame = Frame(None)
app.MainLoop()
注意我从您在 cmets 中的谈话中注意到,这不仅是您在 Stack Overflow 上的第一个问题,而且您似乎已经被 cmets 稍微放过。
如果你不提供你的代码,工作或失败很惨,你会吸引反对票。论坛成员喜欢查看代码,特别是您已经尝试过的代码。它基本上只是一个初步指标,表明您是否已经努力自己回答问题,然后再提出一个单行问题并希望其他人为您做腿部工作。
我最近发布了一个自我回答的问题,其中问题和答案一起发布。尽管我为自己的问题提供了详细的编码答案,但我立即收到了对该问题的反对票。所以不要个人认为。我怀疑有些人只是通过严格遵守“规则”来获得成功。
也就是说,如果你坚持 SO 一段时间并自己回答问题,你将开始看到问题中的代码和 MCVE 的优点。您会惊讶于某些人发布的内容并期待答案。