对于一个项目,我试图制作一个简单的GUI,显示一些基本信息(如时间,日期,公共交通信息,一些新闻等)。要做到这一点,我想要一个显示所有概述的主页这些东西和每个主题的特殊页面都有详细的视图。 Python与Kivy相结合似乎是最好/最简单的解决方案,看起来很好并且非常容易。但是我在显示时间方面遇到了问题。当我尝试更新标签上的文本时,显示我得到AttributeError: 'super' object has no attribute '__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时遇到的错误是(我认为这个错误的最后两行左右就足够了,但你永远不够彻底):
[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 :(得分:0)
在小部件之前移动kv文件的加载。因此,请调用Builder.loadfile("mirror.kv")
,然后声明您的班级DateTime
和HomeScreen
(因为它使用DateTime
)。您获得的关键错误可能是因为此窗口小部件还没有具有该ID的子窗口。