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]')
我正在尝试将文本标签左列左对齐到 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]')