предотвращение новой строки после wxpython TextCtrl.WriteText () - PullRequest
2 голосов
/ 05 марта 2011

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

1 Ответ

6 голосов
/ 06 марта 2011

Я подозреваю, что вы заявляете, что ваш 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()

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

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

Удачи!

...