Предотвращение новой строки после 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()
, Мой путь обходит это, хотя у вас будет больше работы, чтобы убедиться, что точка вставки всегда находится в нужном месте и т. Д.
Удачи!