【问题标题】:Kivy label alignmen from python file来自python文件的Kivy标签对齐
【发布时间】:2020-12-10 23:39:33
【问题描述】:

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

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

结果如下:

有什么建议吗?

提前致谢

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

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

    此外,您的 width150 会导致较长文本的换行。这不是错误,只是决定是否要换行。

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

    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]')
    

    【讨论】:

    • Tnx 约翰!一切都清晰,就像一个魅力;)
    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2016-05-08
    • 2018-09-05
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多