2

我的应用程序有一个类似 shell 的控制台,它在每个命令后都会提示“>>>”。问题是每次我有我的 shell WriteText(">>> ") 时,它也会添加一个新行。用户可以退格到正确的行,但这看起来很糟糕。有什么办法解决吗?

4

1 回答 1

6

我怀疑你是在声明你TextCtrl的风格wx.TE_PROCESS_ENTER然后绑定EVT_TEXT_ENTER事件 - 只是因为我在尝试时遇到了同样的问题。

我的第一个直觉是编写一个方法来处理wx.EVT_TEXT_ENTER,然后使用该TextCtrl:Remove()方法。不幸的是,这种方法似乎只能删除可见字符。我的下一个想法是使用该EmulateKeyPress()方法和退格 ( WKX_BACK) 来擦除换行符。这可能是可行的,虽然我想不出一个好的方法来欺骗 a wx.KeyEvent(不能只使用event.m_keyCode因为EVT_TEXT_ENTER发送 a CommandEvent,而不是 a KeyEvent)所以我放弃了这种方法......错误,我的意思是这个解决方案被留下作为对读者的练习。

wx.EVT_TEXT_ENTER最终CommandEvent导致了第三个角度,它确实有效。我没有绑定,而是wx.EVT_TEXT_ENTER绑定wx.EVT_CHAR并放入了对密钥进行特殊处理的逻辑Return(ASCII 密钥代码 13)。然后我计划实现EmulateKeyPress()我之前谈到的那个位,但是当我 wx.TE_PROCESS_ENTER从 TextCtrl 样式中删除时,我发现它\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()线路很关键;在我对此进行研究期间,我了解到 aKeyEvent通常后跟 a CharEventCharEvent是字符写入的部分TextCtrl。当您拦截 时KeyEventCharEvent只有在您明确这样做时才会调用 -event.skip()因此,如果您希望您TextCtrl的行为正常,则至关重要。没有它,任何不等于 ASCII 键码 13 的键盘输入都不会执行任何操作。

从我的测试来看,似乎有一些关于声明TextCtrlto 具有样式的东西wx.TE_PROCESS_ENTER,使其在每次调用WriteText(). 尽管在确保插入点始终位于正确的位置等方面,您需要做更多的工作,但我的方法可以解决这个问题。

祝你好运!

于 2011-03-06T03:44:19.993 回答