2024-05-05 05:29:48 发布
网友
我的应用程序有一个类似shell的控制台,在每个命令后都会提示“>>>;”。问题是每次我有shell WriteText(“>;>>;”),它也会附加一个新行。用户可以退格到正确的行,但这看起来很糟糕。有办法解决吗?在
我怀疑您将您的TextCtrl声明为样式wx.TE_PROCESS_ENTER,然后绑定EVT_TEXT_ENTER事件-只是因为我在尝试时遇到了相同的问题。
TextCtrl
wx.TE_PROCESS_ENTER
EVT_TEXT_ENTER
我的第一反应是编写一个处理wx.EVT_TEXT_ENTER的方法,然后使用TextCtrl:Remove()方法。不幸的是,这个方法似乎只删除可见字符。我的下一个想法是使用EmulateKeyPress()方法和退格(WKX_BACK)来删除换行符。这可能是可行的,尽管我不能想出一个好的方法来欺骗wx.KeyEvent(不能仅仅使用event.m_keyCode,因为EVT_TEXT_ENTER发送CommandEvent,而不是KeyEvent),所以我放弃了这种方法。。。呃,我的意思是这个解决方案留给读者作为练习。
wx.EVT_TEXT_ENTER
TextCtrl:Remove()
EmulateKeyPress()
WKX_BACK
wx.KeyEvent
event.m_keyCode
CommandEvent
KeyEvent
wx.EVT_TEXT_ENTER作为一个CommandEvent最终导致了第三个角度的工作。我没有绑定wx.EVT_TEXT_ENTER,而是绑定了wx.EVT_CHAR,并对Return键(ASCII密钥代码13)进行了特殊处理。然后,我计划实现我前面提到的EmulateKeyPress()位,但是当我从textcrl样式中删除wx.TE_PROCESS_ENTER时,我发现\n不再被秘密添加。代码如下:
wx.EVT_CHAR
Return
\n
import wx class TestRun(wx.Frame): def __init__(self,parent): wx.Frame.__init__(self, parent, title="StackO Test", size=(400,400)) self.control = wx.TextCtrl(self, id=wx.ID_ANY, style=wx.TE_MULTILINE) self.control.Bind(wx.EVT_CHAR, self.OnPress) self.Show(True) def OnPress(self, event): if event.GetKeyCode() == 13: self.control.WriteText('\n>>>') else: event.Skip() if __name__ == '__main__': app = wx.App(False) TestRun(None) app.MainLoop()
event.Skip()行是至关重要的;在我对此进行研究的过程中,我了解到KeyEvent后面通常是CharEvent。CharEvent是字符写入TextCtrl的部分。当您截获KeyEvent时,CharEvent只有在显式地这样做的情况下才会被调用-event.skip()因此,如果您希望您的TextCtrl正常工作,那么CharEvent是至关重要的。没有它,任何不等于ASCII键码13的键盘输入都不会起任何作用。
event.Skip()
CharEvent
event.skip()
从我的测试中,似乎有一些关于声明TextCtrl以具有样式wx.TE_PROCESS_ENTER的内容,这使得它在每次调用WriteText()之后打印一个新行。我的方法可以解决这个问题,但是你需要做更多的工作来确保插入点总是在正确的位置,等等
WriteText()
祝你好运!
我怀疑您将您的
TextCtrl
声明为样式wx.TE_PROCESS_ENTER
,然后绑定EVT_TEXT_ENTER
事件-只是因为我在尝试时遇到了相同的问题。我的第一反应是编写一个处理
wx.EVT_TEXT_ENTER
的方法,然后使用TextCtrl:Remove()
方法。不幸的是,这个方法似乎只删除可见字符。我的下一个想法是使用EmulateKeyPress()
方法和退格(WKX_BACK
)来删除换行符。这可能是可行的,尽管我不能想出一个好的方法来欺骗wx.KeyEvent
(不能仅仅使用event.m_keyCode
,因为EVT_TEXT_ENTER
发送CommandEvent
,而不是KeyEvent
),所以我放弃了这种方法。。。呃,我的意思是这个解决方案留给读者作为练习。wx.EVT_TEXT_ENTER
作为一个CommandEvent
最终导致了第三个角度的工作。我没有绑定wx.EVT_TEXT_ENTER
,而是绑定了wx.EVT_CHAR
,并对Return
键(ASCII密钥代码13)进行了特殊处理。然后,我计划实现我前面提到的EmulateKeyPress()
位,但是当我从textcrl样式中删除wx.TE_PROCESS_ENTER
时,我发现\n
不再被秘密添加。代码如下:event.Skip()
行是至关重要的;在我对此进行研究的过程中,我了解到KeyEvent
后面通常是CharEvent
。CharEvent
是字符写入TextCtrl
的部分。当您截获KeyEvent
时,CharEvent
只有在显式地这样做的情况下才会被调用-event.skip()
因此,如果您希望您的TextCtrl
正常工作,那么CharEvent
是至关重要的。没有它,任何不等于ASCII键码13的键盘输入都不会起任何作用。从我的测试中,似乎有一些关于声明
TextCtrl
以具有样式wx.TE_PROCESS_ENTER
的内容,这使得它在每次调用WriteText()
之后打印一个新行。我的方法可以解决这个问题,但是你需要做更多的工作来确保插入点总是在正确的位置,等等祝你好运!
相关问题 更多 >
编程相关推荐