如何将位于同一行的 Kivy 小部件移得更远?

Posted

技术标签:

【中文标题】如何将位于同一行的 Kivy 小部件移得更远?【英文标题】:How to move Kivy widgets that live on the same row further apart? 【发布时间】:2021-12-01 17:50:21 【问题描述】:

我正在尝试找到一种方法来保留我在 main.kv 文件头设置中的三个小部件,并将两个外部小部件移到屏幕边缘。这就像一个顶部横幅,显示在每个屏幕上并包含时间、“主页按钮”和“设置按钮”。我有一个 main.kv 布局的绝对狗早餐,我真的不知道如何更改它以使其功能齐全并保持小部件可见。我将包括我正在讨论的部分的框架。

main.kv

GridLayout:
    cols: 1
    FloatLayout:
        GridLayout:
            canvas:
                Color:
                    rgb: utils.get_color_from_hex("#000523")
                Rectangle:
                    size: self.size
                    pos: self.pos
            rows: 1
            pos_hint: "top": 1, "left": 1
            size_hint: 1, .07
        GridLayout:
            rows: 1
            canvas:
                Color:
                    rgb: utils.get_color_from_hex("#000523")
                Rectangle:
                    size: self.size
                    pos: self.pos
            pos_hint: "top": .93, "center_x": .5
            size_hint: 1, .03
            ImageButton:
                id: home_button
                source: "icons/home.png"
                opacity: 1 if self.state == 'normal' else .5
                on_release:
                    app.change_screen("home_screen")
                    app.clear_results()
            Label:
                id: utc_time
                markup: True
                font_size: '20sp'
                text: ""
            ImageButton:
                id: settings_button
                source: "icons/cog.png"
                opacity: 1 if self.state == 'normal' else .5
                on_release:
                    app.change_screen("settings_screen")

我发现将我的三个小部件带回一个选项卡(不在GridLayout 下,而是作为FloatLayout 的子级)可以让我将它们重新定位到我想要的位置。这不起作用,因为我在 main.py 中引用它们并参考当前屏幕添加或删除这些小部件。我不断遇到的问题是它一直想在小部件之上添加小部件。我也将包含该功能。

main.py

def home_setting_widgets(self, screen_name):  # this is going to display the home and setting widgets once the app has already been opened
    home_button = self.root.ids["home_button"]
    utc_time = self.root.ids["utc_time"]
    settings_button = self.root.ids["settings_button"]
    grid_layout = self.root.children[0].children[2]
    if screen_name == "login_screen" or screen_name == "signup_screen" or screen_name == "welcome_screen":
        grid_layout.remove_widget(home_button)  # remove widgets if on the 3 screens listed
        grid_layout.remove_widget(utc_time)
        grid_layout.remove_widget(settings_button)
        self.home_and_setting = False
    else:
        if self.home_and_setting == False:
            grid_layout.add_widget(home_button)  # add widgets
            grid_layout.add_widget(utc_time)
            grid_layout.add_widget(settings_button)
            self.home_and_setting = True

我认为如果我将它们从GridLayout 中移出,问题在于它们不会被作为一个组引用,而是作为单独的小部件引用。我目前将它们捆绑在一起并在grid_layout = self.root.children[0].children[2] 行中引用。

我尝试从 main.kv 中删除 GridLayouts 及其内容,我尝试将小部件“标记”到不同的位置,我尝试以多种不同方式引用小部件。

我要做的就是将“主页按钮”和“设置按钮”稍微分开一点,这让我卡住了。如果有办法在不破坏一切的情况下移动它们,请告诉我。非常感谢您的帮助,谢谢。

【问题讨论】:

【参考方案1】:

尝试在具有“主页”、“时间”和“设置”的 GridLayout 中添加一些间距

GridLayout:
    rows: 1
    spacing: 1000
    canvas:

我无法从 kivy 文档页面获取要上传的图片,但 GridLayout kivy 文档有你想要的“间距”信息。

【讨论】:

传奇,谢谢。我会试一试,让你知道进展如何。 效果完全符合我的预期,谢谢!

以上是关于如何将位于同一行的 Kivy 小部件移得更远?的主要内容,如果未能解决你的问题,请参考以下文章

在没有终端的情况下打开 kivy 小部件?

如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?

如何在kivy的gridlayout中使小部件跨越多个列/行

如何传递一个值来初始化 Kivy 中的屏幕小部件?

如何在kivy中正确导入自定义小部件

如何从 kivy 小部件画布中删除特定说明?