【发布时间】:2015-07-01 21:16:40
【问题描述】:
我正在创建一个 Python / Kivy 应用程序,并且我正在尝试在窗口调整大小时调整文本大小。我已经查了一下,但我没有找到任何完全符合我预期的东西。我想我会将 on_resize 绑定到一个调整文本大小的函数,但我得到了很多错误。这是相关的代码。
class MainScreen(Screen):
def __init__(self, **kwargs):
super(MainScreen, self).__init__(**kwargs)
self.font_size = 25
class MainApp(App):
def build(self):
def win_cb(window, width, height):
new_size = sqrt(width**2 + height**2)/40.6
MainScreen().font_size = new_size
Window.bind(on_resize=win_cb)
我还应该提到,在 .kv 文件中我有类似的内容
<MainScreen>:
Label:
text: "Text here"
pos_hint: {"x": -0.15, "y": 0.05}
font_size: root.font_size*80/25
在运行时它工作正常,但是当我调整窗口大小时,我收到一大列错误,显然与 MainScreen 没有属性 font_size 有关。
这是错误信息:
Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1649, in create_handler
return eval(value, idmap)
File "main.kv", line 46, in <module>
font_size: root.font_size
File "kivy/weakproxy.pyx", line 19, in kivy.weakproxy.WeakProxy.__getattr__ (kivy/weakproxy.c:1101)
AttributeError: 'MainScreen' object has no attribute 'font_size'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 2011, in _apply_rule
value, rule, rctx['ids'])
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1654, in create_handler
cause=tb)
kivy.lang.BuilderException: Parser: File "main.kv", line 46:
...
44: text: "Simplify Fraction"
45: pos_hint: {"right": 1, "top":0.2}
>> 46: font_size: root.font_size
47:
48:
...
AttributeError: 'MainScreen' object has no attribute 'font_size'
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1649, in create_handler
return eval(value, idmap)
File "main.kv", line 46, in <module>
font_size: root.font_size
File "kivy/weakproxy.pyx", line 19, in kivy.weakproxy.WeakProxy.__getattr__ (kivy/weakproxy.c:1101)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/onehitfinish/Downloads/Gregulator Files/test.py", line 88, in <module>
MainApp().run()
File "/usr/lib/python3.4/site-packages/kivy/app.py", line 824, in run
runTouchApp()
File "/usr/lib/python3.4/site-packages/kivy/base.py", line 487, in runTouchApp
EventLoop.window.mainloop()
File "/usr/lib/python3.4/site-packages/kivy/core/window/window_sdl2.py", line 525, in mainloop
self._mainloop()
File "/usr/lib/python3.4/site-packages/kivy/core/window/window_sdl2.py", line 290, in _mainloop
EventLoop.idle()
File "/usr/lib/python3.4/site-packages/kivy/base.py", line 327, in idle
Clock.tick()
File "/usr/lib/python3.4/site-packages/kivy/clock.py", line 483, in tick
self._process_events()
File "/usr/lib/python3.4/site-packages/kivy/clock.py", line 615, in _process_events
event.tick(self._last_tick, remove)
File "/usr/lib/python3.4/site-packages/kivy/clock.py", line 374, in tick
ret = callback(self._dt)
File "/usr/lib/python3.4/site-packages/kivy/core/window/window_sdl2.py", line 188, in create_window
super(WindowSDL, self).create_window()
File "/usr/lib/python3.4/site-packages/kivy/core/window/__init__.py", line 779, in create_window
self.dispatch('on_resize', *self.system_size)
File "kivy/_event.pyx", line 695, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:6970)
File "kivy/_event.pyx", line 1168, in kivy._event.EventObservers.dispatch (kivy/_event.c:12154)
File "kivy/_event.pyx", line 1092, in kivy._event.EventObservers._dispatch (kivy/_event.c:11729)
File "/home/onehitfinish/Downloads/Gregulator Files/test.py", line 81, in win_cb
MainScreen().font_size = new_size
File "/home/onehitfinish/Downloads/Gregulator Files/test.py", line 41, in __init__
super(MainScreen, self).__init__(**kwargs)
File "/usr/lib/python3.4/site-packages/kivy/uix/relativelayout.py", line 255, in __init__
super(RelativeLayout, self).__init__(**kw)
File "/usr/lib/python3.4/site-packages/kivy/uix/floatlayout.py", line 66, in __init__
super(FloatLayout, self).__init__(**kwargs)
File "/usr/lib/python3.4/site-packages/kivy/uix/layout.py", line 66, in __init__
super(Layout, self).__init__(**kwargs)
File "/usr/lib/python3.4/site-packages/kivy/uix/widget.py", line 271, in __init__
Builder.apply(self)
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1872, in apply
self._apply_rule(widget, rule, rule)
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 2018, in _apply_rule
e), cause=tb)
kivy.lang.BuilderException: Parser: File "main.kv", line 46:
...
44: text: "Simplify Fraction"
45: pos_hint: {"right": 1, "top":0.2}
>> 46: font_size: root.font_size
47:
48:
...
BuilderException: Parser: File "main.kv", line 46:
...
44: text: "Simplify Fraction"
45: pos_hint: {"right": 1, "top":0.2}
>> 46: font_size: root.font_size
47:
48:
...
AttributeError: 'MainScreen' object has no attribute 'font_size'
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1649, in create_handler
return eval(value, idmap)
File "main.kv", line 46, in <module>
font_size: root.font_size
File "kivy/weakproxy.pyx", line 19, in kivy.weakproxy.WeakProxy.__getattr__ (kivy/weakproxy.c:1101)
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 2011, in _apply_rule
value, rule, rctx['ids'])
File "/usr/lib/python3.4/site-packages/kivy/lang.py", line 1654, in create_handler
cause=tb)
任何有关解决此问题的帮助,或者可能建议另一种方法,因为我对 Kivy 非常陌生。
【问题讨论】: