Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在哪里放置事件处理程序并向其传递变量?_Python_Tkinter - Fatal编程技术网

Python 在哪里放置事件处理程序并向其传递变量?

Python 在哪里放置事件处理程序并向其传递变量?,python,tkinter,Python,Tkinter,在我创建了一个新类并将事件绑定到该类之后,我一直在尝试将鼠标单击绑定到某个框架中的网格,这很有效。但是鼠标事件的函数需要一个在MainApp类中生成的变量,我无法使它正常工作。根据安排,要么我无法获得函数中要使用的小部件变量,要么函数/类的顺序错误,因此程序找不到东西,因为它被引用得太快 所以我的主要问题是如何使函数工作,我想主要涉及到我把它放在哪里?作为明细表\u标签类中的函数?作为MainApp的功能?一个松散的函数?将所有事件处理程序放在一个单独的Python文件中并导入该文件是否更明智

在我创建了一个新类并将事件绑定到该类之后,我一直在尝试将鼠标单击绑定到某个框架中的网格,这很有效。但是鼠标事件的函数需要一个在MainApp类中生成的变量,我无法使它正常工作。根据安排,要么我无法获得函数中要使用的
小部件
变量,要么函数/类的顺序错误,因此程序找不到东西,因为它被引用得太快

所以我的主要问题是如何使函数工作,我想主要涉及到我把它放在哪里?作为
明细表\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()