2012-08-07 20 views
2

我是一名新手程序員,目前我正在學習python與kivy作爲GUI平臺。瞭解基維的小工具

我正在閱讀kivy手冊,並且正在處理小部件。我想在教程畫家小部件上嘗試一些東西,但經過幾個小時的嘗試,卻未能如願。

我想要的應該很簡單。我有一個小部件,它在觸摸屏幕後創建一個隨機線。我認爲在觸摸某個區域的屏幕後重複自動添加線條會很有趣。所以我製作了一個功能,可以使小部件「注入」數據以創建更多行。

但我根本無法與小部件「溝通」。我不知道小部件的「實例」名稱是什麼。因此,我通過命名它畫家創建的實例,以及讓我們只共享代碼:

import kivy 
import time 
from random import random 
from kivy.app import App 
from kivy.clock import Clock 
from kivy.uix.widget import Widget 
from kivy.graphics import Color, Ellipse, Line 


class MyPaintWidget(Widget): 
    def on_touch_down(self, touch,): 
     with self.canvas: 
      Color(random(), random(), random()) 
      touch.ud['Line'] = Line(points=(touch.x, touch.y)) 
      touch.ud['Line'].points += [random()*1000, random()*1000 ] 
     begin() 

    def touchme(): 
     touch.ud['Line'].points += [random()*1000, random()*1000 ] 
     print 'touchme' 

class MyPaintApp(App): 
    def build(self): 
     painter = MyPaintWidget() 
     return painter 

def begin(): 
    def my_callback(dt): 
     print 'begin' 
     painter.touchme() 
    Clock.schedule_interval(my_callback, 1.) 


if __name__ == '__main__': 
    MyPaintApp().run() 

希望soneone能爲我提供的是如何做到這一點的答案,也許給我解釋了一下小部件是如何工作的。我將它作爲python中的標準類來處理,但我認爲它的作用有點不同。

乾杯。

回答

5

不知道如果我理解你想實現什麼,但我想你可以只是從你的begin方法移動代碼到on_touch_down方法,以使後者這個樣子的:

def on_touch_down(self, touch): 
    with self.canvas: 
     Color(random(), random(), random()) 
     touch.ud['Line'] = Line(points=(touch.x, touch.y)) 
     touch.ud['Line'].points += [random()*1000, random()*1000 ] 
    Clock.schedule_interval(self.touchme, 1.) 

問題是touchme需要touch對象,所以你必須將它作爲參數傳遞。這樣STH可能會奏效,但我沒有檢查:

def on_touch_down(self, touch): 
    with self.canvas: 
     Color(random(), random(), random()) 
     touch.ud['Line'] = Line(points=(touch.x, touch.y)) 
     touch.ud['Line'].points += [random()*1000, random()*1000 ] 
    Clock.schedule_interval(lambda: self.touchme(touch), 1.) 

def touchme(self, touch): 
    touch.ud['Line'].points += [random()*1000, random()*1000 ] 
    print 'touchme' 

一般來說我建議你嘗試獲得更好的感覺了變量的作用域。在您的代碼中,您嘗試訪問變量paintertouch,他們只是不可見。

我只是開始與kivy自己,所以也許我可以在幾個星期內給出更完整的答案。 ;)

+0

謝謝你的幫助。我確實已經發現,我正在使用在獨立函數中唯一可行的變量。我已經改變了代碼,並將指針放在構建(自定義)定義中,而不是使用畫家的工作方式...... – Shodan 2012-08-08 16:29:38