2016-08-03 36 views
0

我在我的布局的许多不同位置创建类添加小部件矩形。 即时运行返回错误GPIO最安装(),即时配置端口在第11行,我的代码有什么问题?Python Kivy Raspberrypi错误GPIO频道

> Traceback (most recent call last): File "plantadeira.py", line 50, 
> in <module> 
>  MainApp().run() File "/usr/local/lib/python2.7/dist-packages/kivy/app.py", line 828, in run 
>  runTouchApp() File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 487, in 
> runTouchApp 
>  EventLoop.window.mainloop() File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", 
> line 90, in mainloop 
>  self._mainloop() File "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_egl_rpi.py", 
> line 85, in _mainloop 
>  EventLoop.idle() File "/usr/local/lib/python2.7/dist-packages/kivy/base.py", line 327, in 
> idle 
>  Clock.tick() File "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", line 581, in 
> tick 
>  self._process_events() File "kivy/_clock.pyx", line 368, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7219) File "kivy/_clock.pyx", 
> line 398, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7102) File "kivy/_clock.pyx", 
> line 396, in kivy._clock.CyClockBase._process_events 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:7032) File "kivy/_clock.pyx", 
> line 168, in kivy._clock.ClockEvent.tick 
> (/tmp/pip-NKJIwl-build/kivy/_clock.c:3109) File "plantadeira.py", 
> line 26, in update 
>  if self.read_Sensor(pin) == False: File "plantadeira.py", line 36, in read_Sensor 
>  sensor = GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000) RuntimeError: You must setup() the GPIO channel as an input first 

这是我的代码蟒蛇:

from kivy.app import App 
from kivy.clock import Clock 
from kivy.graphics import Color, Rectangle 
from kivy.properties import NumericProperty 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
import RPi.GPIO as GPIO 


GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) 
pin_1 = 17 

class MainLayout(FloatLayout): 
    pass    

class bar(Widget): 

    r = NumericProperty(1) 
    def __init__(self, pin, p1, p2, s1, s2, **kwargs): 
     super(bar, self).__init__(**kwargs)   
     Clock.schedule_interval(self.update, 0.5) 

    def update(self, pin): 
     if self.read_Sensor(pin) == False: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2)) 
     else: 
      with self.canvas: 
       Color(self.r, 1, 1, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2))    

    def read_Sensor(self, pin): 
     sensor = GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000) 
     if sensor is None: 
      return False 
     else: 
      return True 

class MainApp(App): 
    def build(self): 
     self.mainlayout = Widget() 
     bar1 = bar(pin_1, 1, 10, 60, 100) 
     self.mainlayout.add_widget(bar1) 
     return self.mainlayout 

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

回答

0

在你的代码的问题是,当你拨打:
GPIO.wait_for_edge(int(pin), GPIO.RISING, timeout=1000)
不能使用int(pin)但你在上课前定义的,而不pin_1
所以,你可以这样调用它来代替:
GPIO.wait_for_edge(pin_1, GPIO.RISING, timeout=1000)

如果你想在你的代码中使用pin,你必须在对象的启动将其定义为self.pin = pin。 (init)。然后在课程的任何地方将其称为self.pin。您不需要将它作为更新中的参数传递 - 在这种情况下,请使用read_Sensor方法。除非你有几个引脚,但是你需要传递一个数字给read_Sensor方法。你不会在你的代码中这样做。您不会将任何数字传递给更新方法。
针在你的情况变得钟dt,(增量时间)从文档https://kivy.org/docs/api-kivy.clock.html

如果你看你看,int(pin)从未设定为输入错误。如之前所提到的int(pin)是时钟增量时间,所以它永远不会相同。 RuntimeError: You must setup() the GPIO channel as an input first

而只是为了说明如何重写这个:

from kivy.app import App 
from kivy.clock import Clock 
from kivy.graphics import Color, Rectangle 
from kivy.properties import NumericProperty 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.widget import Widget 
import RPi.GPIO as GPIO 


GPIO.setmode(GPIO.BCM) 
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) 
pin_1 = 17 

class MainLayout(FloatLayout): 
    pass 

class bar(Widget): 

    r = NumericProperty(1) 
    def __init__(self, pin, p1, p2, s1, s2, **kwargs): 
     super(bar, self).__init__(**kwargs) 
     Clock.schedule_interval(self.update, 0.5) 
     self.pin = pin 

    def update(self, dt): 
     if self.read_Sensor() == False: 
      with self.canvas: 
       Color(self.r, 0, 0, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2)) 
     else: 
      with self.canvas: 
       Color(self.r, 1, 1, 1) 
       Rectangle(pos=(p1,p2), size=(s1,s2))    

    def read_Sensor(self, pin=self.pin): # you dont need to pass anything to this method. It will default to self.pin. But if you need it for other sensors, you can pass an integer.                        
     sensor = GPIO.wait_for_edge(pin, GPIO.RISING, timeout=1000)                 
     if sensor is None: 
      return False 
     else: 
      return True 

class MainApp(App): 
    def build(self): 
     self.mainlayout = Widget() 
     bar1 = bar(pin_1, 1, 10, 60, 100) 
     self.mainlayout.add_widget(bar1) 
     return self.mainlayout 

if __name__ == '__main__': 
    MainApp().run() 
+0

非常感谢,工作! –

+0

@VictorSued很棒。没问题。 – EL3PHANTEN