Python3 tkinter组合框默认值



我知道这个问题以前被问过很多次,但我仍然无法让我的代码工作。。。

我试图在屏幕上显示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)

在某个时候,我会将其链接到一个DB,所以当你加载它时,它会"告诉"你每个位置上有什么瓶子,但现在,我想做的只是当你进入该页面时,让它在每个插槽中显示"Jack",而不是我现在的空白。

一般来说,我不是编程专家,但在OOP方面,我是。

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

你自己说过,"垃圾收集"。因此,将tappos改为self.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.
...

按原样,您的代码是不可验证的,留下了很多问题,但通过稍微清理代码,您可以轻松地重用组合框,并相应地返回元素位置。

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()

此外,我不知道你是否计划为每个组合框分配不同的值,但从长远来看,这种方式会让事情变得更容易。

最新更新