在哪里放置事件处理程序并将变量传递给它?

时间:2015-11-18 12:55:35

标签: python tkinter

我一直在尝试将鼠标点击绑定到某个帧中的网格,this question之后我创建了一个新类并将事件绑定到该帧,这是有效的。但是鼠标事件的功能需要一个在MainApp类中生成的变量,我无法让它正常工作。根据安排,我无法获得要在函数中使用的widgets变量,或者函数/类的顺序是错误的,因此程序将找不到某些东西,因为它过早被引用。< / p>

所以我的主要问题是如何使功能正常工作,我认为这主要涉及我在哪里放这个东西?作为Schedule_Label类中的函数?作为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()

1 个答案:

答案 0 :(得分:0)

您从名为[{1}}的名称空间schedule_widgets拨打mouse_1,以便能够像使用MainApp关键字那样使用它。

global

还有另外一种方法,但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() 应该是schedule_widgets的属性,当您实例化MainApp时,您应该提供父参考,以便schedule_Label可以使用父参考

访问mouse_1
schedule_widgets