【问题标题】:Resizing Text When Window Resizes Python/Kivy当窗口调整 Python/Kivy 大小时调整文本大小
【发布时间】: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 非常陌生。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    尝试在 MainScreen 中将 font_size 定义为 NumericProperty

    from kivy.properties import NumericProperty
    
    class MainScreen(Screen):
    
        font_size = NumericProperty()
    
        def __init__(self, **kwargs):
            super(MainScreen, self).__init__(**kwargs)
            self.font_size = 25
    

    【讨论】:

    • 现在当我调整窗口大小时它不会中断或任何东西,但它似乎没有改变 win_cb 函数中的 MainScreen().font_size。我不确定 MainScreen() 是否真的引用了一个全新的实例或其他东西,因此将其默认为 25,但是当我有类似 def win_cb(window, width, height): new_size = sqrt(width 2 + height2)/40.6 print(new_size) MainScreen().font_size = new_size print(MainScreen().font_size) 它打印类似 37.94142906643079 25 37.94142906643079 25 任何想法?
    • @Onehitfinish font_size: root.font_size*80/25 似乎有点毫无意义。似乎其中一个数字应该是浮点数,因为 80/25 只是 3
    • @Onehitfinish 另外,我很确定 MainScreen().font_size = new_size 确实创建了一个新的 MainScreen 实例。唯一的问题是,该实例甚至没有被保存到变量或任何东西中,所以当 win_cb 返回时可能会被销毁。另外,为什么你在 build 方法中定义了 win_cb?
    • 我觉得这是我应该做的事情。基本上我把它放在 MainApp 中的原因是因为github.com/kivy/kivy/issues/789 将它放在从 App 继承的类中,所以我认为这就像标准。正如我所说,我对 Kivy 很陌生。您认为将相关代码粘贴到类中基本上可以工作(进行小的调整,例如将 MainScreen() 替换为 self perhpaps),还是我应该以不同的方式这样做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多