Python 在哪里放置事件处理程序并向其传递变量?
在我创建了一个新类并将事件绑定到该类之后,我一直在尝试将鼠标单击绑定到某个框架中的网格,这很有效。但是鼠标事件的函数需要一个在MainApp类中生成的变量,我无法使它正常工作。根据安排,要么我无法获得函数中要使用的Python 在哪里放置事件处理程序并向其传递变量?,python,tkinter,Python,Tkinter,在我创建了一个新类并将事件绑定到该类之后,我一直在尝试将鼠标单击绑定到某个框架中的网格,这很有效。但是鼠标事件的函数需要一个在MainApp类中生成的变量,我无法使它正常工作。根据安排,要么我无法获得函数中要使用的小部件变量,要么函数/类的顺序错误,因此程序找不到东西,因为它被引用得太快 所以我的主要问题是如何使函数工作,我想主要涉及到我把它放在哪里?作为明细表\u标签类中的函数?作为MainApp的功能?一个松散的函数?将所有事件处理程序放在一个单独的Python文件中并导入该文件是否更明智
小部件
变量,要么函数/类的顺序错误,因此程序找不到东西,因为它被引用得太快
所以我的主要问题是如何使函数工作,我想主要涉及到我把它放在哪里?作为明细表\u标签
类中的函数?作为MainApp
的功能?一个松散的函数?将所有事件处理程序放在一个单独的Python文件中并导入该文件是否更明智
排除某些代码,情况就是这样:
class Schedule_Label(tk.Label):
def __init__(self, parent, *args, **kwargs):
tk.Label.__init__(self, parent, *args, **kwargs)
self.bind("<Button-1>", mouse_1)
...
class Schedule, this class uses Schedule_Label
class MainApp(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
#class schedule is used here
...
schedule_widgets = self.schedule.New(date, stafflist)
...
def mouse_1(event):
r = event.widget.grid_info()['row']
c = event.widget.grid_info()['column']
schedule_widgets[(r,c)].configure(state="active")
if __name__ == "__main__":
root = tk.Tk()
app = MainApp(root)
app.pack()
root.mainloop()
class Schedule\u标签(tk.Label):
定义初始化(自、父、*args、**kwargs):
tk.Label.\uuuuu init\uuuuuuu(self,parent,*args,**kwargs)
self.bind(“,鼠标1)
...
类明细表,该类使用明细表标签
类MainApp(传统框架):
定义初始化(自、父、*args、**kwargs):
tk.Frame.\uuuuu init\uuuuuu(self,parent,*args,**kwargs)
#这里使用的是课程表
...
schedule\u widgets=self.schedule.New(日期,stafflist)
...
def鼠标_1(事件):
r=event.widget.grid_info()['row']
c=event.widget.grid_info()['column']
调度小部件[(r,c)]。配置(state=“active”)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
app=MainApp(根目录)
app.pack()
root.mainloop()
您正在从鼠标1
调用调度小部件
,它位于MainApp
的名称空间中,以便能够像使用全局
关键字一样使用它
schedule_widgets = None#-------------------------------------------------------- new ---
class Schedule_Label(tk.Label):
def __init__(self, parent, *args, **kwargs):
tk.Label.__init__(self, parent, *args, **kwargs)
self.bind("<Button-1>", mouse_1)
...
class Schedule, this class uses Schedule_Label
class MainApp(tk.Frame):
def __init__(self, parent, *args, **kwargs):
global schedule_widgets #----------------------------------------------- new ---
tk.Frame.__init__(self, parent, *args, **kwargs)
#class schedule is used here
...
schedule_widgets = self.schedule.New(date, stafflist)
...
def mouse_1(event):
global schedule_widgets #--------------------------------------------------- new ---
r = event.widget.grid_info()['row']
c = event.widget.grid_info()['column']
schedule_widgets[(r,c)].configure(state="active")
if __name__ == "__main__":
root = tk.Tk()
app = MainApp(root)
app.pack()
root.mainloop()
从
mouse_1
中删除self
(不self.mouse_1
这里self.bind(“,mouse_1)
),这是我将该函数放入Schedule_标签
类中时留下的,我现在编辑了这个问题。使用此设置时,问题是它找不到参考schedule\u widgets
。
class Schedule_Label(tk.Label):
def __init__(self, parent, *args, **kwargs):
tk.Label.__init__(self, parent, *args, **kwargs)
self.bind("<Button-1>", lambda event, p=parent: mouse_1(event, p)) # --- new ---
...
class Schedule, this class uses Schedule_Label
class MainApp(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
#class schedule is used here
...
self.schedule_widgets = self.schedule.New(date, stafflist) #------------ new ---
...
def mouse_1(event, parent): #--------------------------------------------------- new ---
r = event.widget.grid_info()['row']
c = event.widget.grid_info()['column']
parent.schedule_widgets[(r,c)].configure(state="active") #------------------ new ---
if __name__ == "__main__":
root = tk.Tk()
app = MainApp(root)
app.pack()
root.mainloop()