我在Windows 8计算机上使用Python 3.4和Tkinter创建GUI。
GUI顶部有一些Entry输入,然后是一些组合框。我希望组合框从以前的输入(文件名,找到必要信息的行,分隔符类型等)描述的文本文件中获取选项列表。我正在尝试使用postcommand,但它似乎首先运行并且从不更新,而是每次访问组合框的下拉菜单时更新。
datatypes = []
datatypes = ttk.Combobox(tab_loc, textvariable=std1, values=datatypes, postcommand=self.get_datatypes(datatypes,
self.flnm2.get(), self.hl2_text.get(), self.delim2.get(), self.fcd2_text.get())).grid(pady=v_pad,
padx=h_pad, row=8, column=1, sticky=EW)
def get_datatypes(self, lst, flnm, hl, delim, fcd):
# Problem: postcommand runs at start of GUI. Prevents updating.
lst += ["test", "worked?"]
print("stuff")
lst += flnm
lst += hl
try:
# open the file, get the line, break it apart.
except:
pass
self.flnm2
,self.hl2_text
,self.delim2
和self.fcd2_text
是以前的一些输入。它们是StringVar。
当我运行此代码时,组合框有选项test,working?和两个空行(可能是flnm
和hl
)。我计划有多个这样的组合框,只是输入不同,所以我需要一个函数,我可以给输入,然后更新datatypes
。
我做错了什么?
答案 0 :(得分:0)
您正在调用self.get_datatypes(...)
并在创建组合框时将结果分配给postcommand
属性。这就是为什么它只运行一次:你告诉它。与command
属性一样,您必须在定义postcommand
属性时提供对函数的引用。
专门为每个组合框的post命令创建一个方法,使用对postcommand
的引用,然后从其他小部件中获取值后从该函数调用get_datatypes
。
看起来应该是这样的:
datatypes = ttk.Combobox(..., postcommand=self.combo_post_command, ...)
...
def combo_post_command(self):
flnm2 = self.flnm2.get()
hl2_text = self.hl2_text.get()
delim2 = self.delim2.get()
fcd2_text = self.fcd2_text.get()
return self.get_datatypes(datatypes, flnm2, hl2_text, delim2, fcd2_text)
我不确定datatypes
应该是什么。您将其定义为空列表,然后将其重置为窗口小部件本身。无论如何,这显示了一般概念。
通过为每个组合框提供一个函数,您可能看起来有很多重复的代码,但您必须在某处调用所有get()
函数。您要么尝试将所有内容都塞进窗口小部件的配置中,要么将其放入函数中。将它放在函数中更明确,更容易调试和维护。
答案 1 :(得分:0)
实际上,您不需要这种工作。您可以通过简单的lambda function
完成作业。
valuetypes=["bla", "bla","bla"]
datatypes = ttk.Combobox(..., values=valuetypes,
postcommand=lambda: datatypes.confiure(values=valuetypes), ...)
valuetypes.append["another bla"]
单击Combobox
的向下箭头时,更改将显示在下拉菜单中。