2016-04-17 83 views
0

プロジェクトのためにいくつかの基本情報(時間、日付、公共交通情報、ニュースなど)を表示する簡単なGUIを作成しようとしています。これを行うには、これらすべてのことの概要を表示するホームページと、詳細を表示するすべてのテーマのための特別なページが必要です。 Kivyと組み合わせたPythonは、見た目が良くて簡単に使える最高の/最も簡単なソリューションのようでした。しかし、私は時間を表示することに問題を抱えています。時間を表示するラベル上のテキストを更新しようとすると、解決策を探す場所について多くの情報を得られないAttributeError: 'super' object has no attribute '__getattr__'が表示されます。誰が何が間違っているのを指摘できますか?python kivy AttributeError: 'super'オブジェクトに属性 '__getattr__'がありません

main.py:

import feedparser 
import time 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty, StringProperty 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.clock import Clock 

# Declare widgets 
class DateTime(Widget): 
    curtime = StringProperty('') 

    def update(self, dt): 
     self.curtime = time.strftime("%H:%M:%S") 
     print self.curtime 
     self.ids["kv_timelabel"].text = str(self.curtime) 

# Declare all screens 
class HomeScreen(Screen): 
    obj_datetime = DateTime() 
    Clock.schedule_interval(obj_datetime.update, 1.0/10.0) 

class NewsScreen(Screen): 
    pass 

class PublicTransportScreen(Screen): 
    pass 

class TrafficScreen(Screen): 
    pass 

class ScreenManagement(ScreenManager): 
    pass 

class MirrorApp(App): 
    def build(self): 
     # Create the screen manager 
     render = ScreenManagement() 
     render.add_widget(HomeScreen(name='home')) 
     render.add_widget(TrafficScreen(name='traffic')) 
     render.add_widget(PublicTransportScreen(name='public_transport')) 
     render.add_widget(NewsScreen(name='news')) 
     return render 

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

がmirror.kv:

#:kivy 1.9.0 

<HomeScreen>: 
    name: 'home' 
    obj_datetime: kv_datetime 

    Button: 
     on_release: app.root.current = 'news' 
     text: 'News' 
     size_hint: 0.5,0.15 
     font_size: 50 
     pos_hint: {"left":1, "top":0.15} 

    Button: 
     on_release: app.root.current = 'public_transport' 
     text: 'Public Transport' 
     size_hint: 0.5,0.15 
     font_size: 50 
     pos_hint: {"left":1, "top":0.3} 

    Button: 
     on_release: app.root.current = 'traffic' 
     text: 'Traffic' 
     size_hint: 0.5,0.15 
     font_size: 50 
     pos_hint: {"left":1, "top":0.45} 

    DateTime: 
     id: kv_datetime 
     center: self.parent.center 

<NewsScreen>: 
    name: 'news' 

    Button: 
     on_release: app.root.current = 'home' 
     text: 'back to the home screen' 
     font_size: 50 

<PublicTransportScreen>: 
    name: 'public_transport' 

    Button: 
     on_release: app.root.current = 'home' 
     text: 'back to the home screen' 
     font_size: 50 

<TrafficScreen>: 
    name: 'traffic' 

    Button: 
     on_release: app.root.current = 'home' 
     text: 'back to the home screen' 
     font_size: 50 

<DateTime>: 
    Label: 
     id: kv_timelabel 
     text: 
     font_size: 70 
     center_x: self.parent.center_x 
     center_y: self.parent.center_y 

main.pyを実行しているときに私が手にエラーが(私は、このエラーの最後の2行ほどで十分だと思うです、しかし、あなたは)十分に徹底的になることはありません。

[INFO ] [Logger  ] Record log in /home/matthias/.kivy/logs/kivy_16-04-17_97.txt 
[INFO ] [Kivy  ] v1.9.0 
[INFO ] [Python  ] v2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] 
[INFO ] [Factory  ] 173 symbols loaded 
[INFO ] [Image  ] Providers: img_tex, img_dds, img_gif, img_sdl2, img_pil (img_ffpyplayer ignored) 
[INFO ] [Text  ] Provider: sdl2 
[INFO ] [OSC   ] using <multiprocessing> for socket 
[INFO ] [Window  ] Provider: sdl2(['window_egl_rpi'] ignored) 
[INFO ] [GL   ] OpenGL version <3.0 Mesa 11.0.2> 
[INFO ] [GL   ] OpenGL vendor <Intel Open Source Technology Center> 
[INFO ] [GL   ] OpenGL renderer <Mesa DRI Intel(R) Ivybridge Mobile > 
[INFO ] [GL   ] OpenGL parsed version: 3, 0 
[INFO ] [GL   ] Shading version <1.30> 
[INFO ] [GL   ] Texture max size <8192> 
[INFO ] [GL   ] Texture max units <16> 
[INFO ] [Window  ] auto add sdl2 input provider 
[INFO ] [Window  ] virtual keyboard not allowed, single mode, not docked 
[INFO ] [ProbeSysfs ] device match: /dev/input/event5 
[INFO ] [MTD   ] Read event from </dev/input/event5> 
[INFO ] [Base  ] Start application main loop 
[INFO ] [GL   ] NPOT texture support is available 
19:39:33 
[INFO ] [Base  ] Leaving application in progress... 
Traceback (most recent call last): 
    File "main.py", line 49, in <module> 
    MirrorApp().run() 
    File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 824, in run 
Exception in thread Thread-1: 
    runTouchApp() 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 487, in runTouchApp 
    EventLoop.window.mainloop() 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 525, in mainloop 
    self.run() 
    self._mainloop() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 290, in _mainloop 
    self.__target(*self.__args, **self.__kwargs) 
    EventLoop.idle() 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 327, in idle 
    File "/usr/lib/python2.7/dist-packages/kivy/input/providers/mtdev.py", line 197, in _thread_run 
    Clock.tick() 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 483, in tick 
    self._process_events() 
    _device = Device(_fn) 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 615, in _process_events 
    File "/usr/lib/python2.7/dist-packages/kivy/lib/mtdev.py", line 131, in __init__ 
    self._fd = os.open(filename, os.O_NONBLOCK | os.O_RDONLY) 
OSError: [Errno 13] Permission denied: '/dev/input/event5' 

    event.tick(self._last_tick, remove) 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 374, in tick 
    ret = callback(self._dt) 
    File "main.py", line 19, in update 
    self.ids["kv_timelabel"].text = str(self.curtime) 
KeyError: 'kv_timelabel' 

私はself.ids.kv_timelabel.text = str(self.curtime)self.ids["kv_timelabel"].text = str(self.curtime)を交換した場合私は得る:

[INFO ] [Logger  ] Record log in 
/home/matthias/.kivy/logs/kivy_16-04-17_98.txt 
[INFO ] [Kivy  ] v1.9.0 
[INFO ] [Python  ] v2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] 
[INFO ] [Factory  ] 173 symbols loaded 
[INFO ] [Image  ] Providers: img_tex, img_dds, img_gif, img_sdl2, img_pil (img_ffpyplayer ignored) 
[INFO ] [Text  ] Provider: sdl2 
[INFO ] [OSC   ] using <multiprocessing> for socket 
[INFO ] [Window  ] Provider: sdl2(['window_egl_rpi'] ignored) 
[INFO ] [GL   ] OpenGL version <3.0 Mesa 11.0.2> 
[INFO ] [GL   ] OpenGL vendor <Intel Open Source Technology Center> 
[INFO ] [GL   ] OpenGL renderer <Mesa DRI Intel(R) Ivybridge Mobile > 
[INFO ] [GL   ] OpenGL parsed version: 3, 0 
[INFO ] [GL   ] Shading version <1.30> 
[INFO ] [GL   ] Texture max size <8192> 
[INFO ] [GL   ] Texture max units <16> 
[INFO ] [Window  ] auto add sdl2 input provider 
[INFO ] [Window  ] virtual keyboard not allowed, single mode, not docked 
[INFO ] [ProbeSysfs ] device match: /dev/input/event5 
[INFO ] [MTD   ] Read event from </dev/input/event5> 
[INFO ] [Base  ] Start application main loop 
[INFO ] [GL   ] NPOT texture support is available 
19:42:01 
[INFO ] [Base  ] Leaving application in progress... 
Traceback (most recent call last): 
    File "main.py", line 49, in <module> 
Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 763, in run 
    MirrorApp().run() 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 824, in run 
    File "/usr/lib/python2.7/dist-packages/kivy/input/providers/mtdev.py", line 197, in _thread_run 
    runTouchApp() 
    _device = Device(_fn) 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 487, in runTouchApp 
    File "/usr/lib/python2.7/dist-packages/kivy/lib/mtdev.py", line 131, in __init__ 
    EventLoop.window.mainloop() 
    self._fd = os.open(filename, os.O_NONBLOCK | os.O_RDONLY) 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 525, in mainloop 
OSError: [Errno 13] Permission denied: '/dev/input/event5' 
    self._mainloop() 

    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 290, in _mainloop 
    EventLoop.idle() 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 327, in idle 
    Clock.tick() 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 483, in tick 
    self._process_events() 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 615, in _process_events 
    event.tick(self._last_tick, remove) 
    File "/usr/lib/python2.7/dist-packages/kivy/clock.py", line 374, in tick 
    ret = callback(self._dt) 
    File "main.py", line 19, in update 
    self.ids.kv_timelabel.text = str(self.curtime) 
    File "kivy/properties.pyx", line 720, in kivy.properties.ObservableDict.__getattr__ (kivy/properties.c:10938) 
AttributeError: 'super' object has no attribute '__getattr__' 

エラーで言及する行を削除すると、コードはうまく動作することに注意してください。

答えて

0

ウィジェットの前にkvファイルの読み込みを移動します。だからBuilder.loadfile("mirror.kv")に電話し、クラスDateTimeHomeScreenDateTimeを使用しているため)を宣言してください。このウィジェットはそのIDを持つ子をまだ持っていないため、おそらくキーエラーが発生します。

+0

これはエラーを修正しますが、それでも実行時は表示されません。 main.pyのコードは次のようになります(入力の直下)。 'render = Builder.load_file(" mirror.kv ") #ウィジェットを宣言する クラスDateTime(ウィジェット): def update(self、dt) : "%H:%M:%S"):時刻が表示されます。(%H:%M:%S): self.ids.kv_timelabel.text = str(time.strftime( "%H:%M:%S")) print time.strftime – Liveshort

+0

ホームスクリーンの宣言でobj_datetimeウィジェットを更新しても問題はないと思うが、ホームスクリーンにはDateTimeの別のインスタンスが表示され、それを修正するには、HomeScreenの__init__で更新予定のDateTimeウィジェットを追加し、それをkvから削除するか、上に向いて正しいウィジェットをスケジュールしてくださいデート。 – Leva7