列出具有子选项的tkinter组合框选项

时间:2016-01-05 23:56:04

标签: python user-interface python-3.x combobox tkinter

不确定我是否在使用组合框之前看到过这种情况,而没有构建自定义组合框。我正在构建自己的ebay蜘蛛,我希望用户能够从一个类别列表中进行选择以爬行查询等。每个类别当然都有自己的子类别。并且您无法在易趣的高级搜索表单中明确选择类别的子类别。但是,您可以使用表单提交请求发送子类别ID,以在该子类别中自动搜索。

在ebays网站上抓取类别后获取所有类别 - >该类别的子类别我基本上有一个字典,看起来像这样:

categories = {main_category_title: [sub_category1, ...., sub_categoryn],
              ....}

我知道如何通过这样的方式将所有子类别自己列入组合框:

self.categories = ttk.Combobox(self,
              values = list(itertools.chain.from_iterable(
              (ebay_spider.categories[category] for category in ebay_spider.categories)))) 

虽然这有效......但它并不是我想要的,因为它不允许用户选择包含每个子类别的主要类别,而且看起来很复杂。

有没有办法列出主要类别及其下面的子类别?最好是缩进。

方法1: 我想到的另一个选择是为每个类别/子类别创建一个带有按钮的文本框,它设置一个包含该值的tk.StringVar,因为我可以用这种方式处理缩进,但如果有一个更简单的方法,则更愿意不必这样做

方法2: 获得所有子类别时,我可以做类似的事情 “”(一些任意数量的空白)+子类别,同时将它们放入列表中。

这是“hackish”imo,当稍后使用它时抓住子类别我必须调用.strip()。这适用于在其他地方使用子类别时必须使用.strip()的警告

1 个答案:

答案 0 :(得分:1)

以下是使用2个组合框的快速示例。主类别使用带有跟踪的void Transform::rotateAroundPoint(axis, angle, point) { Matrix3x3 mat = createMatrixFromQuaternion(axis, angle); Transform rotateTransform; trans.basis = mat; // <- 3x3 matrix trans.origin = Vector3(0,0,0); // <- Translation vector // "this" is a pointer to the transform being edited since I decided to write // this as a member function. Vector3 pos = this->origin; this->origin = this->origin - point; (*this) = rotateTransform * (*this); this->origin = this->origin + point; } // Internally bullet does basically this resultTransform.basis = t1.basis * t2.basis; resultTransform.origin = t1.basis * t2.origin + t1.origin; ,以便在更改时更新第二类的值。如果用户输入了类别字典中未找到的内容,则会设置空白值StringVar()

'--None--'

还有其他几种方法可以实现这一目标,因此根据您的应用程序,您可能需要查看它们,其中一种方法是使用from Tkinter import * import ttk def main_change(*args): second.set('--None--') second['values'] = categories.get(main_selected.get(), ['--None--']) categories = {'Fruit': ['Apples', 'Grapes', 'Bananas'], 'Vegetables': ['Peas', 'Carrots']} root = Tk() main_selected = StringVar() main_selected.trace('w', main_change) main = ttk.Combobox(root, values=list(categories.keys()), textvariable=main_selected) main.pack() second = ttk.Combobox(root, values=['--None--']) second.pack() root.mainloop() 的{​​{1}}方法。