繁体   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