отключить сочетание клавиш tkinter (2) - PullRequest
1 голос
/ 25 июля 2011

Я предлагаю продолжить обсуждение в отключить сочетание клавиш tkinter : у меня есть обработчик событий для события, которое также использует Tkinter, так что мои проги и Tkinter плохо взаимодействуют.

Так как это проблема, которую я не смог решить, я перехожу сюда, где я попытался свести ее к простейшей форме в следующем коде:

#!/usr/bin/env python

from Tkinter import *
import tkFont

def init():
    global root,text

    root = Tk()
    root.geometry("500x500+0+0")
    dFont=tkFont.Font(family="Arial", size=10)

    text=Text(root, width=16, height=5, font=dFont)
    text.pack(side=LEFT, fill=BOTH, expand = YES)

    root.bind("<Control-b>", setbold)

    text.tag_config("b",font=('Verdana', '10', 'bold' ))
    text.tag_config("i",font=('Verdana', '10', 'italic' ))

def removeformat(event=None):
    text.tag_remove('b',SEL_FIRST,SEL_LAST)
    text.tag_remove('i',SEL_FIRST,SEL_LAST)

def setbold(event=None):
    removeformat()
    text.tag_add('b', SEL_FIRST,SEL_LAST)
    text.edit_modified(True)

def main():
    init()        
    mainloop()


if __name__ == '__main__':
    main()

Что этоНужно просто создать текстовое окно, в которое вы пишете.Выделив какой-либо текст и нажав Ctrl + B , программа должна удалить любой ранее существовавший тег, а затем присвоить ему тег 'b', который устанавливает жирный текст.

То, что вместо этого происходит, является исключениемна первом tag_remove, говоря мне, что text doesn't contain any characters tagged with "sel".

Предложение использовать return 'break' бесполезно, так как выбор исчезает до того, как setbold() имеет какие-либо шансы действовать ...

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Установите свою привязку на текстовом виджете, а не в корне. (Привязки всего верхнего уровня обрабатываются после привязок класса виджета - где стандартная привязка <Control-Key-b> - и они обрабатываются после привязок экземпляра виджета, что вы и хотите использовать здесь .) И тебе нужно это сделать 'break'; это запрещает последующие привязки. (Если после этого у вас возникнут какие-либо проблемы, возможно, фокус по умолчанию неправильный, но это легко исправить.)

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

2 голосов
/ 25 июля 2011

Привязки обрабатываются в определенном порядке, определенном bindtags этого виджета.По умолчанию этот порядок:

  1. Определенный виджет
  2. Класс виджета
  3. Окно верхнего уровня
  4. Специальный класс "all"

Если существуют конфликтующие привязки - например, привязка control-b как для виджета, так и для класса - они оба сработают (в описанном порядке), если вы не разорвете цепочку, возвращая "break",

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

Самое простое решениеэто переместить вашу привязку к фактическому виджету и вернуть "break".Это будет гарантировать, что сначала сработает привязка, а return "break" гарантирует, что привязка класса не сработает.

Если вы действительно хотите привязку к корневому окну, вы можете удалить привязку для класса, используя bind_class метод со значением "Text" для класса.

Может оказаться полезной страница События и привязки на effbot.org.

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