在wxpython之后阻止换行文本Ctrl.WriteText()

2024-05-05 05:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 用户命令gt应用程序shell办法writetext
1条回答
网友
1楼 · 发布于 2024-05-05 05:29:48

我怀疑您将您的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不再被秘密添加。代码如下:

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后面通常是CharEventCharEvent是字符写入TextCtrl的部分。当您截获KeyEvent时,CharEvent只有在显式地这样做的情况下才会被调用-event.skip()因此,如果您希望您的TextCtrl正常工作,那么CharEvent是至关重要的。没有它,任何不等于ASCII键码13的键盘输入都不会起任何作用。

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

祝你好运!

相关问题 更多 >