2015-06-15 32 views
1

我搜索了四周,似乎无法找到我的问题的答案。我试图为下面的代码创建一个工作滚动条,似乎无法让它工作。该问题似乎与OnFrameConfigure方法。我在其他地方看到的方法应该是def OnFrameConfigure(event):但是当我放置(event)部分进入我的方法不工作,除非我写的函数class在类中为画布编写tkinter滚动条

class Main(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     '''This initialisation runs the whole program''' 

     #tk.Tk.__init__(self, *args, **kwargs) 
     main = tk.Tk() 
     canvas = tk.Canvas(main) 
     scroll = tk.Scrollbar(main, orient='vertical', command=canvas.yview) 
     canvas.configure(yscrollcommand=scroll.set) 
     frame = tk.Frame(canvas) 
     scroll.pack(side='right', fill='y') 
     canvas.pack(side='left', fill='both', expand='yes') 
     canvas.create_window((0,0), window=frame) 
     frame.bind('<Configure>', self.OnFrameConfigure(parent=canvas)) 

     for i in range(100): 
      tk.Label(frame, text='I am a Label').pack() 

     main.mainloop() 


    def OnFrameConfigure(self, parent): 
     '''Used to allowed scrolled region in a canvas''' 
     parent.configure(scrollregion=parent.bbox('all')) 

回答

2

你的问题外从这里开始:

frame.bind('<Configure>', self.OnFrameConfigure(parent=canvas)) 

你是立即调用OnFrameConfigure函数。这不是你如何使用bind。您必须提供可调用函数的参考。既然你正在使用一个类,你不需要通过parent,除非你有这个功能适用于多个小部件。

更改绑定到这一点:

frame.bind('<Configure>', self.OnFrameConfigure) 

更改方法定义的:

def OnFrameConfigure(self, event): 

最后,您__init__需要保存到画布上,然后你就可以使用一个参考该功能:

def __init__(self, *args, **kwargs): 
    ... 
    self.canvas = tk.Canvas(...) 
    ... 

... 
def OnFrameConfigure(self, event): 
    ... 
    self.canvas.configure(scrollregion=self.canvas.bbox('all')) 
    ... 
+0

可以说,我需要'def OnFrameConfigure'为多个小部件和那里前面需要'(家长)'参数我怎么加这个?然而,我尝试了lambda,并且这似乎只适用于使用'command'的东西。 – firebird92

+1

@ firebird92:你会使用lambda; lambda没有什么特别之处,只能使用command属性。请参阅http://stackoverflow.com/q/28995395/7432,或者在许多示例中搜索此网站以查找'[tkinter] bind lambda'。 –