如何从ttk.Notebook选项卡获取widget对象?

时间:2017-02-02 20:00:15

标签: python tkinter tk

我有ttk.Notebook类的笔记本小部件。在这个笔记本中,我添加了很多标签:

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

如何获取标签对象而不是标签名称?

更新1

所以,有儿童词典。好的,这会带来下一个问题。

我真正想做的是抓住Notebook中活动标签的对象。所以我有这个:

notebook.children[notebook.select().split('.')[2]])

但它看起来很难看。不幸的是,select()返回的窗口小部件名称与子窗口[]中窗口小部件名称的格式不完全相同。有没有任何方法可以将一种格式可靠地翻译成另一种格式,或者split()在这种情况下永远不会失败?

这是问题的演示:

#!/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()

4 个答案:

答案 0 :(得分:1)

ttk.Notebook将Tab-Objects存储在它的子属性中,这是一个python字典,如:

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

您可以通过以下方式访问Tab对象:

my_notebook.children[my_tab._name]

其中my_notebook是ttk.Notebook对象的实例,my_tab是Tab对象。标签属性_name是在my_notebook.children中存储为关键字的值。

因此,访问选项卡对象的最简单方法是将my_tab._name值单独存储在列表或变量中。 存储了所有名称后,您可以访问上面的子项目。

有关详情,请参阅https://docs.python.org/3.1/library/tkinter.ttk.html

答案 1 :(得分:0)

删除了我以前的帖子,因为它基本上是bs。

要获取实际的widget对象,请使用以下代码:

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

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

如果您打印object_from_name,您可能会获得该名称。但我想,这就是tkinter widget对象的表示方式。 你应该可以做到

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

答案 2 :(得分:0)

notebook.tabs()调用返回&#34;标签名称列表&#34;对应于子窗口小部件对象。对someWidget.nametowidget(tab_name)的调用将解析为与该选项卡关联的子窗口小部件。

换句话说,Notebook .tabs()方法会返回Notebook儿童名称的列表。

答案 3 :(得分:-1)

这就是我的窍门:

for name in notebook.tabs():
    tab_widget = notebook.nametowidget(name)