英文:
Kivy AnchorPoint is not in the right place
问题
我正在尝试将文本置于窗口顶部居中,但最终它被截断在左下角。
我有以下Python代码:
# anchortest.py
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.widget import Widget
class Root(Widget):
    pass
class TextTitle(AnchorLayout):
    pass
class AnchorTestApp(App):
    def build(self):
        return Root()
    
AnchorTestApp().run()
以及它的关联kv文件。
# anchortest.kv
<Root>
    TextTitle:
<TextTitle>
    anchor_x: 'center'
    anchor_y: 'top'
    Label:
        id: score
        text: 'Hello World'
        font_name: 'Courier New'
        font_size: 40
        pad_x: 10
        pad_y: 10
当我运行应用程序时,我得到了这个:
英文:
I am trying to just put a piece of text centred in the top on the window but it ends up truncated in the bottom left.
I have the following python code:
# anchortest.py
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.widget import Widget
class Root(Widget):
    pass
class TextTitle(AnchorLayout):
    pass
class AnchorTestApp(App):
    def build(self):
        return Root()
AnchorTestApp().run()
and it's associated kv file.
# anchortest.kv
<Root>
    TextTitle:
<TextTitle>
    anchor_x: 'center'
    anchor_y: 'top'
    Label:
        id: score
        text: 'Hello World'
        font_name: 'Courier New'
        font_size: 40
        pad_x: 10
        pad_y: 10
When I run the app I get this:
答案1
得分: 1
不要使用 AnchorLayout,只需使用 BoxLayout 并添加以下代码:
pos_hint: {'top': 1}
size_hint_y: None
from kivy.app import App
from kivy.lang.builder import Builder
KV = """   
Screen:
    BoxLayout:
        orientation: 'vertical'
        
        BoxLayout:
            pos_hint: {'top': 1}
            size_hint_y: None
            
            canvas.before:
                Color:
                    rgba: [0.5, 0, 1, 1]
                    
                Rectangle:
                    pos: self.pos
                    size: self.size
            
            Label:
                text: 'Hello World'
                font_size: sp(60)
                
        BoxLayout:
            Label:
                text: 'Screen text'
"""
class TestApp(App):
    def build(self):
        return Builder.load_string(KV)
TestApp().run()
你还可以使用 Label 的参数 valign 和 halign:
KV = """   
Screen:
    Label:
        text: 'Hello World'
        font_size: sp(60)
        text_size: self.size
        halign: 'center'
        valign: 'top'
"""
如果你确实想要出于某种原因使用 AnchorLayout,可以这样做。根据 kivy 文档,为了使 AnchorLayout 的规则生效,必须为 Label 设置以下代码:
size_hint_y: None
height: self.height
KV = """ 
AnchorLayout:
    anchor_x: 'center'
    anchor_y: 'top'
            
    Label:
        text: 'Hello World'
        font_size: sp(60)
        size_hint_y: None
        height: self.height
"""
英文:
Don't use AnchorLayout for this case, just use BoxLayout with
pos_hint: {'top': 1}
size_hint_y: None
from kivy.app import App
from kivy.lang.builder import Builder
KV = """   
Screen:
    BoxLayout:
        orientation: 'vertical'
        
        BoxLayout:
            pos_hint: {'top': 1}
            size_hint_y: None
            
            canvas.before:
                Color:
                    rgba: [0.5, 0, 1, 1]
                    
                Rectangle:
                    pos: self.pos
                    size: self.size
            
            Label:
                text: 'Hello World'
                font_size: sp(60)
                
        BoxLayout:
            Label:
                text: 'Screen text'
"""
class TestApp(App):
    def build(self):
        return Builder.load_string(KV)
TestApp().run()
You also can use Label parametrs valign and halign:
KV = """   
Screen:
    Label:
        text: 'Hello World'
        font_size: sp(60)
        text_size: self.size
        halign: 'center'
        valign: 'top'
"""
> In order to control sizing, you must specify text_size to constrain
> the text and/or bind size to texture_size to grow with the text.
If you really want to use AnchorLayout for some reason, it's done this way. Following the kivy documentation, in order for the AnchorLayout rules to apply, the Label must be set with
size_hint_y: None
height: self.height
> The size_hint is a tuple of values used by layouts to manage the sizes
> of their children. It indicates the size relative to the layout’s size
> instead of an absolute size (in pixels/points/cm/etc)
KV = """ 
AnchorLayout:
    anchor_x: 'center'
    anchor_y: 'top'
            
    Label:
        text: 'Hello World'
        font_size: sp(60)
        size_hint_y: None
        height: self.height
"""
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。



评论