Python 如何正确读取pyGTK中的旋转按钮?
对于一个小定时器应用程序,我想写一个GTK接口,在那里我可以设置所需的时间。以下是界面的图片: 但是,我在读取旋转按钮的字段时遇到问题。我为此设想的程序如下: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
# 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!终于解决了我的问题:)。谢谢你的建议,但是它不起作用。我