Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确读取pyGTK中的旋转按钮?_Python_Pygtk - Fatal编程技术网

Python 如何正确读取pyGTK中的旋转按钮?

Python 如何正确读取pyGTK中的旋转按钮?,python,pygtk,Python,Pygtk,对于一个小定时器应用程序,我想写一个GTK接口,在那里我可以设置所需的时间。以下是界面的图片: 但是,我在读取旋转按钮的字段时遇到问题。我为此设想的程序如下: 使用每个按钮的方法读取按钮 以下是执行此操作的方法之一: # Get the fields of the spinbuttons def get_seconds(self, widget, spin): self.rSeconds = spin.get_value_as_int() 这就是所谓的: button = g

对于一个小定时器应用程序,我想写一个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'
    

    令人惊讶的是,这种方法可以“看到”self.r秒。这让我想知道是什么决定了变量的可见性。读出来有什么不对?

    您试图将属性
    self.rHours
    传递给
    connect
    方法,但此时该属性还不存在(单击的
    处理程序尚未执行)

    请注意,即使在调用connect之前填写
    self.rHours
    ,它也会在连接时传递值,而不是在处理程序执行时传递值

    您可以通过将
    self.rHours
    等直接传递到
    prepare\u timer
    中的
    eggTimer
    来解决此问题

    但是,将所有的点击处理程序合并成一个,并使用局部变量而不是
    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)
    ...
    

    保持简单

    您尝试将属性
    self.rHours
    传递给
    connect
    方法,但此时该属性还不存在(单击的
    处理程序尚未执行)

    请注意,即使在调用connect之前填写
    self.rHours
    ,它也会在连接时传递值,而不是在处理程序执行时传递值

    您可以通过将
    self.rHours
    等直接传递到
    prepare\u timer
    中的
    eggTimer
    来解决此问题

    但是,将所有的点击处理程序合并成一个,并使用局部变量而不是
    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)
    ...
    

    保持简单

    根据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_*调用,只需读取click处理程序中的值。

    根据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_*调用,只读取单击处理程序中的值。

    它不是在抱怨
    rSeconds
    ,而是在抱怨
    rHours
    。为什么不直接读出
    prepare\u timer
    中的旋转按钮呢?你能发布完整的程序吗?对不起,那是我这边的错误。该消息来自另一个测试运行。这是代码:它不是在抱怨秒数,而是在抱怨rHours。为什么不直接读出
    prepare\u timer
    中的旋转按钮呢?你能发布完整的程序吗?对不起,那是我这边的错误。该消息来自另一个测试运行。代码如下:谢谢你的回复,“保持简单”是我应该记住的。但有时这很困难,因为这是我第一个Python程序……谢谢你的想法,但代码似乎并没有解决我的问题,或者说创建了新的问题。粘贴您的提案时,我收到以下错误消息:
    name错误:未定义全局名称“prepare\u timer”
    我认为这是因为您没有在
    prepare\u timer
    的参数中添加“self”。因此,在执行此操作并调整其余代码时,我会遇到以下错误:
    NameError:未定义全局名称“eggTimer”
    我很穷:(@Ingo:“我遇到此错误:…”再次阅读错误,这是非常有意义的。您没有在模块中的任何位置定义
    eggTimer
    。假设
    eggTimer
    存在于
    Time\u Calculation
    中,您可以使用
    Time\u Calculation.eggTimer
    ,或者您可以用
    from Time\u Calculation import eggTimer
    替换导入。非常感谢他一个愚蠢的pythn新手!终于解决了我的问题:)。谢谢你的回复,“保持简单”真的是我应该记住的;)。但有时这很困难,因为这是我第一个Python程序……谢谢你的想法,但代码似乎并没有解决我的问题,或者说创建了新的问题。粘贴您的提案时,我收到以下错误消息:
    name错误:未定义全局名称“prepare\u timer”
    我认为这是因为您没有在
    prepare\u timer
    的参数中添加“self”。因此,在执行此操作并调整其余代码时,我会遇到以下错误:
    NameError:未定义全局名称“eggTimer”
    我很穷:(@Ingo:“我遇到此错误:…”再次阅读错误,这是非常有意义的。您没有在模块中的任何位置定义
    eggTimer
    。假设
    eggTimer
    存在于
    Time\u Calculation
    中,您可以使用
    Time\u Calculation.eggTimer
    ,或者您可以用
    from Time\u Calculation import eggTimer
    替换导入。非常感谢他lping out a dumb pythn newbie!终于解决了我的问题:)。谢谢你的建议,但是它不起作用。我