2011-07-13 184 views
1

我有一個事件處理程序,我綁定到Ctrl + H,其中Tkinter也認定爲退格。 儘管我在處理程序的末尾用return 'break'讀過,但我應該停止傳播快捷方式,但它不起作用! 是不是Ctrl + H問題,還是什麼?禁用tkinter鍵盤快捷方式

下面的代碼:

def setheading(event=None): 
    x=tkSimpleDialog.askstring('Set as header line', 'Enter an integer 1-5: ') 
    config.text.tag_add('h'+x, SEL_FIRST,SEL_LAST) 
    return 'break' 
+0

你的問題還不清楚。 control-h在哪裏不正確地操作?在綁定的小部件中,在對話框內的小部件中,還是在某處els?更具體一點,並嘗試包括一個完整的工作示例。有很多方法來處理綁定,所以我們需要儘可能多的細節,你cn給。 –

+0

所有事情都發生在一個Text小部件(名稱:config.text)中。這裏的ctrl-h實際上運行了setheading(),但同時退出了INSERT之前的最後一個字符 – alessandro

+0

也看看這個提交看看我是如何在我的項目中解決它的https://github.com/GrosSacASac/WebSpree/ commit/40bf9da7346397f31767febe3872aba125cfbd42 –

回答

0

我的猜測是,聲明config.text.tag_add(...)拋出一個沒有被捕獲的錯誤。如果是這種情況,return語句將永遠不會執行。如果返回從不執行,則不會阻止類綁定的觸發。

如果在窗口中未選擇文本,則會引發該錯誤。

0

您可能會在根上綁定CTRL + H。

之所以出現這種情況是因爲事件順序出動:

  1. 的widget回調
  2. Widget類回調*
  3. 根回調

    *(這是默認行爲來自)

解決方法是將事件綁定兩次。一旦在文本部件本身上有return "break",並且一旦在根上,以便回調也由其他小部件觸發。小部件上的return "break"將阻止它進入第2階段(下一個階段),其中不需要的默認行爲來自於第2階段。

您可以使用工具這樣一個

def k(handler): 
    """decorates an event handler in such a way 
that the default shortcut command is not triggered 
same as event.preventDefault() in HTML5 but 
as a decorator""" 
    def prevent_default(*event): 
     handler(event) 
     return 'break' 
    return prevent_default 

有關回調的詳細信息相關答案級聯disable tkinter keyboard shortcut (2)

+0

也https://stackoverflow.com/a/3513906/3238046 –