对于小型计时器应用程序,我想写一个GTK界面,我可以设置所需的时间。这是界面的图片:
但是,我无法读出旋转按钮的字段。我设想的程序如下:
以下是执行此操作的方法之一:
# Get the fields of the spinbuttons
def get_seconds(self, widget, spin):
self.rSeconds = spin.get_value_as_int()
然后像这样调用:
button = gtk.Button("Start")
button.connect("clicked", self.get_seconds, spinnerS)
计划使用此方法完成:
# Create the timer object ...
def prepare_timer(self, widget, hours, minutes, seconds, title, text):
self.timer = eggTimer(hours, minutes, seconds, title, text)
这里叫做:
button.connect("clicked", self.prepare_timer, self.rHours, self.rMinutes, self.rSeconds, "some title", "some text")
不幸的是,在运行脚本时,我收到以下错误消息:
Traceback (most recent call last):
File "GTKInterface.py", line 140, in <module>
SpinButtonExample()
File "GTKInterface.py", line 126, in __init__
button.connect("clicked", self.prepare_timer, self.rHours, self.rMinutes, self.rSeconds, "Title", "Text")
AttributeError: SpinButtonExample instance has no attribute 'rSeconds'
为了检查是否确实没有该变量的实例,我编写了一个简短的方法来打印它:
def returnS(self, widget):
print self.rSeconds
令人惊讶的是,这个方法可以“看到”self.rSeconds。这让我想知道是什么决定了变量的可见性。读这篇文章我做错了什么?
答案 0 :(得分:2)
您尝试将属性self.rHours
传递给connect
方法,但此时该属性尚不存在(clicked
处理程序尚未执行)。< / p>
请注意,即使您在调用connect之前填写self.rHours
,它也会在连接时传递值,而不是在处理程序执行时传递。
您可以将self.rHours
等直接传递到eggTimer
中的prepare_timer
来解决此问题。
但是将所有点击处理程序合并为一个更容易,并使用局部变量而不是self.rHours
等等。没有理由将代码拆分为许多点击处理程序。
编辑:顺便说一句,您也可以使用嵌套函数代替方法:
...
def prepare_timer(widget):
self.timer = eggTimer(
spinnerH.get_value_as_int(),
spinnerM.get_value_as_int(),
spinnerS.get_value_as_int(),
"Title", "Text")
button.connect("clicked", prepare_timer)
...
保持简单!
答案 1 :(得分:1)
关于adw的答案推荐一个点击处理程序,对pastebin代码的一个简单补充是:
def read_and_prepare(self,spinnerS,spinnerM,spinnerH,title,text):
self.get_seconds(spinnerS)
self.get_minutes(spinnerM)
self.get_hours(spinnerH)
self.prepare_timer(elf.rHours, self.rMinutes, self.rSeconds, title, text)
并且只有
button.connect("clicked", self.read_and_prepare,spinnerS,spinnerM,spinnerH,"Title","Text")
用于连接代码。
您也可以重新设计一下以避免所有get_ *调用,只需读取点击处理程序中的值。