2012-12-22 6 views
7

Mam widżet Ttk Notebook zawierający 8 ramek - czyli 8 kart. Każda ramka zawiera widżet Tekst. Mam przycisk poza widżetem Notatnika i chcę wstawić tekst do bieżących zakładek Widżet tekstowy po naciśnięciu tego przycisku.Znajdowanie aktualnie wybranej zakładki Notatnika Ttk

Wygląda na to, że wymaga to ustalenia, który widget w Notatniku jest aktualnie wybrany, ale nie mogę znaleźć sposobu na jego wykonanie. Jak znaleźć aktualnie wybraną kartę?

Alternatywnie, w jaki sposób mogę wdrożyć to, co chcę?

Jeśli to pomoże, oto kod dla mojego notebooka:

self.nb = Notebook(master) 
self.nb.pack(fill='both', expand='yes', padx=10, pady=10) 
self.frames = [] 
self.texts = [] 
for i in xrange(8): 
    self.frames.append(Frame()) 
    self.nb.add(self.frames[i]) 
    self.texts.append(Text(self.frames[i])) 
    self.texts[i].pack(fill='both') 

Odpowiedz

13

można pobrać wybraną kartę przez select metody. Jednak ta metoda zwraca tabeid, który nie jest zbyt użyteczny, jak jest. index przekonwertuj go na numer wybranej karty.

>>> nb.select() 
'.4299842480.4300630784' 
>>> nb.index(nb.select()) 
2 

Zauważ, że coud można również uzyskać więcej informacji na temat wybranej zakładki za pomocą tab

>>> nb.tab(nb.select(), "text") 
'mytab2' 

Można spojrzeć na notebooka dokumentacji referencyjnego: http://docs.python.org/3/library/tkinter.ttk.html#notebook

+0

Ahhh, dokładnie to, co chciałem! Miałem problemy z przeglądaniem dokumentacji, więc musiałem to przegapić. Ale tak, to jest idealne. – Matthew

1

Nie jestem ekspertem w ogóle jednak nadzieję, że mogę pomóc w niektórych „świeżym okiem”. sobie wyobrazić, to może być coś z udziałem

def buttonclick(): 
     somevariablename = focus_get() 
     #Print your text into the somevariable notebook could be 
     #something like(not sure about the syntax): 
     focusednotebook = somevariablename 
     focusednotebook.insert('1.0', 'your text here') 

yourbutton = Button(parent, text = "button name", command = buttonclick) 
yourbutton.pack() 

Nadzieję, że to działa, czy cię we właściwym kierunku.

Proszę czuć się swobodnie edytować, jak jestem tu dość nowy amd z Pythona :-)

+0

Ahhh, tak, to jest bardzo podobne do tego, z czego skorzystałem. Nie do końca tego, czego szukam, ale robi to, czego potrzebuję. – Matthew

0

Istnieją dwa proste sposoby, aby sprawdzić, która karta jest wybrana:

nb.select() # returns the Tab NAME (string) of the current selection 

i

nb.index('current') # returns the Tab INDEX (number) of the current selection 

Sposób .select() może być również używany do wybierania, która karta jest aktywna, poprzez nb.select(tabId) . Bez argumentu arg zwraca wartość tabId (w formie "nazwa") bieżącego wyboru.

Wartość .index(tabId) przekształca wartość tabId w indeks numeryczny. Może również przyjąć ciąg "koniec", który zwróci liczbę zakładek. Tak więc, nb.index(tkinter.END) jest jak metoda len() dla widgetu notebooka.

Gdy nie ma kart, .select() zwraca pusty ciąg, ale .index('current') zgłasza wyjątek.Tak więc, jeśli chcesz indeks, powiedziałbym

if nb.select(): 
    idx = nb.index('current') 

jest najlepszym sposobem, aby przejść.

W tym konkretnym przypadku prawdopodobnie będziesz chciał pobrać bieżącą nazwę karty notatnika, a następnie przekonwertować tę nazwę na rzeczywisty widżet tekstu podrzędnego, metodą nametowidget(), w celu manipulacji. Więc ...

tabName = notebook.select() 
if tabName: 
    textWidget = notebook.nametowidget(tabName) # here, 'notebook' could be any widget 
    textWidget.insert(pos, text, tags) 

Sposób nametowidget(name) mapuje nazwę tkinter do rzeczywistego widget. Jest to metoda wywoływana przez dowolny rzeczywisty widget.