簡體   English   中英

如何在 python 的 .kv 文件中將小部件添加到 gridlayout?

[英]How can i add a widget to gridlayout in the .kv file from python?

我試圖遍歷 python 中的對象列表,並將它們添加到 my.kv 文件中的 gridlayout。

主.py文件:

import kivy
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen

kivy.require('2.1.0')

posts = [('post1 title', 'post1 content), ('post2 title', 'post2 content)]

class Post:
    def __init__(self, title, content):
    self.title = title
    self.content = content

class MainPage(Screen):
    posts_to_display = [Post(post[1], post[2]) for post in posts]

class Window(App):
    def build(self): 
        sm = ScreenManager() 
        sm.add_widget(MainPage(name="homepage"))
        return sm


if __name__ == '__main__':
    Window().run()

.kv 文件:

#kivy 2.1.0

<MainPage>:
    canvas.before:
        Color: 
            rgba: (28/255, 31/255, 33/255, 1)
        Rectangle:
            pos:self.pos 
            size:self.size
    ScrollView:
    GridLayout:
            rows: 5
            size_hint_y: 1.5
            spacing: 10, 10
            padding: 10, 10

如何將 posts_to_display 中的所有元素添加到posts_to_display

我嘗試導入kivy.uix.gridlayout但找不到與 .kv 文件交互的方法

你可以做這樣的事情,如果你不想滾動GridLayout ,只需刪除ScrollViewself.size_hint_y = None; self.height = 50 self.size_hint_y = None; self.height = 50

from kivy.app import App
from kivy.uix.button import Button
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock

posts = [(f'title {i}', f'content {i}') for i in range(10)]

KV = """
<MainPage>:
    canvas.before:
        Color: 
            rgba: (28/255, 31/255, 33/255, 1)
        Rectangle:
            pos:self.pos 
            size:self.size
    
    ScrollView:
        GridLayout:
            id: grid
            rows: 5
            size_hint_y: None
            spacing: dp(10)
            padding: [dp(10), ]
        

BoxLayout:
    ScreenManager:
        MainPage:
            id: mp
            name: "homepage"
"""


class Post(Button):
    def __init__(self, title: str, content: str, **kwargs):
        super().__init__(**kwargs)
        self.text = title
        self.content = content
        self.size_hint_y = None
        self.height = 50


class MainPage(Screen):
    posts_to_display = [Post(post[0], post[1]) for post in posts]

    def post_add(self):
        for widget in self.posts_to_display:
            self.ids.grid.add_widget(widget)


class TestApp(App):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        Clock.schedule_once(lambda dt: self.root.ids.mp.post_add())


if __name__ == '__main__':
    TestApp().run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM