擅长:python、mysql、java
<p>可以将按钮设为类属性:</p>
<pre><code>class X():
button = widget.libray.Button()
@button.on_click
def click(self, event):
# blah
</code></pre>
<p>如果您尝试实例化X的多个实例(因为它们将共享同一个按钮),这当然会导致问题,但是如果您全局定义了<code>button</code>,那么这已经是一个问题了。在</p>
<p>不过,您已经准确地诊断出了问题:修饰发生在类定义时,但您希望方法与实例相关联。最终,试图用这些伎俩来强迫它很可能会令人困惑。您正在创建的按钮实例在概念上与X的<em>实例</em>关联,而不是类本身。您可以合理地创建一个GUI类,您打算多次实例化它(对于某些特定样式的widget,或其他),在这种情况下,您必须放弃这些技巧,因为在您希望绑定事件时确实需要实例。在</p>
<p>如果你真的愿意,你可以想出一个更周密的方案来处理这个问题。例如,可以使用像<code>@onclick('button')</code>这样的装饰器,将名称<code>button</code>存储为方法对象的属性。然后,您可以在<code>__init__</code>中使用代码来迭代对象的方法,并将它们绑定到GUI小部件上具有相应名称的事件。(也就是说,创建一个按钮并将其存储<code>self.button</code>,然后<code>__init__</code>将此属性的名称与传递给装饰器的名称链接起来,并绑定事件。)</p>
<p>然而,做一件显而易见的事情可能更简单:不要尝试花哨地使用decorator在类级别处理特定于实例的行为。只需在方法代码中绑定事件,如第二个示例所示。在</p>