Tkinter开发问题:双击TreeView的create项无法触发feeds()函数
解决Tkinter TreeView双击项无法触发函数的问题
问题分析
你尝试的绑定代码存在几个关键问题:
- 类内的
treeview.bind语句位置错误,未放在类的初始化方法中,导致执行时找不到self - 事件处理函数未判断双击的是否是目标项,也没有调用
feeds()函数 feeds()里新建了tk.Tk()实例,Tkinter程序应保持单一主窗口,弹窗需用tk.Toplevel()
修正后的完整代码
from tkinter import * import tkinter as tk from tkinter import ttk from tkinter.scrolledtext import ScrolledText def feeds(): # 用Toplevel替代Tk(),避免多主窗口异常 root = tk.Toplevel() text = ScrolledText(root, width=50, height=10) text.pack() feed_list = ['FEED1','FEED2','FEED3'] for feed in feed_list: cb = tk.Checkbutton(text, text=feed, bg='white', anchor='w') text.window_create('end', window=cb) text.insert('end', '\n') def on_double_click(event): # 获取双击的TreeView项 item = event.widget.selection()[0] # 获取项的文本内容 item_text = event.widget.item(item, 'text') # 判断是否为目标项,触发对应函数 if item_text == 'create': feeds() screen = tk.Tk() screen.state("zoomed") screen.title("TEST") tabControl = ttk.Notebook(screen) tab1 = ttk.Frame(tabControl) tabControl.add(tab1, text='Ration') tabControl.grid(padx=20,pady=40,ipadx=250 ,ipady=100) ttk.Label(tab1, text="Animal Categories", font=16).place(relx=0.086,rely=0.15,anchor='center') treeview = ttk.Treeview(tab1) treeview.grid(padx=30, pady=150, ipadx=200, ipady=85) treeview.insert('', 'end', 'i1', text='Lactating ewes') treeview.insert(parent='i1',index='end',text='create') # 绑定双击事件到TreeView控件 treeview.bind("<Double-1>", on_double_click) screen.mainloop()
关键修改说明
- 将事件处理改为独立函数,直接绑定到TreeView,避免类写法的初始化错误
- 通过
event.widget获取触发事件的控件,减少全局变量依赖 - 增加项文本判断,仅双击"create"时才调用
feeds() - 替换弹窗创建方式为
Toplevel(),符合Tkinter单主窗口规范 - 简化
feeds()内的循环逻辑,直接遍历列表元素,无需手动维护索引
内容的提问来源于stack exchange,提问作者Spyros
相关产品推荐
相关产品推荐

