books = []
result = db.answer_query(query)
for item in result:
book = Label(search_page,text=item,font="none 12 bold",pady=2)
book.grid(row=row_count, column=0, sticky = W)
books.append(book)
row_count += 1
for book in books:
book.bind("<Button-1>", lambda e: BookInfoPage(book.cget("text")))
book.bind("<Enter>", lambda event, h=book: h.configure(fg="#638cbb"))
book.bind("<Leave>", lambda event, h=book: h.configure(fg="#000000"))
这是当前代码,该代码加载多个标签并将其放置在db.answer_query(query)
返回的列表中每个索引的连续行上。此函数返回字符串值列表。
我当前遇到的问题是,对于"<Button-1>"
事件,我将参数book.cget("text")
传递到函数BookInfoPage()
中,该函数提供有关单击的书名的信息(由标签提供)。我想通过鼠标单击将指定tkinter标签中的文本传递到函数BookInfoPage()
中,但是当前无论单击哪个标签,它都仅传递 last 标签中的文本。
这是因为 book 变量被认为是for循环中列表中的最后一个实体。有什么办法可以解决这个问题?
我希望能够在单击鼠标时将指定tkinter标签中的文本传递到函数BookInfoPage()
中。
以下是当前正在运行的应用程序的视频(gif):https://imgur.com/a/9sjynxm
即使我单击“哈利波特”,它也会为我显示列表中的最后项“伟大的加斯比”的结果。
答案 0 :(得分:0)
传递给回调的event
对象可以告诉您单击了哪个窗口小部件。与其丢弃event
对象,不如使用它:
book.bind("<Button-1>", lambda event: BookInfoPage(event.widget.cget("text")))
可以说是更好的解决方案是调用适当的函数,并使用event
对象获取被单击的小部件。使用函数更容易编写,阅读和调试。
def show_book(event):
book = event.widget
BookInfoPage(book.cget("text"))
book.bind("<Button-1>", show_book)