This is the Tkinter window when calling addFilterList(list) 我调用此函数像这样:制作Tkinter的过滤列表框更多动态
tkWindow = TkWindow()
tkWindow.addFilterList(['A','B','C','D','E','F','G','H','I','J','K','L'])
tkwindow.runwindow()
我有这个TKinker类。我坚持让这种动态更加活跃。首先,滚动条,按钮和列表框被硬编码在窗口中的特定位置。有没有办法获得这种格式,无论它出现在Tkinter窗口的哪个位置。例如,如果顶部有一堆按钮,我希望此功能以此格式显示,而不必返回代码并更改其行或列位置。
第二:我设置它的方式,每个TkWindow只能有一个addFilterList,因为它的返回值。有人能够指导我如何改变代码,以便我可以在一个Tkinter窗口中返回多个Listbox的值。
class TkWindow(object):
def __init__(self):
self.top = tk.Tk()
def addFilterList(self, list_box):
self.list_box = list_box
self.value = []
self.text_field = tk.StringVar()
self.entry = tk.Entry(self.top, textvariable=self.text_field, width=60)
self.listbox = tk.Listbox(self.top, width=40, selectmode=tk.MULTIPLE)
self.entry.grid()
self.listbox.grid(row=7)
self.text_field.trace("w", lambda name, index, mode: self.update_list())
self.button_show = tk.Button(self.top, text="Select",
command=self.selected_item)
self.button_clear = tk.Button(self.top, text="Clear",
command=self.clear)
self.scrollbar = tk.Scrollbar(self.top)
self.show_list = tk.Listbox(self.top, width=60, height=4)
self.scrollbar.grid(row=7, sticky=tk.N + tk.S + tk.E, padx=(10, 50))
self.button_show.grid(row=8, padx=(10, 300))
self.button_clear.grid(row=8, sticky=tk.E, padx=(10, 100))
self.show_list.grid()
# Add scrollbar
self.listbox.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.listbox.yview)
self.update_list()
def update_list(self):
# Used in addFilterList()
search_term = self.text_field.get()
self.listbox.delete(0, tk.END)
for item in self.list_box:
if search_term.lower() in item.lower():
self.listbox.insert(tk.END, item)
def selected_list(self):
# Used in addFilterList()
self.show_list.delete(0, tk.END)
for item in self.value:
self.show_list.insert(tk.END, item)
self.selected = self.listbox.selection_clear(0, tk.END)
def selected_item(self):
# Used in addFilterList()
self.selected = self.listbox.curselection()
for i in self.selected:
self.value.append(self.listbox.get(i))
self.selected_list()
def clear(self):
# Used in addFilterList()
self.value = []
self.show_list.delete(0, tk.END)
def return_value(self):
return self.value
def runWindow(self):
self.top.mainloop()
TY!为建议。我将我的addFilter函数按照您提供的相同格式分成3个函数。我还设法在一个tk窗口中获得带有过滤器功能的多个Listbox。我设法避免创建一个子类。现在addFilterList可以这样调用: test = tkWindow.addFilterList(['A','B','C','D'],x = 7,y = 1) test2 = tkWindow.addFilterList 'C','B','C','D'],x = 7,y = 2 所选值保存在test和test2中,每个属于两个单独的ListBox,具有所有相同的功能。 x和Y是在.grid中使用的位置((row =?,Column =?) –
我很高兴你改进了你的程序,但是我发现你的短语“设法避免创建一个子类”令人不安。练习你应该警惕 - 这是面向对象编程的基础。创建子类是一种组织程序的强大方式,应该被接受而不是避免。 –