2015-04-07 27 views
-2

我正在使用python2.7上的kivy。据我所知,在处理父数据时,self并不是一个真正的参数,而是一个在函数中使用的工具。然而在下面的使用中,python认为自己是一个真实的论点。这是因为我在函数中调用它?需要自我作为参数

class Verdo(BoxLayout): 
    defualtval = "" 
    tarih = StringProperty(str(datetime.datetime.now()).split(".")[0]) 
    istipitxt = StringProperty(defualtval) 
    iscitxt = StringProperty(defualtval) 
    iskodtxt = StringProperty(defualtval) 
    baslabittxt = StringProperty(defualtval) 
    parcanotxt = StringProperty(defualtval) 



    def start(self): 
     Clock.schedule_interval(self.callback, 0.5) 

    def callback(self, dt): 
     print "testo" 
     self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0]) 

    start() 
    #Clock.schedule_interval((lambda dt: updater(), 1), 0.5) 
    #Clock.schedule_interval((lambda dt: tell(), 1), 0.5) 

当代码运行时,下面的错误发生:

2015-04-07 22:05:03.081739 
Traceback (most recent call last): 
    File "/home/toshy/workspace/Verdo_reborn/main.py", line 28, in <module> 
    class Verdo(BoxLayout): 
    File "/home/toshy/workspace/Verdo_reborn/main.py", line 79, in Verdo 
    start() 
TypeError: start() takes exactly 1 argument (0 given) 

我也试过一个更简单的方法也失败:

def callback(self, dt): 
    print "testo" 
    self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0]) 

Clock.schedule_interval(callback, 0.5) 

输出:

 ret = callback(self._dt) 
TypeError: callback() takes exactly 2 arguments (1 given) 
+0

您的缩进是正确的吗?在你的例子中,你正在调用没有对象的start()(例如'x.start()')。 – AlG

+0

我遇到的问题是类由kivy主循环调用,这就是为什么我试图让该函数在类中运行。 – Zalanas

回答

1

你应该做这样的事情:

class Verdo(BoxLayout): 
    defualtval = "" 
    tarih = StringProperty(str(datetime.datetime.now()).split(".")[0]) 
    istipitxt = StringProperty(defualtval) 
    iscitxt = StringProperty(defualtval) 
    iskodtxt = StringProperty(defualtval) 
    baslabittxt = StringProperty(defualtval) 
    parcanotxt = StringProperty(defualtval) 



    def start(self): 
     Clock.schedule_interval(self.callback, 0.5) 

    def callback(self, dt): 
     print "testo" 
     self.tarih = StringProperty(str(datetime.datetime.now()).split(".")[0])  

if __name__ == '__main__': 
    verdoInstance = Verdo() 
    verdoInstance.start() 

这只是一个例子,如果你想快速测试代码作为一个可执行python脚本。 你的错误是你试图调用你的类方法,而无需在你的类代码中调用构造函数。在这种情况下,方法类实际上是在等待self(object ref)作为第一个参数,但该对象并没有在那个时候创建​​。

+0

感谢您的帮助。 – Zalanas

2

你应该打电话:

self.start() 

self一个真正的参数,但它是作为在其上调用该方法的对象自动地供给。

有两种不同的上下文可能需要拨打.start()。首先是实例化类型Verdo的目的后:

my_verdo = Verdo() 
my_verdo.start() 

或者,也可以从调用内部 Verdo的代码。在这种情况下,你需要指定你正在使用当前的实例。

+2

他不应该从课堂内部调用“开始”。 – jsbueno

+0

我不清楚它的意图是什么。我可以更准确地写下“如果你试图从Verdo的类定义中调用start,你应该写......”。 –

+0

尽管如此,试图从定义Python的类体中调用实例方法在至少3种不同的方式中是错误的。而且这个代码是在问题中,而你没有澄清它 - 你只需在任何上下文中列出'self.start'。在类体中,这会以“NameError”开头而失败。 – jsbueno

相关问题