【问题标题】:preventing newline after wxpython TextCtrl.WriteText()在 wxpython TextCtrl.WriteText() 之后防止换行
【发布时间】:2011-07-09 05:28:29
【问题描述】:

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

【问题讨论】:

  • 忘了说,这是wxpython TextCtrl.WriteText() 操作
  • (某处正在添加换行符...找出它在哪里:p)
  • 试过了。是的,真的很糟糕。没有解决办法
  • 添加一些演示问题的最小代码

标签: python wxpython wxwidgets textctrl


【解决方案1】:

我怀疑您将 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() 位,但是当我从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 通常后跟CharEventCharEvent 是字符写入TextCtrl 的部分。当您拦截KeyEvent 时,只有在您明确这样做时才会调用CharEvent - 因此,如果您希望TextCtrl 以其他方式正常运行,event.skip() 就至关重要。没有它,任何不等于 ASCII 键码 13 的键盘输入都不会执行任何操作。

从我的测试来看,似乎有一些关于声明TextCtrl 具有样式wx.TE_PROCESS_ENTER 的内容,这使得它在每次调用WriteText() 后打印一个换行符。我的方法解决了这个问题,尽管您在确保插入点始终位于正确的位置等方面还有更多工作要做。

祝你好运!

【讨论】:

  • 是的,经过一番修修补补后发现了这一点,但答案很好。
  • 也许我的特定设置/案例不完全相同,但我阻止了我的 wx.TextCtrl.write(text) 通过简单地执行 wx.TextCtrl.write(text.rstrip()) 添加换行符,我很惊讶这有效,因为我没有输入任何换行符我自己的text 变量,但显然它们以某种方式由.write() 添加并在我的textvariable 上使用.rstrip() 阻止它这样做。 (不过,@chucksmash 给出了明确而广泛的答案+1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2019-11-29
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多