在wxpython之后阻止换行TextCtrl.WriteText()

Sha*_*nak 2 python wxwidgets wxpython textctrl

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

chu*_*ash 6

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

我的第一直觉是编写一个方法来处理wx.EVT_TEXT_ENTER,然后使用该TextCtrl:Remove()方法.遗憾的是,此方法似乎只删除了可见字符.我的下一个想法是使用EmulateKeyPress()方法和backspace(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()我之前谈到的那个位,但是当我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()
Run Code Online (Sandbox Code Playgroud)

event.Skip()条线至关重要; 在我研究这篇文章的过程中,我了解到a KeyEvent通常会跟着一个CharEvent.该CharEvent是一种字符写入部分TextCtrl.当你拦截时KeyEvent,CharEvent只有当你明确地这样做时才会被调用 - event.skip()因此,如果你希望你的TextCtrl行为正常,那么这是至关重要的.没有它,任何不等于ASCII键码13的键盘输入都不会做任何事情.

从我的测试来看,似乎有一些关于声明TextCtrl具有wx.TE_PROCESS_ENTER使每次调用后打印换行符的样式的东西WriteText().我的方法可以解决这个问题,但是你需要做更多的工作才能确保插入点总是在正确的位置,等等.

祝你好运!