我的应用程序有一个类似shell的控制台,提示“>>>”在每个命令之后。问题是每次我有我的shell WriteText(“>>>”),它还会附加一个新行。用户可以退格到正确的行,但这看起来很糟糕。有什么办法解决吗?
答案 0 :(得分:6)
我怀疑你宣布你的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
,而不是a KeyEvent
)所以我放弃了这种方法......呃,我的意思是这个解决方案留给了读者。
wx.EVT_TEXT_ENTER
作为CommandEvent
最终导致第三个角度发挥作用。我没有绑定wx.EVT_TEXT_ENTER
,而是绑定wx.EVT_CHAR
并使用Return
密钥(ASCII密钥代码13)进行特殊处理。然后我计划实现我之前谈到的EmulateKeyPress()
位,但当我从TextCtrl样式中删除wx.TE_PROCESS_ENTER
时,我发现\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
以其他方式正常行事,则TextCtrl
至关重要。没有它,任何不等于ASCII键码13的键盘输入都不会做任何事情。
在我的测试中,似乎有一些事情声明wx.TE_PROCESS_ENTER
有样式WriteText()
,使其在每次调用{{1}}后打印换行符。我的方法可以解决这个问题,但是你需要做更多的工作来确保插入点总是在正确的位置等等。
祝你好运!