<p>感谢@Novel帮助回答这个问题。<br/>通过向类中添加<code>__getattr__</code>方法,可以实现所需的行为。如果类从<code>tk.Frame</code>继承,因此该类已被删除,那么这将不起作用。代码如下:</p>
<pre><code>class scrolledFrame():
def __init__(self, parent):
self.wrapper = tk.Frame(parent)
self.canvas = tk.Canvas(self.wrapper)
self.canvas.pack(fill = "both", expand = True, side = "left")
self.scroll = tk.Scrollbar(self.wrapper, command = self.canvas.yview)
self.scroll.pack(side = "right", fill = "y")
self.canvas.config(yscrollcommand = self.scroll.set)
self.content = tk.Frame(self.canvas)
self.content.bind("<Configure>", self.resizeCanvas)
self.contentWindow = self.canvas.create_window((0,0), window = self.content, anchor = "nw")
self.content.bind("<Enter>", self.enableScrollCanvas)
self.content.bind("<Leave>", self.disableScrollCanvas)
self.attrib = set(dir(tk.Widget))
def __getattr__(self, item):
if item in self.attrib:
return getattr(self.wrapper, item)
else:
return getattr(self.content, item)
def __str__(self):
return str(self.wrapper)
def scrollCanvas(self, event):
self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")
def enableScrollCanvas(self, event):
self.canvas.bind_all("<MouseWheel>", self.scrollCanvas)
def disableScrollCanvas(self, event):
self.canvas.unbind_all("<MouseWheel>")
def resizeCanvas(self, event):
self.update_idletasks()
self.canvas.config(scrollregion = self.canvas.bbox("all"))
self.canvas.itemconfig(self.contentWindow, width = self.canvas.winfo_width())
root = tk.Tk()
exampleFrame = scrolledFrame(root)
exampleFrame.pack()
exampleLabel = tk.Label(exampleFrame, text = "I'm in the scrolled frame!")
exampleLabel.pack()
root.mainloop()
</code></pre>