如何在pyGTK中正确读出旋转按钮?

时间:2010-10-28 16:02:48

标签: python pygtk

对于小型计时器应用程序,我想写一个GTK界面,我可以设置所需的时间。这是界面的图片:

alt text

但是,我无法读出旋转按钮的字段。我设想的程序如下:

  1. 使用每个按钮的方法读出按钮
  2. 以下是执行此操作的方法之一:

    # 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)
    
    1. 使用按钮
    2. 中的数据创建计时器对象

      计划使用此方法完成:

          # 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。这让我想知道是什么决定了变量的可见性。读这篇文章我做错了什么?

2 个答案:

答案 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_ *调用,只需读取点击处理程序中的值。