J'essaie de créer une mise en page dans Kivy / KivyMD qui est réactif, centré et défilable. Jusqu'à présent, j'ai développé deux mises en page, une personne qui se concentre sur une boîte à flotteur et qui peut être magnifiquement redimensionnée, mais cela ne fait pas défiler. J'ai également développé une mise en page qui est une gridlayout dans une vision de défilement, il redimensionnement joliment, mais à de grandes tailles de fenêtre, elle ne centriste pas correctement la gridlayout correctement.
J'ai essayé de mettre un boxlayout dans un flotteur dans une vision de Scrollay, il Redimensionnement magnifiquement mais la barre de défilement ne fonctionne pas. P>
Je n'ai pas été incapable de combiner la mise en page centrée sur la redimensionnement dans une envoi correctement de travail. Comment devrais-je accomplir cela? P>
Voici mon exemple de ScrollView: P>
from kivymd.app import MDApp from kivy.lang import Builder from kivy.uix.scrollview import ScrollView from kivy.uix.floatlayout import FloatLayout LIPSUM = """Very long lipsum...""" Builder.load_string(""" <ExampleCenter@FloatLayout>: BoxLayout: orientation: 'vertical' # Gives the BoxLayout a max and min width that is responsive size_hint_x: .75 size_hint_max_x: dp(800) size_hint_min_x: min(dp(400), root.width) # Centers the BoxLayout horizontally responsively pos_hint: {'center_x': .5} padding: 0, dp(16), 0, 0 MDLabel: text: app.label_text + app.label_text halign: 'justify' padding: dp(16), dp(16) markup: True font_style: 'Body1' theme_text_color: 'Primary' size_hint_y: None height: self.texture_size[1] MDLabel: text: app.label_text + app.label_text halign: 'justify' padding: dp(16), dp(16) markup: True font_style: 'Body1' theme_text_color: 'Primary' size_hint_y: None height: self.texture_size[1] Widget """) class ExampleCenter(FloatLayout): pass class Example(MDApp): title = "Dialogs" label_text = LIPSUM def build(self): return ExampleCenter() Example().run()
3 Réponses :
Le problème est que vous essayez d'utiliser et créer le pos_hint code> dans un enfant d'un
ScrollView code> (qui n'honore pas cette propriété). Ainsi, plutôt que d'essayer de centrer l'enfant du
ScrollView code>, centrez le
ScrollView code> lui-même. Cela signifie que le
ScrollView code> doit être placé dans une mise en page code> code>. Donc, si vous utilisez
floatlayout code>, vous pouvez faire quelque chose comme:
examplefl code> classe: p>
class ExampleFL(FloatLayout):
pass
Après avoir appliqué vos modifications, Taille_hint_x: .75 b>, Taille_hint_max_x: DP (800) B>, Taille_hint_min_x: Min (DP (400), root.Width) b > Ne fonctionne plus dans la gridlayout et ne manque pas de magnifiques redimensionnements de la mise en page.
Vous essayez à nouveau d'utiliser indicateurs code> dans l'enfant d'un
ScrollView code>, qui n'honore pas de telles propriétés. Vous pouvez appliquer de telles astuces au
ScrollView code> elle-même (car ils sont traités par le
floatlayout code>). Vous pouvez également utiliser
ze_hint code> pour les enfants du
gridlayout code> (mais pas
pos_hint code>), car à nouveau, ils sont géré par le
Gridlayout code>.
Je ne peux pas atteindre mes résultats souhaités de cette façon. Je vais mettre en œuvre le centrage dans ScrollView Programmatiquement.
Mise en œuvre programmatique de la vue de centrage dans ScrollView manipulant le rembourrage. Cela me donne les résultats souhaités.
from kivymd.app import MDApp from kivy.lang import Builder from kivy.metrics import dp from kivy.properties import NumericProperty from kivy.uix.floatlayout import FloatLayout from kivy.uix.gridlayout import GridLayout LIPSUM = """Very long lipsum...""" Builder.load_string(""" <ExampleScroll@FloatLayout>: ScrollView: do_scroll_x: False bar_width: 10 bar_color: app.theme_cls.primary_color bar_color_acrive: app.theme_cls.accent_color effect_cls: "DampedScrollEffect" scroll_type: ['bars'] ScrollCenterLayout: cols: 1 rel_max: dp(800) rel_min: dp(400) orientation: 'vertical' size_hint_y: None height: self.minimum_height MDLabel: text: app.label_text + app.label_text halign: 'justify' padding: dp(16), dp(16) markup: True font_style: 'Body1' theme_text_color: 'Primary' size_hint_y: None height: self.texture_size[1] MDLabel: text: app.label_text + app.label_text halign: 'justify' padding: dp(16), dp(16) markup: True font_style: 'Body1' theme_text_color: 'Primary' size_hint_y: None height: self.texture_size[1] Widget """) class ScrollCenterLayout(GridLayout): rel_max = NumericProperty(dp(800)) rel_min = NumericProperty(dp(400)) def __init__(self, **kwargs): super(ScrollCenterLayout, self).__init__(**kwargs) self.rel_max = kwargs.get('rel_max', dp(800)) self.rel_min = kwargs.get('rel_min', dp(400)) def on_width(self, instance, value): if self.rel_max < value: padding = max(value * .125, (value - self.rel_max) / 2) elif self.rel_min < value: padding = min(value * .125, (value - self.rel_min) / 2) elif self.rel_min < value: padding = (value - self.rel_min) / 2 else: padding = 0 self.padding[0] = self.padding[2] = padding class ExampleScroll(FloatLayout): pass class Example(MDApp): label_text = LIPSUM def build(self): self.theme_cls.primary_palette = "LightGreen" self.theme_cls.accent_palette = "Green" self.theme_cls.theme_style = "Dark" return ExampleScroll() Example().run()
Ce que vous avez à faire est d'abord, créez une vision de ScrollView, si possible, vous pouvez utiliser, Recycletview afin que vous puissiez faciliter l'ajout de widget en tant que classes définies comme widgets:
Exemple: P>
app.root.ids.scrollview_id_of_your_widget.data.append({"viewclass": "Thing1", })