我在wxpython中创建了一个gui。我尝试使用wx。EVT_KEY_DOWN。当我按下一个键时,我想知道这个键是否改变了 messageTxt(它不是一个键,如右、shift、alt 等...... 我在 evt 之前和之后打印消息Txt。跳过(( 但它没有改变,只有在第二个字符中我可以看到最后的更改。有人知道如何在 evt 之后获得新消息Txt。跳过((? 这样,我可以比较跳过之前和之后的文本,并得到结果,它发生了变化。 下面是一些解释该问题的代码。
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()
你的问题是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()
跳过(self, skip=True( 此方法可以在事件处理程序内部使用,以控制在当前事件处理程序返回后是否调用绑定到此事件的进一步事件处理程序。
如果没有 Skip(或者等效地使用 Skip(false(,则不再处理该事件。如果调用 Skip(true(,事件处理系统将继续为此事件搜索进一步的处理程序函数,即使它已在当前处理程序中处理。
通常,建议跳过所有非命令事件以允许进行默认处理。但是,通常不会跳过命令事件,因为通常单个命令(如按钮单击或菜单项选择(必须仅由一个处理程序处理。