我希望能够使用两个搜索栏同时更新两个列表框
I want to be able to update two list boxes at the same time with two searchbars
我希望能够使用两个列表同时更新两个列表框,这两个列表在两个搜索栏中具有相同的项目数。第一个列表框有一个包含字母的列表,第二个列表框有直接对应于这些字母的数字,例如 A 与 1 对应,B 与 2 对应,依此类推。我希望能够在左侧的第一个输入框中键入 'a',并且在第一个列表框中仅显示 'a',在第二个列表框中仅显示“2”,或者输入“ 2' 在第二个框中将显示所有在第二个列表框中具有 '2' 的项目,因此第一个列表框也仅显示与此项目对应的项目。我已经能够做到一个输入框可以处理但只有两个列表框之一,但我希望两者同时更新。
from tkinter import * # allows for the use of tkinter GUI
win = Tk() # creates the tkinter window
win.title("test") # sets the name of the window
win.geometry("1100x700") # sets the size of the window
win.resizable(False, False) # prevents the window from being resized
# these are made up lists for this question
databaselist1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'
, '19', '20']
databaselist2 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']
# -----------------------------------------------------------------------------------------------------------------------
# this section synchronizes the mouse scrolled for both list boxes
def scroll2(event):
IDsearchresultslist.yview_scroll(int(-4 * (event.delta / 120)), "units") # makes it so that when the user scrolls
# though one list box, all the list boxes scroll as well
def scroll1(event):
alphabetlist.yview_scroll(int(-4 * (event.delta / 120)), "units") # makes it so that when the user scrolls
# though one list box, all the list boxes scroll as well
# -----------------------------------------------------------------------------------------------------------------------
def checkinlist1(e): # uses the characters typed in their specifically typed order into the ID search entry box in
# order to display the results that have those characters into the search
# result box or in other words, an autofill function
searchtyped = IDsearchEntry.get().replace("'", "`") # looks at the characters that are being typed into
# the ID search entry box
if searchtyped == ' ': # checks if nothing is typed into the ID search entry box
listdata1 = databaselist1 # makes it so that the entire list is displayed into the search results box
else: # this happens if the ID search entry box has something typed in it
listdata1 = []
for item in databaselist1: # loops though the list
if searchtyped.lower() in item.lower():
listdata1.append(item)
update1(listdata1) # updates listdata each time the code loops through the checkinlist function
def checkinlist2(e): # uses the characters typed in their specifically typed order into the nsearch entry box in order
# to display the results that have those characters into the search result box or in other words
# , an autofill function
searchtyped = nsearchentry.get().replace("'", "`") # looks at the characters that are being typed into the
# nsearch entry box
if searchtyped == ' ': # checks if nothing is typed into the nsearch entry box
listdata2 = databaselist2 # makes it so that the entire list is displayed into the alphabet listbox
else: # this happens if the nsearch entry box has something typed in it
listdata2 = []
for item in databaselist2: # loops though the list
if searchtyped.lower() in item.lower():
listdata2.append(item)
update2(listdata2) # updates listdata each time the code loops through the checkinlist function
# ----------------------------------------------------------------------------------------------------------------------
# this section sets up the list boxes
alphabetframe = Frame(win) # creates the frame that will contain the scrollbar for the alphabetframe
IDsearchresultslist = Listbox(win, width=39, font=('Arial', 12, 'bold')) # creates the
# of the listbox
# ID search list box that will contain the
IDsearchresultslist.place(relx=.6, rely=.15) # moves the ID search results box to its location
# this section creates the first buttons that will show up when the program is opened
alphabetlist = Listbox(alphabetframe, width=50, font=('Arial', 12, 'bold')) # creates the search entry box
# of the listbox
alphabetframe.place(relx=.05, rely=.2) # moves the frame that contains the scrollbar to its location
alphabetlist.pack(pady=15, padx=15)
alphabetlist.bind("<MouseWheel>", scroll2) # when the mousewheel is used, the scroll2
# function with be activated
IDsearchresultslist.bind("<MouseWheel>", scroll1) # when the mousewheel is used, the scroll1
# ----------------------------------------------------------------------------------------------------------------------
# this section creates the two entry boxes that will control what the user searches for
IDsearchEntry = Entry(win, width=20, font=('Arial', 15, 'bold')) # creates the ID search entry box
IDsearchEntry.bind("<KeyRelease>", checkinlist1) # binds the action of the user clicking on an entry from the list box
# in order for an action to happen
IDsearchEntry.place(relx=.717, rely=.07) # moves the ID search entry box to its location
nsearchentry = Entry(win, width=17, font=('Arial', 15, 'bold')) # sets up the nsearch entry box and its parameters
nsearchentry.bind("<KeyRelease>", checkinlist2) # binds the action of the user clicking on an entry from the list box
# in order for an action to happen
nsearchentry.place(relx=.29, rely=.553) # moves the nsearchentry box to its location
# ----------------------------------------------------------------------------------------------------------------------
# this section updates the listboxes though their list
def update1(listdata1): # this function updates the list that shows up inside the IDsearchresultslist as the user types
IDsearchresultslist.delete(0, END) # clears the listbox, if END doesn't work use "end"
for item in listdata1: # loops though the list
IDsearchresultslist.insert(END, item) # moves each individual item from the list into the listbox
# as the list gets looped
def update2(listdata2): # this function updates the list that shows up inside the nresultslist as the user types
alphabetlist.delete(0, END) # clears the listbox, if END doesn't work use "end"
for item in listdata2: # loops though the list
alphabetlist.insert(END, item) # moves each individual item from the list into the listbox
# as the list gets looped
update1(databaselist1) # makes the databaselist go through the update function
update2(databaselist2) # makes the databaselist go through the update function
win.mainloop()
[1]: https://i.stack.imgur.com/OzRT1.png
一种可能的解决方案是压缩包含数据的列表,将元素添加到列表并将其传递给 update(x)()
函数。
zip()
函数将从多个容器中获取相似索引的元素。
既然你想相应地更新它,那就是要走的路。
def checkinlist1(e):
....
listdata1 = []
listdata2=[]
for item,item2 in zip(databaselist1,databaselist2): # loops though the list
if searchtyped.lower() in item.lower():
listdata1.append(item)
listdata2.append(item2)
update2(listdata2)
update1(listdata1)
....
def checkinlist2(e):
....
listdata2 = []
listdata1=[]
for item,item2 in zip(databaselist2,databaselist1): # loops though the list
if searchtyped.lower() in item.lower():
listdata2.append(item)
listdata1.append(item2)
update1(listdata1)
update2(listdata2)
参考资料:
zip() function in python
我希望能够使用两个列表同时更新两个列表框,这两个列表在两个搜索栏中具有相同的项目数。第一个列表框有一个包含字母的列表,第二个列表框有直接对应于这些字母的数字,例如 A 与 1 对应,B 与 2 对应,依此类推。我希望能够在左侧的第一个输入框中键入 'a',并且在第一个列表框中仅显示 'a',在第二个列表框中仅显示“2”,或者输入“ 2' 在第二个框中将显示所有在第二个列表框中具有 '2' 的项目,因此第一个列表框也仅显示与此项目对应的项目。我已经能够做到一个输入框可以处理但只有两个列表框之一,但我希望两者同时更新。
from tkinter import * # allows for the use of tkinter GUI
win = Tk() # creates the tkinter window
win.title("test") # sets the name of the window
win.geometry("1100x700") # sets the size of the window
win.resizable(False, False) # prevents the window from being resized
# these are made up lists for this question
databaselist1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'
, '19', '20']
databaselist2 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T']
# -----------------------------------------------------------------------------------------------------------------------
# this section synchronizes the mouse scrolled for both list boxes
def scroll2(event):
IDsearchresultslist.yview_scroll(int(-4 * (event.delta / 120)), "units") # makes it so that when the user scrolls
# though one list box, all the list boxes scroll as well
def scroll1(event):
alphabetlist.yview_scroll(int(-4 * (event.delta / 120)), "units") # makes it so that when the user scrolls
# though one list box, all the list boxes scroll as well
# -----------------------------------------------------------------------------------------------------------------------
def checkinlist1(e): # uses the characters typed in their specifically typed order into the ID search entry box in
# order to display the results that have those characters into the search
# result box or in other words, an autofill function
searchtyped = IDsearchEntry.get().replace("'", "`") # looks at the characters that are being typed into
# the ID search entry box
if searchtyped == ' ': # checks if nothing is typed into the ID search entry box
listdata1 = databaselist1 # makes it so that the entire list is displayed into the search results box
else: # this happens if the ID search entry box has something typed in it
listdata1 = []
for item in databaselist1: # loops though the list
if searchtyped.lower() in item.lower():
listdata1.append(item)
update1(listdata1) # updates listdata each time the code loops through the checkinlist function
def checkinlist2(e): # uses the characters typed in their specifically typed order into the nsearch entry box in order
# to display the results that have those characters into the search result box or in other words
# , an autofill function
searchtyped = nsearchentry.get().replace("'", "`") # looks at the characters that are being typed into the
# nsearch entry box
if searchtyped == ' ': # checks if nothing is typed into the nsearch entry box
listdata2 = databaselist2 # makes it so that the entire list is displayed into the alphabet listbox
else: # this happens if the nsearch entry box has something typed in it
listdata2 = []
for item in databaselist2: # loops though the list
if searchtyped.lower() in item.lower():
listdata2.append(item)
update2(listdata2) # updates listdata each time the code loops through the checkinlist function
# ----------------------------------------------------------------------------------------------------------------------
# this section sets up the list boxes
alphabetframe = Frame(win) # creates the frame that will contain the scrollbar for the alphabetframe
IDsearchresultslist = Listbox(win, width=39, font=('Arial', 12, 'bold')) # creates the
# of the listbox
# ID search list box that will contain the
IDsearchresultslist.place(relx=.6, rely=.15) # moves the ID search results box to its location
# this section creates the first buttons that will show up when the program is opened
alphabetlist = Listbox(alphabetframe, width=50, font=('Arial', 12, 'bold')) # creates the search entry box
# of the listbox
alphabetframe.place(relx=.05, rely=.2) # moves the frame that contains the scrollbar to its location
alphabetlist.pack(pady=15, padx=15)
alphabetlist.bind("<MouseWheel>", scroll2) # when the mousewheel is used, the scroll2
# function with be activated
IDsearchresultslist.bind("<MouseWheel>", scroll1) # when the mousewheel is used, the scroll1
# ----------------------------------------------------------------------------------------------------------------------
# this section creates the two entry boxes that will control what the user searches for
IDsearchEntry = Entry(win, width=20, font=('Arial', 15, 'bold')) # creates the ID search entry box
IDsearchEntry.bind("<KeyRelease>", checkinlist1) # binds the action of the user clicking on an entry from the list box
# in order for an action to happen
IDsearchEntry.place(relx=.717, rely=.07) # moves the ID search entry box to its location
nsearchentry = Entry(win, width=17, font=('Arial', 15, 'bold')) # sets up the nsearch entry box and its parameters
nsearchentry.bind("<KeyRelease>", checkinlist2) # binds the action of the user clicking on an entry from the list box
# in order for an action to happen
nsearchentry.place(relx=.29, rely=.553) # moves the nsearchentry box to its location
# ----------------------------------------------------------------------------------------------------------------------
# this section updates the listboxes though their list
def update1(listdata1): # this function updates the list that shows up inside the IDsearchresultslist as the user types
IDsearchresultslist.delete(0, END) # clears the listbox, if END doesn't work use "end"
for item in listdata1: # loops though the list
IDsearchresultslist.insert(END, item) # moves each individual item from the list into the listbox
# as the list gets looped
def update2(listdata2): # this function updates the list that shows up inside the nresultslist as the user types
alphabetlist.delete(0, END) # clears the listbox, if END doesn't work use "end"
for item in listdata2: # loops though the list
alphabetlist.insert(END, item) # moves each individual item from the list into the listbox
# as the list gets looped
update1(databaselist1) # makes the databaselist go through the update function
update2(databaselist2) # makes the databaselist go through the update function
win.mainloop()
[1]: https://i.stack.imgur.com/OzRT1.png
一种可能的解决方案是压缩包含数据的列表,将元素添加到列表并将其传递给 update(x)()
函数。
zip()
函数将从多个容器中获取相似索引的元素。
既然你想相应地更新它,那就是要走的路。
def checkinlist1(e):
....
listdata1 = []
listdata2=[]
for item,item2 in zip(databaselist1,databaselist2): # loops though the list
if searchtyped.lower() in item.lower():
listdata1.append(item)
listdata2.append(item2)
update2(listdata2)
update1(listdata1)
....
def checkinlist2(e):
....
listdata2 = []
listdata1=[]
for item,item2 in zip(databaselist2,databaselist1): # loops though the list
if searchtyped.lower() in item.lower():
listdata2.append(item)
listdata1.append(item2)
update1(listdata1)
update2(listdata2)
参考资料: zip() function in python