вывод только для чтения, ввод редактируемый с помощью wx.textctrl? - PullRequest
1 голос
/ 20 января 2011

Привет, ребята,

Я использую wxpython для разработки графического интерфейса для настройки программного обеспечения, запуска и взаимодействия.Я хочу, чтобы что-то вроде окна оболочки CLI (например, pycrust), встроенного в GUI, взаимодействовало с долговременным фоновым процессом.Я мог бы дать ввод через это окно оболочки и распечатать вывод в этом окне.Мой текущий код работает очень хорошо.Но есть проблема стиля редактирования, потому что wx.TextCtrl - это просто редактируемое текстовое окно.Например, я могу перезаписать или удалить любые предыдущие текстовые символы или ввести новый ввод в любом месте.Это не желательно.

Как я могу сделать wx.TextCtrl похожим на окно оболочки, то есть сделать вывод доступным только для чтения, оставив ввод редактируемым?например,

1) при вводе новой команды позиция начинается только после запроса.

2) Пользователь не может изменить или заменить любой предыдущий выводимый текст.Я хочу навязать определенные ограничения для целей взаимодействия.

Есть ли способ исправить проклятие?Если так, то моя проблема будет решена, потому что у пользователя не будет возможности сдвинуть проклятие.

Или есть способ установить определенную часть текста (вывод и подсказку) только для чтения?

Или другое решение, благодаря ответу 9000, состоит в том, что я делаю сетку окон(StaticTextCtrl или только для чтения TextCtrl для вывода в верхнем окне; приглашение «>>>» в нижней левой области; редактируемое окно невидимой границы или диалоговое окно ввода в нижней правой области для ввода).

есть предложения?Есть ли лучший выбор?Большое спасибо!

Ответы [ 3 ]

1 голос
/ 21 января 2011

Вы можете использовать какой-нибудь входной буфер.

Захватывать каждое событие wx.EVT_KEY_DOWN из TextCtrl.Если это комбинация клавиш, которая производит символ, добавьте его в буфер и дайте ему пройти.Если это пробел, удалите последний символ из буфера и разрешите его, или если в буфере не осталось символов, не разрешайте его.Это защитит вашу командную строку в текущей строке.

Вам также придется обращаться к каждому событию клавиатуры или мыши, которое может изменить положение курсора.Если вы не хотите, чтобы пользователь мог перемещать курсор в пределах текущей строки или переходить к предыдущим строкам, вам придется обнаруживать и отменять клавиши со стрелками, home, end, page up, page 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()

Удачи!

1 голос
/ 22 января 2011

Просто отслеживайте местоположение подсказки каждый раз, когда вы ее отображаете.Перехватывать все нажатия и отпускание клавиш и, если что-то вызывает текст перед изменением запроса, наложить вето на это событие.Это не так сложно, просто требуется немного внимания к деталям и некоторое усердие, чтобы захватить все события модификации текста.

1 голос
/ 20 января 2011

В нашем продукте есть консоль, состоящая из двух окон редактирования, разделенных тонкой линией.Верхнее окно - это окно вывода, оно доступно только для чтения.Нижнее окно доступно для редактирования.После того как вы написали команду и отправили ее, команда удаляется из нижнего окна и переходит в верхнее окно вместе с выводом команды.

Вы можете щелкнуть верхнее окно, выбрать что-то из негопрокрутите его вверх и т. д., не удаляя команду, которую вы сейчас редактируете, из виду.Затем вы нажимаете на нижнее окно или нажимаете любую клавишу, и элемент управления возвращается к нижнему окну, где вы продолжаете создавать свою следующую команду.

...