簡體   English   中英

Python/Tkinter:兩個小部件之間不需要的交互

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM