python 文件中的 Kivy 标签 alignmen

Kivy label alignmen from python file

我正在尝试将文本标签左列左对齐到 Kivy GridLayout 中, 为此,我尝试将 Label 小部件放入 BoxLayout 中,并在其上设置静态宽度,但发生了奇怪的行为,标签文本似乎向左移动(超出 window),文本较长,这里是示例:

main.py

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class MyApp(MDApp):

    def build(self):
        self.theme_cls.primary_palette = "Blue"
        self.theme_cls.primary_hue = "A700"
        self.theme_cls.theme_style = "Light"
        screen = Builder.load_file('main.kv')
        return screen

    def on_start(self):
        self.update_data()

    def update_data(self, *args):
        events = [['soccer', '01/01/2020', '15:00', 'Borussia Dortmund', 'Borussia Monchengladbach', '1', 'William Hill', '2.55', 'Stanleybet' ,'3.40'],['soccer', '01/01/2020', '15:00', 'Roma', 'Lazio', '1', 'William Hill', '2.55', 'Stanleybet' ,'3.40'],['soccer', '01/01/2020', '15:00', 'Barcellona', 'Atletico De Madrid', '1', 'William Hill', '2.55', 'Stanleybet' ,'3.40']]
        for event in events:
            event_sport = str(event[0])
            event_date = str(event[1])
            event_time = str(event[2])
            home_contender = str(event[3])
            away_contender = str(event[4])
            event_sign = str(event[5])
            event_portal = str(event[6])
            event_portal_odds = event[7]
            event_portal2 = str(event[8])
            event_portal2_odds = str(event[9])
            event_data_content = BoxLayout(size_hint_x=None, width=180)
            event_data = Label(text=f'[color=#000000][size=14][b]{event_sport.upper()}[/b][/size]\n'
                                f'[size=13]{event_date} {event_time}[/size]\n'
                                f'{home_contender}\n'
                                f'{away_contender}[/color]',
                           size_hint_x=None,
                           width=150,
                           halign='left',
                           valign='top',
                           markup=True)
            event_data_content.add_widget(event_data)
            event_sign = Label(text=f'[color=000000][size=20]{event_sign}[/size][/color]',
                           halign='center',
                           valign='top',
                           markup=True)
            event_p = Label(text=f'[color=000000][i]{event_portal}[/i]\n'
                                  f'[size=13][b]{event_portal_odds}[/b][/color]',
                             halign="center",
                             valign="top",
                             markup=True)
            event_p2 = Label(text=f'[color=000000][i]{event_portal2}[/i]\n'
                                f'[size=13][b]{event_portal2_odds}[/b][/color]',
                           halign="center",
                           valign="top",
                           markup=True)
            self.root.ids.content.add_widget(event_data_content)
            self.root.ids.content.add_widget(event_sign)
            self.root.ids.content.add_widget(event_p)
            self.root.ids.content.add_widget(event_p2)


MyApp().run()

main.kv

Screen:
    BoxLayout:
        orientation: 'vertical'
        ScrollView:
            do_scroll_x: False
            do_scroll_y: True
            MDGridLayout:
                id: content
                cols:4
                size_hint_y: None
                height: self.minimum_height
                row_default_height: '90dp'
                row_force_default: True

这里是结果:

有什么建议吗?

提前致谢

为了使您的 halign 正常工作,您必须设置 text_size(请参阅 documentation)。

此外,您的 width of 150 导致较长文本换行。这不是错误,只是关于是否要换行的决定。

尝试对您的代码进行以下更改:

event_data 创建自定义 Label:

class EventLabel(Label):
    pass

为新 EventLabel 添加 kv 规则:

<EventLabel>:
    size_hint_x: None
    width: 200             # the previous width of 150 caused text wrapping
    text_size: self.size   # this is needed to allow halign/valign to operate
    halign: 'left'
    valign: 'top'
    markup: True

在您的代码中使用新的 EventLabel

        event_data = EventLabel(text=f'[color=#000000][size=14][b]{event_sport.upper()}[/b][/size]\n'
                            f'[size=13]{event_date} {event_time}[/size]\n'
                            f'{home_contender}\n'
                            f'{away_contender}[/color]')