2010-11-01 59 views

Trả lời

7

Đối với một widget Tkinter.Text hoặc Tkinter.Entry, bạn có thể sử dụng:

content = text.selection_get() 

dụ tương tác của việc chọn văn bản cả từ một Entry và từ một widget văn bản trong Python console:

>>> import Tkinter 
>>> w = Tkinter.Tk() 
>>> e = Tkinter.Entry(w) 
>>> e.pack() 
>>> t = Tkinter.Text(w) 
>>> t.pack() 
#(scribble at the widgets in the created window, and select text in the Entry) 
>>> e.selection_get() 
'1234' 
#(select text) 
>>> t.selection_get() 
'1234' 
>>> 

Theo nhận xét của Bryan Oakley:

selection_get là một phương thức widget chung có sẵn cho tất cả các widget. Nó không không phải luôn luôn nhận chuỗi được chọn từ tiện ích Văn bản. Nó có thể, nhưng nó không được bảo đảm. Những gì nó làm là có được những gì được gọi là "X" lựa chọn (từ rễ X11 của tk). Nếu bạn đặt exportselection thành Sai cho tiện ích Văn bản, selection_get sẽ không hoạt động. Vì vậy đề xuất của bạn sẽ hoạt động trong trường hợp bình thường, nhưng không phải trong mọi trường hợp.

+0

Tiện ích văn bản không có phương thức 'selection_get'. –

+0

@BryanOakley: Bạn đang sử dụng phiên bản nào? Tôi đang sử dụng Tkinter đi kèm với Python 2.7, và các widget văn bản của tôi chắc chắn có một 'selection_get'. (Tôi chỉ cố gắng một lần nữa trong một giao diện điều khiển phần chỉ để chắc chắn và nó đã làm việc). – jsbueno

+1

Tôi phải chính xác hơn: chính tiện ích văn bản không có phương thức 'selection_get'. 'selection_get' là một phương thức widget chung có sẵn cho tất cả các widget. Nó không _not_ nhận được chuỗi đã chọn từ một tiện ích văn bản. Nó có thể, nhưng nó không được bảo đảm. Những gì nó làm là có được những gì được gọi là "X" lựa chọn (từ rễ X11 của tk). Nếu bạn đặt 'exportselection' thành False cho tiện ích văn bản,' selection_get' sẽ không hoạt động. Vì vậy đề xuất của bạn sẽ hoạt động trong trường hợp bình thường, nhưng không phải trong mọi trường hợp. –

6

sử dụng phương thức get. Nếu bạn muốn văn bản đã chọn sử dụng các chỉ số SEL_FIRSTSEL_LAST.

[sửa]] một trong các nhận xét đã suy đoán rằng điều này không hiệu quả với Tkinter vì không có thuộc tính "sel". "sel" không phải là thuộc tính, đó là thẻ. Thẻ là một tính năng mạnh mẽ đáng kể của tiện ích văn bản.

Dưới đây là một ví dụ:

import Tkinter as tk 
import tkFont 

class App: 
    def __init__(self): 
     root=tk.Tk() 
     self.text = tk.Text(root) 
     self.text.pack() 
     self.button = tk.Button(root, text="Get Selection", command=self.OnButton) 
     self.button.pack() 
     root.mainloop() 

    def OnButton(self): 
     print "selected text: '%s'" % self.text.get(tk.SEL_FIRST, tk.SEL_LAST) 


app=App() 

Đối với bản demo này để làm việc, gõ một số văn bản trong hộp văn bản sau đó nhấn vào nút.

+0

Tôi thấy không có như vậy "sel" thuộc tính trong văn bản hoặc các widget Entry - có lẽ bạn đang đề cập đến các phương thức có sẵn từ TCL, nhưng được bọc dưới tên khác trong Python? – jsbueno

+0

@jsbueno: 'sel' không phải là thuộc tính. Đó là một thẻ văn bản đại diện cho lựa chọn, và nó có sẵn dưới Tkinter. –

+0

Không cần sử dụng chuỗi cơ bản được xác định bởi Tk. 'Tkinter' có một biến được định nghĩa để truy cập nó -' SEL_FIRST' và 'SEL_LAST'. – ArtOfWarfare

4

Tiện ích văn bản có thẻ đặc biệt có tên 'sel', có thể truy cập qua Tkinter.SEL và có thể kiểm tra qua text_widget.tag_ranges (Tkinter.SEL), cho phép bạn truy xuất văn bản "đã chọn". Dưới đây là một ví dụ đơn giản:

if textWidget.tag_ranges(Tkinter.SEL): 
    print('SELECTED Text is %r' % textWidget.get(Tkinter.SEL_FIRST, Tkinter.SEL_LAST)) 
else: 
    print('NO Selected Text') 

Nếu bạn muốn có một giải pháp nhẹ cao cấp hơn, bạn cũng có thể thử:

ranges = textWidget.tag_ranges(Tkinter.SEL) 
if ranges: 
    print('SELECTED Text is %r' % textWidget.get(*ranges)) 
else: 
    print('NO Selected Text') 
+1

Plus1 để kiểm tra xem có bất kỳ văn bản nào được chọn để bắt đầu hay không. Nếu không SEL_FIRST/LAST sẽ báo lỗi :-) –

Các vấn đề liên quan