【问题标题】:keep the index of a cascade ttk.combobox保留级联 ttk.combobox 的索引
【发布时间】:2021-03-19 07:54:47
【问题描述】:

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

没有代码,因为我不想修复代码。我需要知道如何提供传统知识。 Combobok值(12:1,13:2,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 是否还有更好的库?

【问题讨论】:

  • 你能不能只用4*first_index + second_index 得到一个从0-15 的整体索引?
  • 我们都需要以minimal reproducible example 的形式查看一些代码。请在您的问题中添加一个。
  • 索引可能不是连续的,并且可能存在重复,因为它正在对项目进行分类,第一级可能是办公设备,第二级可能是纸张,也可能有顶级类别木头和下一个也可能是纸板的纸张。因为它现在是第二个类别,所以必须是唯一的才能返回并在表中搜索其索引。我已经做了很多搜索,如果这不能完成也没关系,只是希望一些编码向导知道它的头脑。许多组合框都有这个功能,TKinter 可能没有实现它。
  • 我决定使用菜单而不是组合框,因为我可以设置自己的关键字段

标签: python tkinter combobox ttk


【解决方案1】:

这样做的方法是编写一个添加类或函数,该类或函数接受一个字典并使用组合框的值,然后返回选定的键。 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()]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-05
    • 2018-07-01
    • 2017-09-21
    • 2017-11-21
    • 2015-11-23
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多