2015-04-07 62 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

相關問題