如何在不同模块中向tkinter Treeview函数传递事件与变量?
解决Tkinter Treeview事件函数移至独立模块的变量访问问题
方案1:利用事件对象的widget属性(推荐)
Tkinter事件绑定会自动传递事件对象给处理函数,该对象的widget属性就是触发事件的控件(即你的tree对象)。直接通过这个属性访问即可,无需额外传递变量:
修改Main_functions.py:
def selectItem(event): # 通过事件对象获取触发事件的Treeview控件 tree = event.widget cur_item = tree.focus() print(tree.item(cur_item))
Main.py的绑定代码无需修改,保持tree.bind('<ButtonRelease-1>', Main_functions.selectItem)即可。
方案2:用Lambda表达式传递额外参数
如果需要显式传递tree对象,可以通过lambda包装事件参数和自定义参数,避免参数数量不匹配的问题:
修改Main.py的绑定代码:
tree.bind('<ButtonRelease-1>', lambda e: Main_functions.selectItem(e, tree))
修改Main_functions.py的函数,接收事件和tree两个参数:
def selectItem(event, tree): cur_item = tree.focus() print(tree.item(cur_item))
方案3:面向对象方式(适合大型项目)
将主窗口和控件封装为类,把tree作为类实例的属性,事件处理函数作为类方法,模块间变量访问会更清晰:
Main.py改为类结构:
from tkinter import * from tkinter import ttk import Main_functions as mf class App: def __init__(self, root): self.root = root self.tree = ttk.Treeview(root, columns=("size", "modified")) self.tree["columns"] = ("date", "time", "loc") self.tree.column("date", width=65) self.tree.column("time", width=40) self.tree.column("loc", width=100) self.tree.heading("date", text="Date") self.tree.heading("time", text="Time") self.tree.heading("loc", text="Loc") # 绑定类方法作为事件处理函数 self.tree.bind('<ButtonRelease-1>', self.on_tree_click) self.tree.insert("", "end", text="Name", values=("Date", "Time", "Loc")) self.tree.grid() def on_tree_click(self, event): # 调用模块中的函数,传入tree对象 mf.selectItem(self.tree) if __name__ == "__main__": root = Tk() App(root) root.mainloop()
Main_functions.py简化为:
def selectItem(tree): cur_item = tree.focus() print(tree.item(cur_item))
内容的提问来源于stack exchange,提问作者Honzik
相关产品推荐
相关产品推荐

