2017-04-14 47 views
0

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

回答

0

我不知道我理解你的问题,但我会尝试提供一些建议。我认为你正在尝试在功能addFilterList中做太多事情。您的代码很难被读取和修改。你必须做三个不同的事情:

  1. 初始化部件
  2. 摆出部件
  3. 与价值观

我通常#1在构造函数中填充的小部件。所以,你的构造是,在大纲:

def __init__(self): 
    self.top = tk.Tk() 
    self.entry = tk.Entry(...) 
    self.listbox = tk.ListBox(...) 

那么我是在一个单独的功能布局,把它doLayout()

def doLayout(self): 
    self.entry.grid(...) 
    self.listbox.grid(...) 

现在你的函数addFilterList只能添加列表关注项目到您的列表框。您可以在不更改此功能的情况下更改布局。您可以将其他小部件添加到窗口中,而无需更改此功能。

如果你想有多个FilterList,你可以考虑做一个tk.Listbox的子类。这里的函数将设置列表内容,清除列表内容,处理列表选择事件等等。然后,如果您决定需要两个列表而不是一个列表,则可以实例化此类的另一个实例并将其添加到您的窗口中。

+0

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 =?) –

+0

我很高兴你改进了你的程序,但是我发现你的短语“设法避免创建一个子类”令人不安。练习你应该警惕 - 这是面向对象编程的基础。创建子类是一种组织程序的强大方式,应该被接受而不是避免。 –