2017-02-05 2 views
1

Я пытаюсь улучшить виджет Tkinter Text и предоставить дополнительные возможности.Как получить виджет Tkinter?

Одной из ключевых особенностей моего нового виджета является взломать стрелки/нажатия клавиш клавиатуры (подсветка синтаксиса, автоматическое заполнение контекстных меню).

Я попытался применить метод Key и Up/Down к методам прямого подхода, но этот подход не удался, поскольку обработчики методов были выполнены до обработчиков событий Text, поэтому мои методы были выполнены до последнего нажатия клавиши, обрабатываемого самим текстом ,

class Editor(Frame): 
    def __init__(self, parent, *args, **kwargs): 
     Frame.__init__(self, parent)  # initialize the base class 

     # The Main Text Widget 
     self.text = scrolledtext.ScrolledText(self, *args, **kwargs) 
     self.text.pack(side='left', fill='both', expand=1) 

     self.text.bind("<Key>", lambda event: self.editor_key_handler()) 
     self.text.bind("<Up>", lambda event:self.editor_arrow_key_handler('Up')) 
     self.text.bind("<Down>", lambda event: self.editor_arrow_key_handler('Down')) 

Затем я попытался изменить порядок bindtag и сделать обработчик класса запустить первый, то мои обработчики экземпляра - это действительно исправили оригинальный вопрос:

 bindtag = list() 
     bindtag.append(self.text.bindtags()[1]) 
     bindtag.append(self.text.bindtags()[0]) 
     bindtag.append(self.text.bindtags()[2]) 
     bindtag.append(self.text.bindtags()[3]) 
     self.text.bindtags(bindtag) 

Но теперь, как мои обработчики выполнялись после того, как Text ... мои обработчики Up/Down были запущены после того, как курсор вставки уже перемещен внутри Text, потеряв исходную позицию, где пользователь нажал стрелки вверх/вниз.

Будучи опытным Perl Tk программист, я переехал вместе, чтобы попытаться вывести текстовый виджет Tkinter, чтобы позволить мне угон/вниз обработчик по умолчанию Up и предоставить свои собственные индивидуальные методы ..

я не нашел способ просто вывести и переопределить виджет «Текст» (что-то кажется тривиальным для системы ООП.)

Как это можно сделать?

+0

Возможно, вам нужно '' – furas

+0

@furas: это вызывает раздражающую задержку между нажатиями клавиш и обработчиком (подсветка синтаксиса), а также не поддерживает удерживание клавиши (повторное нажатие клавиши на окнах10) – NirMH

ответ

2

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

В следующем примере я добавил пользовательский обработчик стрелки вверх, вставив «" вместо того, чтобы выполнять поведение по умолчанию. Обратите внимание, что обработчик возвращает строку «разрыв»:

import tkinter as tk 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.text = tk.Text(root) 
     self.text.pack(fill="both", expand=True) 

     self.text.bind("<Up>", self.handle_up) 

    def handle_up(self, event): 
     self.text.insert("insert", "<up>") 
     return "break" 

root = tk.Tk() 
Example(root).pack(fill="both", expand=True) 
root.mainloop() 

Для длительного описания того, что происходит, когда ключ обрабатываются см этого ответа: https://stackoverflow.com/a/11542200/7432. Ответ на вопрос о Entry виджетах, но обработка событий одинакова для всех виджетов.

Смежные вопросы