输出只读,输入可编辑与wx.textctrl?

时间:2011-01-20 13:53:52

标签: shell formatting input wxpython wxwidgets

嗨,伙计们,

我正在使用wxpython开发用于软件配置,启动和交互的GUI。我希望嵌入GUI内部的CLI shell窗口(如pycrust)与长期运行的后台进程交互。我可以通过这个shell窗口输入输入并在此窗口上打印输出。我目前的代码非常有效。但是存在编辑样式的问题,因为wx.TextCtrl只是一个可编辑的文本窗口。例如,我可以覆盖或删除任何以前的文本字符或在任何位置键入新输入。这是不可取的。

如何使wx.TextCtrl像shell窗口一样,即使输出只读,同时保持输入可编辑?如,

1)输入新命令时,该位置仅在提示后开始。

2)用户无法更改或替换任何以前的输出文本。 为了交互目的,我想强制某些限制。

有没有办法修复诅咒提示?如果是这样,那么我的问题将得到解决,因为用户将没有机会移动诅咒。

或者有没有办法只读取文本的某些部分(输出和提示)?

或者另一个解决方案,感谢9000的答案,就是我制作一个窗口网格(一个StaticTextCtrl或只读TextCtrl用于在上部窗口输出;提示“>>>”在左下方区域;隐藏 - 边框右下方区域的边框可编辑窗口或输入对话框)。

有什么建议吗?还有更好的选择吗? 非常感谢!

3 个答案:

答案 0 :(得分:1)

在我们的产品中,我们有一个由两个编辑窗口组成的控制台,由细线分隔。上部窗口是输出窗口,它是只读的。下部窗口是可编辑的。一旦你在其中编写了一个命令并提交了它,就会从下面的窗口中删除命令并进入上面的窗口以及命令的输出。

您可以单击上方窗口,从中选择内容,向上滚动等,而无需删除当前正在编辑的命令。然后单击下方窗口或按任意键,控件返回到下方窗口,您可以在那里继续制作下一个命令。

答案 1 :(得分:1)

您可以考虑使用某种输入缓冲区。

从TextCtrl捕获每个wx.EVT_KEY_DOWN事件。如果是产生角色的击键,请将其附加到缓冲区并让它通过。如果它是退格键,则从缓冲区中删除最后一个字符并允许它,或者如果缓冲区中没有剩余字符,则不允许它。这将保护当前行上的命令提示符。

您还必须解决可能重新定位光标的每个键盘或鼠标事件。如果您不希望用户能够在当前行内移动光标或移动到上一行,则必须检测并取消箭头键,主页,结束,向上翻页,向下翻页,鼠标单击,等完全锁定可能很难。

防止击键的示例:

    # inside your Frame init function...
    self.text = wx.TextCtrl(self.panel, wx.ID_ANY, style=wx.TE_MULTILINE)
    self.text.Bind(wx.EVT_KEY_DOWN, self.OnKey)
    # ...

def OnKey(self, evt):
    # keycodes for arrow keys, page up/down
    KEYS_TO_CANCEL = [314, 315, 316, 317, 366, 367]

    keycode = evt.GetKeyCode()

    if keycode in KEYS_TO_CANCEL:
        print('Cancelled!')
    else:
        evt.Skip()
祝你好运!

答案 2 :(得分:1)

每次显示提示时,只需跟踪提示的位置即可。拦截所有按键和释放,如果在更改提示之前有任何原因导致文本,则否决该事件。它并不难,只需要注意细节和一些勤奋来捕捉所有文本修改事件。