单击鼠标从指定的tkinter标签获取文本

时间:2019-12-13 01:34:05

标签: python tkinter

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

即使我单击“哈利波特”,它也会为我显示列表中的最后项“伟大的加斯比”的结果。

1 个答案:

答案 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)