【问题标题】:Tkinter insert a Combobox inside a Treeview widgetTkinter 在 Treeview 小部件中插入一个 Combobox
【发布时间】:2013-05-26 00:34:21
【问题描述】:

例如,让我们使用如下类创建 Treeview 小部件:

class FiltersTree:
    def __init__(self, master, filters):
        self.master = master
        self.filters = filters
        self.treeFrame = Frame(self.master)
        self.treeFrame.pack()
        self._create_treeview()
        self._populate_root()

    def _create_treeview(self):
        self.dataCols = ['filter', 'attribute']
        self.tree = ttk.Treeview(self.master, columns = self.dataCols, displaycolumns = '#all')

像往常一样填充根,插入子级。在代码块的末尾,您可以看到我想在树中放置 Combobox 的位置,使用 Combo 对象:

    def _populate_root(self):
        # a Filter object
        for filter in self.filters:
            top_node = self.tree.insert('', 'end', text=filter.name)

            # a Field object
            for field in filter.fields:
                mid_node = self.tree.insert(top_node, 'end', text = field.name)

                # insert field attributes
                self.insert_children(mid_node, field)

    def insert_children(self, parent, field):
        name = self.tree.insert(parent, 'end', text = 'Field name:',
                         values = [field.name])
        self.tree.insert(parent, 'end', text = 'Velocity: ', 
                         values = [Combo(self)]) # <--- Combo object
        ...

接下来是 Combo 的类定义。我理解它的方式,组合框小部件继承自并且必须放置在来自 ttk 的 Labelframe 小部件中:

class Combo(ttk.Frame):
    def __init__(self, master):
        self.opts = ('opt1', 'opt2', 'etc')
        self.comboFrame = ttk.Labelframe(master, text = 'Choose option')
        self.comboFrame.pack()
        self.combo = ttk.Combobox(comboFrame, values=self.opts, state='readonly')
        self.combo.current(1)
        self.combo.pack()

那么这是完全错误的吗?我希望能够在 Treeview 小部件中更改单位(例如 m/s、ft/s 等)。

有什么建议吗?

【问题讨论】:

    标签: python-3.x combobox treeview tkinter ttk


    【解决方案1】:

    treeview 小部件不支持嵌入式小部件。 values 属性的值被视为字符串。

    【讨论】:

    • 顺便说一句,您能否向我提出任何建议,以便我可以实现在树视图中切换单位的目标?基本上我希望用户能够决定程序是否应该显示 m/s、knots、mph 等......
    • @ADB:你可能想看看这个:tkintertreectrl.sourceforge.net 我自己没用过,但我用过 tktreectrl 和 tcl/tk aps,它肯定有很多特性。
    【解决方案2】:

    默认情况下,树视图是字符串列表森林的静态显示。但是,通过工作,在仔细阅读 Treeview 参考资料后,可以使 Treeview 具有相当的交互性。对于这个问题,我会将左键单击绑定到一个事件处理程序,该处理程序将鼠标 x,y 与单位属性单元格的边界框 (.bbox) 进行比较。如果在框中,直接在单位属性单元格的顶部显示一个用当前值(例如 'flops')初始化的 Combobox。

    Tkinter.ttk Treeview referenceTcl/tk treeview reference

    当然,将 Treeview 放在带有单独 Combobox 的框架中可能更容易。

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 2017-06-12
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多