【问题标题】:Python3 tkinter combobox default valuePython3 tkinter 组合框默认值
【发布时间】:2016-06-05 19:34:00
【问题描述】:

我知道这已经被问过很多次了,但我仍然无法让我的代码工作......

我试图在屏幕上显示 7 个下拉列表,并为每个下拉列表选择默认值。我可以让这些框自己显示,并且当您下拉每个框时,我定义的值都在列表中,但是当我的 gui 加载时,我无法将它们默认为任何值。我读了一些关于垃圾收集是一个问题的帖子,所以我按照海报的建议将它放在一个班级中。就是这样……

class DropDown(object):
    def __init__(self, parent):
        self.parent = parent

    def tapoptions(self):
        self.box_value = StringVar()
        self.box = ttk.Combobox(self.parent, textvariable=self.box_value, state="readonly")
        self.box['values'] = ('Empty','Jack','Coke','Tonic')
        self.box.current(1)

这全部都放在一个多框架窗口中,我从网上的某个来源复制了它(我现在不记得在哪里),所以我不知道这是否阻碍了我在这里的进步。如果我需要添加更多的代码,我可以,但这里是我的 DropDown 被调用的地方......

class OnTap(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        body = tk.Frame(self)
        body.grid(row=1, column=1, sticky="ew")
        tappos = [0 for x in range(7)]
        for a in range(7):
            l = ttk.Label(body, text="Bottle "+str(a+1)+": ")
            l.grid(row=a+1, column=0)
            tappos[a] = DropDown(body)
            tappos[a].tapoptions()
            tappos[a].box.grid(row=a+1, column=1)

在某些时候我会将它链接到一个数据库,所以当你加载它时,它会告诉你每个位置的瓶子是什么,但现在,我想做的只是让它显示为“Jack”当您转到该页面时,在每个插槽中,而不是我现在拥有的 [空白]。

我不是一般的编程菜鸟,但在 OOP 方面我是。

另外,我在这里重写了这个,所以如果有你认为可能是问题的错别字,请告诉我,但也有可能我只是抄错了,在这里介绍了这些,而不是我的实际代码。

【问题讨论】:

    标签: python combobox tkinter


    【解决方案1】:

    你自己说过,“垃圾收集”。所以用self.tappos代替tappos

    #tappos = [0 for x in range(7)]
    self.tappos = [0 for x in range(7)]
    ...
    #tappos[a] = DropDown(root)      
    self.tappos[a] = DropDown(root)    # And so on. You get the picture.
    ...
    

    【讨论】:

    • 谢谢!那工作得很好。我没有想到将垃圾收集扩展到列表中的下一个类。欣赏!
    【解决方案2】:

    事实上,您的代码是无法验证的,会留下很多问题,但是通过稍微清理一下您的代码,您可以让您的 Combobox 轻松地重复使用并相应地返回您的元素位置。

    from tkinter import ttk, Tk, Frame
    
    
    class DropDown(ttk.Combobox):
    
        def set_list(self, argslist):
            self['values'] = argslist
            self.current(1)
            self.pack()
    
    
    class OnTap:
    
        def __init__(self, parent):
            self.parent = parent
            body = Frame(self.parent)
            body.grid(row=1, column=1, sticky="ew")
            list1 = ['Empty', 'Jack', 'Coke', 'Tonic']
    
            tappos = [0 for x in range(7)]
            for i in range(5):
                l = ttk.Label(body, text="Bottle "+str(i+1)+": ")
                l.pack()
                tappos[i] = DropDown(body).set_list(list1)
    
    
    if __name__ == '__main__':
        root = Tk()
        app = OnTap(root)
        root.mainloop()
    

    此外,我不知道您是否打算为每个 Combobox 分配不同的值,但从长远来看,这种方式会让事情变得更容易。

    【讨论】:

    • 你是对的,我将为每个盒子分配不同的值。要在您的代码中执行此操作,我是否必须将变量传递给 set_list() 以获得我想要默认的值?即DropDown(body).set_list(list1,3),它会默认为“补品”吗?假设沿着这些思路......def set_list(self, argslist, val) .... self.current(val)
    • 您可以创建多个列表(或从数据库中获取)将每个列表放入 A 列表中,而不是遍历一个范围,您可以遍历列表列表以填充组合框并添加一个计数器n+=1 代表您的瓶子 n 标签
    • 您的代码有效,但如果您不介意我问,为什么您在继承 ttk.Combobox 后没有在此处初始化 DropDown 类?即没有def __init__(self)super().__init__
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 2016-11-17
    • 2012-07-25
    • 2012-04-07
    • 2014-02-14
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多