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