2017-02-02 2 views
0

Ich habe Notebook-Widget der Klasse ttk.Notebook. In diesem Notebook Ich füge viele Tabs:Wie Widget-Objekt von ttk.Notebook Registerkarte erhalten?

notebook.add(child=my_object, text='my tab')

Wie kann ich Registerkarte Objekt erhalten und nicht die Registerkarte Name?

UPDATE 1

So gibt es Wörterbuch Kinder. OK, das bringt das nächste Problem.

Was ich wirklich tun möchte, ist meine Hände auf das Objekt der aktiven Registerkarte in Notebook zu nehmen. Also ich habe folgendes:

aber es sieht hässlich aus. Leider hat der von select() zurückgegebene Widget-Name nicht genau das gleiche Format wie die Widget-Namen in children []. Gibt es eine Methode zur zuverlässigen Übersetzung eines Formats in ein anderes oder split() wird in dieser Situation niemals fehlschlagen?

Dies ist Demo des Problems:

#!/usr/bin/env python3 

from tkinter import * 
from tkinter.ttk import * 


class App(Tk): 
    def __init__(self): 
     super().__init__() 
     notebook = Notebook(self) 
     notebook.add(child=Frame(notebook), text='tab1') 
     notebook.add(child=Frame(notebook), text='tab2') 
     notebook.add(child=Frame(notebook), text='tab3') 
     notebook.pack() 

     print('Tabs are: ', notebook.children.keys()) 
     print('Active tab: ', notebook.select()) 
     print(type(notebook.children[notebook.select().split('.')[2]])) 

App().mainloop() 
+2

Weisen Sie 'my_object' der Variablen zu und verwenden Sie diese Variable. – furas

Antwort

1

ttk.Notebook speichert Tab-Objekte in ihr Kinder-Attribut, das ist ein Python-Wörterbuch wie:

{my_tab._name: tab_object} e.g. {'4465111168': <Viewer.Tab object .4435079856.4465020320.4465111168>} 

Sie ein Tab-Objekt zugreifen können über :

my_notebook.children[my_tab._name] 

Wo my_notebook eine Instanz eines ttk.Notebook Objekt ist und my_tab ist Ihr Ta b Objekt. Das Reiterattribut _name ist der Wert, der als Schlüssel in my_notebook.children gespeichert wird.

Die einfachste Möglichkeit, auf die Registerkartenobjekte zuzugreifen, besteht darin, die my_tab._name Werte separat in einer Liste oder Variable zu speichern. Mit allen gespeicherten Namen können Sie wie oben auf das Kinderdikt zugreifen.

Weitere Informationen finden Sie unter https://docs.python.org/3.1/library/tkinter.ttk.html.

0

Gelöschte meine ehemalige Post, weil es im Grunde bs war.

Um die tatsächliche Widget-Objekt verwenden Sie den folgenden Code zu erhalten:

name = mywidget.winfo_name() # this returns this ominous string 
           # of numbers and dots 

object_from_name = mywidget._nametowidget(name) # this returns your 
               # actual widget 

Wenn Sie drucken object_from_name Sie wahrscheinlich den Namen bekommen. Aber ich denke, so werden tkinter Widget-Objekte dargestellt. sollten Sie in der Lage sein

object_from_name.config(text="stuff", do_further_stuff_here="") 
+0

Der Name des Widgets (.234567890.1234567.123456689.354567) scheint der vollständige Baum zu sein, der mit Ihrem Root-Objekt beginnt. – Pankrazius

0

Der notebook.tabs() Aufruf gibt eine Liste von „Tab-Namen“ zu tun, die den Kindern entsprechen Objekte Widget. Ein Aufruf an someWidget.nametowidget(tab_name) löst das untergeordnete Widget auf, das dieser Registerkarte zugeordnet ist.

Mit anderen Worten, das Notebook .tabs() Methode gibt eine Liste der Namen der Kinder des Notebooks zurück.

Verwandte Themen