2012-03-31 40 views
1

我希望能夠在Tkinter Text小部件中雙擊test,
,並讓它選擇測試(並排除逗號)。如何修改Tkinter Text小部件中的當前選擇長度?

這裏是我試過:

import Tkinter as tk 

def selection_mod(event=None): 
    result = aText.selection_get().find(',') 
    if result > 0: 
     try: 
      aText.tag_add("sel", "sel.first", "sel.last-1c") 
     except tk.TclError: 
      pass 

lord = tk.Tk() 

aText = tk.Text(lord, font=("Georgia", "12")) 
aText.grid() 

aText.bind("<Double-Button-1>", selection_mod) 

lord.mainloop() 

的第一個問題是<Double-Button-1>似乎觸發處理程序作出選擇之前,生產:

TclError: PRIMARY selection doesn't exist or form "STRING" not defined

第二個問題是,即使使用有效的綁定,
我的選擇標籤似乎沒有做任何事情。
它甚至沒有提出錯誤,我試過沒有except tk.TclError:

回答

1

您的綁定發生在默認綁定發生之前。因此,當您的綁定觸發時,選擇不存在。由於您的綁定嘗試獲取選擇,因此會失敗並顯示您看到的錯誤。

您將需要安排綁定在類綁定之後發生。一個便宜的黑客就是使用after來執行你的代碼,一旦默認綁定有機會工作。或者,您可以使用bindtag功能確保您的綁定在默認綁定之後觸發。

第二個問題是,在設置新設置之前,您不清除舊選擇。您需要執行tag_remove以首先刪除現有的選擇。否則,逗號(如果以某種方式選中)將保持選中狀態,因爲您所做的只是將標籤重新應用於已有標籤的文本。

但是,雙擊通常不會捕獲逗號,所以我不太理解您的代碼的重點。至少,當我在OSX上測試它時,它不包含逗號。

1

這裏是我想出了感謝布萊恩的回答是:

import Tkinter as tki # tkinter in Python 3 

def selection_mod(event=None): 
    result = txt.selection_get().find(',') 
    if result > 0: 
     fir, sec = txt.tag_ranges("sel") 
     txt.tag_remove("sel", "sel.first", "sel.last") 
     txt.tag_add("sel", fir, str(sec)+"-1c") 

root = tki.Tk() 

txt = tki.Text(root, font=("Georgia", "12")) 
txt.grid() 

txt.bind("<Double-Button-1>", lambda x: root.after(20, selection_mod)) 

root.mainloop() 

值得一提的是,我使用的是Windows 7,並根據布萊恩,
OSX沒有你的時候包含逗號雙擊一個字。

+0

我最近發現瞭如何設置用tcl選擇的字符。 [鏈接](http://stackoverflow.com/a/28133301/1217270) – 2015-01-26 23:17:04

相關問題