wx.EVT_KEY_DOWN-evt.skip()不起作用

时间:2019-11-28 17:43:11

标签: python-3.x wxpython keydown onkeydown wxtextctrl

我在wxpython中创建了一个GUI。我尝试使用wx.EVT_KEY_DOWN。当我按下一个键时,我想知道该键是否更改了messageTxt(不是诸如右键,Shift,Alt等键)。 我在evt.Skip()之前和之后打印messageTxt,但是它没有变化,只有在第二个字符中我才能看到最后的变化。有人知道如何在evt.Skip()之后获得新的messageTxt? 到此为止,我可以比较跳过之前和之后的文本,并得到有变化的结果。 这是一些解释问题的代码。

import wx
from wx.stc import StyledTextCtrl


def On_KeyDown(evt):
    x, y = messageTxt.GetSelection()
    # If something is selected, de-select it
    if x != y:
        messageTxt.SetEmptySelection(y)
    else:
        print("Before skipping", messageTxt.GetText())
        evt.Skip()
        print("After skipping", messageTxt.GetText())


app = wx.App()
frame = wx.Frame(None, -1, title='2', pos=(0, 0), size=(500, 500))
frame.Show(True)
messageTxt = StyledTextCtrl(frame, id=wx.ID_ANY, pos=(0, 0), size=(100 * 3, 100),
                            style=wx.TE_MULTILINE, name="File")

messageTxt.Bind(wx.EVT_KEY_DOWN, On_KeyDown)

app.SetTopWindow(frame)
app.MainLoop()

1 个答案:

答案 0 :(得分:1)

您的问题是EVT_KEY_DOWN 正在运行。
按下按键事件在识别按键本身之前发生。
您应该检查EVT_KEY_UP,然后测试一下special键。

import wx
from wx.stc import StyledTextCtrl

def On_KeyDown(evt):
    x, y = messageTxt.GetSelection()
    # If something is selected, de-select it
    if x != y:
        messageTxt.SetEmptySelection(y)
    else:
        evt.Skip()

def On_KeyUp(evt):
    print("Text :", messageTxt.GetText())
    k = evt.GetKeyCode()
    if k in (wx.WXK_SHIFT,wx.WXK_ALT,wx.WXK_CONTROL,wx.WXK_DOWN):
        print('Special key')
    evt.Skip()

app = wx.App()
frame = wx.Frame(None, -1, title='2', pos=(0, 0), size=(500, 500))
frame.Show(True)
messageTxt = StyledTextCtrl(frame, id=wx.ID_ANY, pos=(0, 0), size=(100 * 3, 100),
                            style=wx.TE_MULTILINE, name="File")

messageTxt.Bind(wx.EVT_KEY_DOWN, On_KeyDown)
messageTxt.Bind(wx.EVT_KEY_UP, On_KeyUp)

app.SetTopWindow(frame)
app.MainLoop()

但是,您需要将这些功能分离为wx.EVT_KEY_UP和wx.EVT_KEY_DOWN功能,否则它们将相互交叉使用,即密钥更改测试有效且选择失败,反之亦然。

您可能误会了wx.event.Skip()

  

跳过(自我,跳过=真实)   可以在事件处理程序内部使用此方法来控制在当前事件返回后是否将调用与该事件绑定的其他事件处理程序。

     

没有Skip(或者等效地,如果使用Skip(false)),将不再处理该事件。如果调用Skip(true),则事件处理系统将继续搜索该事件的其他处理函数,即使该事件已在当前处理函数中进行处理。

     

通常,建议跳过所有非命令事件以允许进行默认处理。但是,通常不跳过命令事件,因为通常只有一个处理程序才能处理单个命令,例如单击按钮或选择菜单项。