首页 > 解决方案 > 保留级联 ttk.combobox 的索引

问题描述

我认为这不是一个简单的问题,所以请在回答之前三思而后行。我有 2 个 python tkinter ttk 组合框,它们级联意味着您必须在第一个中进行选择,然后才能填充第二个。所以....如果我在第一个框中说 4 个元素并且它们每个都有 4 个元素,那么最后一个元素的索引将是 16。我的问题是 tk.combobox 为每个框分配一个新索引,从 0 开始并且我能得到的最好的索引是 4。我用 value= 和 textvariable= 选项尝试了很多东西,我已经通过了字典、索引在适当范围内的列表 (list[12:16]) 并询问了各种索引的框,它们都从 0 开始,并从 0 开始计算第二个框中的元素。也许这就是方式..... idk。哦是的,我需要索引属于数据的原因是因为我从数据库中获取了数据,而索引是记录的关键,因此必须保留它。如果你们没有答案,那么我将不得不获取我可以获得的文本并从数据库中选择它以获取密钥。我知道这听起来很简单,所以也许我会,但我想尽可能减少对数据库的调用。

没有代码,因为我不想修复代码。我需要知道如何提供传统知识。组合值诸如(12:一,13:二,14:三)和选择“两个”时,我需要数字13而不是1。我的问题的任何答案。** 看来我必须添加最少数量的代码,所以就这样吧。

   `import tkinter as tk
    from tkinter import ttk
    win = tk.Tk()
    list = (get some records from the database here with indexes)
    value = tk.StrinVar()
    box = ttk.Combobox(win, value=list, textvariable=value)
    box.bind("<<ComboboxSelected>>", dosomething())
    box.grid(col=0,row=0)
    def dosomething(event):
        (get my original index here and process further using it)`

tkinter 组合框的默认设置是忽略列表中的索引并在选中时从 0 开始计数。请不要评论错别字,这是董事会的最低要求。这是 Access 组合框的默认条件,除了 tkinter 是否还有更好的库?

标签: pythontkintercomboboxttk

解决方案


这样做的方法是编写一个添加类或函数,该类或函数接受一个字典并使用组合框的值,然后返回选定的键。tkinter 小部件仅返回从 0... 到选中的索引。我的解决方案是:

    def ebox(self, index=None, row=None, column=None, vals=None):
        self.set_var(key=index) #this just creates a tk.StringVar
        lis = []
        for item in vals: #converts a dictionary to a list of keys
            lis.append(item)
        self.combos[index] = ttk.Combobox(self.win, values=lis, textvariable=self.value[index])
        self.combos[index].bind("<<ComboboxSelected>>", lambda event, y=vals: self.eboxclk(event, y))
        self.combos[index].grid(row=row, column=column)
        return

    def eboxclk(self, event=None, index=None):
        print(event.widget.get(), " the selected value ")
        print(index[event.widget.get()], " the index of the selected value")
        return index[event.widget.get()]

这很可能会被简化,我只花了很多天时间搜索所有我去解决的各种黑洞。


推荐阅读