несменный текст в ткинтер - PullRequest
4 голосов
/ 11 октября 2011

вот код:

from Tkinter import *

class Main(object):

    def __init__(self):
        self.console = Text(root, relief='groove', cursor='arrow', spacing1=3)
        self.console.insert(INSERT, '>>> ')
        self.console.focus_set()
        self.scroll = Scrollbar(root, cursor='arrow', command=self.console.yview)
        self.console.configure(yscrollcommand=self.scroll.set)

        self.scroll.pack(fill='y', side='right')
        self.console.pack(expand=True, fill='both')

root = Tk()
root.geometry('%sx%s+%s+%s' %(660, 400, 40, 40))
root.option_add('*font', ('Courier', 9, 'bold'))
root.resizable(0, 1)
app = Main()
root.mainloop()

Есть ли какой-нибудь способ заставить '>>>' стать неустранимым (как, например, в IDLE)? заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Посмотрите на исходный код IDLE.В частности, посмотрите на «smart_backspace_event» в EditorWindow.py.IDLE связывает <Key-Backspace> в текстовом виджете с этой функцией (косвенно через событие <<smart-backspace>>).

Основной код, который вам понадобится, выглядит следующим образом:

chars = console.get("insert linestart", "insert")
# [Do some analysis on "chars" to detect >>> and prevent a backspace]

if DO_BACKSPACE: 
    console.delete("insert-1c", "insert")

# "break" is important so that the Text widget's backspace handler doesn't get called
return "break"
2 голосов
/ 12 октября 2011

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

Другое решение, которое является более пуленепробиваемым, состоит в том, чтобы перехватить низкоуровневые команды вставки и удаления tkinter и проверить наличие некоторых условий. Например, см. Ответ на вопрос https://stackoverflow.com/a/11180132/7432.. Этот ответ предоставляет общее решение, которое можно использовать для подсказки (как об этом спрашивается в этом вопросе) или для пометки любых разделов текста только для чтения.

1 голос
/ 11 октября 2011

'>>>', отображаемое в IDLE, является частью вывода интерпретатора Python. Я думаю, что вы можете попробовать прослушать <Key> события и восстановить подсказку при необходимости (см. http://docs.python.org/library/tkinter.html#bindings-and-events и http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...