【问题标题】:Why label isn't inside the layout?为什么标签不在布局内?
【发布时间】:2017-05-05 19:40:30
【问题描述】:

我正在尝试使某种标签有点透明,其中包含文本。问题是文本不在布局内,我不知道为什么。

from kivy.core.window import Window
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Label, Button
from kivy.graphics import Rectangle,Color

class Visor(App):

def build(self):
    Window.size=(400,600)
    print(Window.size)

    r = RelativeLayout()
    r.size = (400, 550)
    with r.canvas:
        Color(0.6, 0.6, .1, 0.8)
        bg_rect =  Rectangle(pos=(0,0), size=(400, 550))

    r2 = FloatLayout()
    r2.size=(100,150)
    with r2.canvas:
        Color(.9, 0.1, 0.6, 0.8)
        bg_rect = Rectangle(pos=(0, 0), size=(200,150))

    r2.pos=(50,70)
    r.add_widget(r2)
    r2.add_widget(Label(text="Detective Comics Vol.1 #878"))
    return r

if __name__ == "__main__":
    Visor().run()

【问题讨论】:

    标签: python user-interface layout kivy


    【解决方案1】:

    当您使用任何布局时,您应该使用size_hint,然后使用从 0 到 1(0% 到 %100)的比例坐标。然而,如果你想尊重size,你应该通过将size_hint设置为(None, None)来停用它:

    from kivy.core.window import Window
    from kivy.app import App
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.relativelayout import RelativeLayout
    from kivy.uix.button import Label, Button
    from kivy.graphics import Rectangle,Color
    
    class Visor(App):
    
        def build(self):
            Window.size=(400,600)
            print(Window.size)
    
            r = RelativeLayout()
            r.size_hint = (None, None) 
            r.size = (400, 550)
            with r.canvas:
                Color(0.6, 0.6, .1, 0.8)
                bg_rect =  Rectangle(pos=(0,0), size=(400, 550))
    
            r2 = FloatLayout()
            r2.size_hint = (None, None) 
            r2.size=(100,150)
            with r2.canvas:
                Color(.9, 0.1, 0.6, 0.8)
                bg_rect = Rectangle(pos=(0, 0), size=(200,150))
    
            r2.pos=(50,70)
            r.add_widget(r2)
            r2.add_widget(Label(text="Detective Comics Vol.1 #878"))
            return r
    
    if __name__ == "__main__":
        Visor().run()
    

    此外,您应该为此使用 Kivy 语言,它更容易并且可以轻松地在内部绑定属性。


    将此代码添加到文件头部可以帮助您发现布局问题:

    from kivy.lang import Builder
    Builder.load_string('''
    <Widget>:
        canvas.after:
            Line:
                rectangle: self.x+1,self.y+1,self.width-1,self.height-1
                dash_offset: 5
                dash_length: 3
    ''')
    

    如需解释和其他技巧,go here

    【讨论】:

    • 谢谢。我明白我的错误了。
    【解决方案2】:

    Kivy 小部件有一个属性size_hint,它可以根据父级大小调整小部件的大小。默认设置为(1,1),因此每当父级调整大小时,子级都会调整大小。

    当您设置矩形的大小时,这些是由绝对值给出的,根本不会调整大小。这意味着彩色矩形不是布局的“真实”大小。

    至少对我来说,当应用程序启动时,窗口会立即调整大小,并随之调整根窗口 (r)。然后所有子小部件都调整为窗口大小的 100%,但彩色矩形不会调整大小。

    如果您将标签的size_hint 设置为None, None,则不会发生大小调整,它应该按照您的意愿显示。

    也许更好的方法是在 kv 语言文件中定义矩形等。即

    RelativeLayout:
        Label:
            text: "Detective Comics Vol.1 #878"
        canvas:
            Color(0.8, 0.8, .1, 0.8)
            Rectangle(pos=self.pos, size=self.size)
    ...
    

    这样每当相对布局的位置或大小发生变化时,矩形就会得到更新。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多