2017-04-14 49 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

我很高興你改進了你的程序,但是我發現你的短語「設法避免創建一個子類」令人不安。練習你應該警惕 - 這是面向對象編程的基礎。創建子類是一種組織程序的強大方式,應該被接受而不是避免。 –