Предотвращение новой строки после wxpython TextCtrl.WriteText()

У меня есть консольная оболочка для моего приложения, которая запрашивает ">>>" после каждой команды. Проблема в том, что каждый раз, когда у меня есть оболочка WriteText(">>> "), она также добавляет новую строку. Пользователь может вернуться на правильную линию, но это выглядит просто ужасно. Есть ли способ это исправить?

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() немного я говорил ранее, но когда я удалил 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() линия имеет решающее значение; во время моего исследования этого я узнал, что KeyEvent обычно сопровождается CharEvent, CharEvent это та часть, где персонаж записывается в TextCtrl, Когда вы перехватываете KeyEvent, CharEvent вызывается только если вы делаете это явно - event.skip() Поэтому важно, если вы хотите, чтобы ваш TextCtrl иначе вести себя как обычно. Без него любой ввод с клавиатуры, не равный ASCII-коду 13, ничего бы не сделал.

Из моих тестов выясняется, что в объявлении TextCtrl иметь стиль wx.TE_PROCESS_ENTER что заставляет печатать новую строку после каждого вызова WriteText(), Мой путь обходит это, хотя у вас будет больше работы, чтобы убедиться, что точка вставки всегда находится в нужном месте и т. Д.

Удачи!

Другие вопросы по тегам