2010-11-01 14 views

Odpowiedz

7

Dla widget Tkinter.Text lub Tkinter.Entry, można użyć:

content = text.selection_get() 

Interaktywny przykład uzyskiwanie zaznaczony tekst zarówno z wpisem i od A widgetów tekst w konsoli Pythona:

>>> 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' 
>>> 

Według do komentarza Bryana Oakley'a:

selection_get to ogólna metoda widgetu dostępna dla wszystkich widgetów. To nie nie zawsze uzyskać wybrany ciąg z widżetu tekstu. Może, ale nie jest to gwarantowane. Robi to, co się nazywa wyborem "X" (z korzeni X11 tk). Jeśli ustawisz exportselection na False dla widżetu Tekst, selection_get nie zadziała. Twoja propozycja będzie działać w normalnym przypadku, ale nie we wszystkich przypadkach.

+0

Widżet Tekst nie ma metody "selection_get". –

+0

@BryanOakley: Którą wersję używasz? Używam Tkintera, który jest dostarczany z Pythonem 2.7, a moje widżety tekstowe zdecydowanie mają 'selection_get'. (Po prostu spróbowałem ponownie w sekcji konsoli, żeby się upewnić i zadziałało). – jsbueno

+1

Powinienem być dokładniejszy: sam widżet tekstowy nie ma metody "selection_get". 'selection_get' to ogólna metoda widgetu dostępna dla wszystkich widgetów. To _nie_ pobiera wybrany ciąg z widżetu tekstowego. Może, ale nie jest to gwarantowane. Robi to, co się nazywa wyborem "X" (z korzeni X11 tk). Jeśli ustawisz 'exportselection' na False dla widżetu tekstowego,' selection_get' nie zadziała. Twoja propozycja będzie działać w normalnym przypadku, ale nie we wszystkich przypadkach. –

6

użyć metody get. Jeśli chcesz, aby wybrany tekst korzystał z indeksów SEL_FIRST i SEL_LAST.

[edytuj]] jeden z komentarzy spekulowanych, że to nie działało z Tkinter ponieważ nie było atrybutu "sel". "sel" nie jest atrybutem, jest tagiem. Znaczniki są niezwykle potężną funkcją widżetu tekstowego.

Oto przykład:

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() 

Do tego demo do pracy, należy wpisać tekst w polu tekstowym, a następnie naciśnij przycisk.

+0

nie widzę takiego „SEL” atrybut tekst lub widżety wejście - może odnosisz się do metod dostępnych z TCL, ale które są pakowane pod inną nazwą w Pythonie? – jsbueno

+0

@jsbueno: 'sel' nie jest atrybutem. Jest to tag tekstowy, który reprezentuje wybór i jest dostępny pod Tkinter. –

+0

Nie ma potrzeby używania ciągu podstawowego zdefiniowanego przez Tk. 'Tkinter' ma zmienną zdefiniowaną dla dostępu do niego -' SEL_FIRST' i 'SEL_LAST'. – ArtOfWarfare

4

widget Tekst ma specjalny znacznik o nazwie „SEL”, dostępną poprzez Tkinter.SEL i dającej się przetestować poprzez text_widget.tag_ranges (Tkinter.SEL), która pozwala odzyskać „wybrane” tekst. Oto prosty przykład:

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

Jeśli chcesz nieco bardziej zaawansowane rozwiązania, można też spróbować:

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

Plus1 do sprawdzania, czy istnieje jakiś wybrany tekst na początek. W przeciwnym razie SEL_FIRST/LAST będzie błąd :-) –

Powiązane problemy