[英]Python/Tkinter: Unwanted interaction between two widgets
以下是我可以編寫的最小的全功能 tkinter 代碼,用於演示我在大型應用程序中遇到的問題。 此代碼呈現兩個框架 - 左側包含一個列表框,右側包含一個可滾動的文本小部件。 當用戶選擇列表框項目時,該項目的內容出現在文本小部件中。 如果將 cursor 放在文本小部件中,一切都很好。 您可以毫無問題地添加更多文本和/或使用刪除鍵刪除文本。 但是如果你 select 文本小部件中的任何文本,“ListboxSelect” function 被調用,並拋出錯誤“IndexError:元組索引超出范圍”。 這是沒有意義的。 為什么在文本小部件中選擇文本會調用明確綁定到列表框小部件的 function?
import tkinter as tk
from tkinter import scrolledtext
root = tk.Tk()
root.geometry("400x200")
def listbox_selected(event):
w = event.widget
listbox_index = int(w.curselection()[0])
right_text.delete(1.0,tk.END)
right_text.insert(tk.END,left_listbox.get(listbox_index))
left_frame = tk.Frame(root,height=200,width=180,bg="lightblue")
left_frame.place(x=15,y=2)
# left frame contains listbox
left_listbox = tk.Listbox(left_frame)
left_listbox.bind("<<ListboxSelect>>",listbox_selected)
left_listbox.place(x=5,y=5)
for index in range(5):
left_listbox.insert(index,"This is item " + str(index))
right_frame = tk.Frame(root,height=200,width=180,bg="lightyellow")
right_frame.place(x=200,y=5)
# right frame contains scrollable text widget
right_text = tk.scrolledtext.ScrolledText(right_frame,width=18,
height=10)
right_text.place(x=5,y=5)
root.mainloop()
這是因為當在Text
小部件中選擇文本時,將取消選擇觸發<<ListboxSelect>>
事件的Listbox
中的所選項目。
可以通過設置Listbox
exportselection=0
來禁用列表框中的取消選擇:
left_listbox = tk.Listbox(left_frame, exportselection=0)
另一種方法是檢查listbox_selected()
中是否有選定的項目:
def listbox_selected(event):
w = event.widget
selection = w.curselection()
# check whether there is item selected
if selection:
listbox_index = int(selection[0])
right_text.delete(1.0,tk.END)
right_text.insert(tk.END,left_listbox.get(listbox_index))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.