【问题标题】:Multiple classes in one screen stops FloatLayout from working correctly一个屏幕中的多个类使 FloatLayout 无法正常工作
【发布时间】:2020-04-29 11:18:57
【问题描述】:

我正在尝试将广告合并到我制作的 Kivy 应用程序中,为此,我希望在 FloatLayout 中有一个类(带有广告)位于我的屏幕顶部,以及应用程序的其余部分在下面,在一个单独的类中。

我试图让它与一些测试代码一起工作(简单的 .py 和 .kv 文件,它有多个屏幕和类并相应地组织)。代码应该有两个浮动布局:一个有文本,另一个有一个按钮,您可以按下它并带您进入下一个屏幕。但是我遇到的问题是我无法正确定位按钮,因为它似乎在左下角缩小了小部件。它应该在文本框旁边。

这是我的 .kv 文件:

WindowManager:
    Screen1:
    Screen2:

<Screen1>:
    name: "screen1"
    FloatLayout:
        Label:
            pos_hint: {'top': 1, "center_x": 0.5}
            size_hint: (0.2, 0.5)
            font_size: 40
            text: "TEXT AT TOP OF SCREEN"
    FloatLayout:
        TextInput:
            pos_hint: {"x": 0.1, "y": 0.05}
            size_hint: (0.3, 0.05)
            multline:False
    GoS:
        FloatLayout:
            Button:
                text: "PRESS TO GO TO SCREEN 2"
                pos_hint: {"right": 0.5, "center_y": 0.7}
                on_press: widget.goscreen()

<Screen2>:
    name: "screen2"
    Label:
        text: "YOU ARE ON SCREEN TWO"

这里是 .py 文件:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen

class Screen1(Screen):
    pass

class GoS(Widget):
    def goscreen(self):
        self.parent.current = "screen2"

class Screen2(Screen):
    pass

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("rec_view.kv")

class TestApp(App):
    def build(self):
        return kv

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

为什么会这样?

另一个小问题是我的按钮不起作用,因为我似乎无法调用正确的类。如果我使用“root.goscreen()”,它就不起作用,因为我的根小部件没有这个功能。这里的正确语法应该是什么?

【问题讨论】:

  • 您的 Screen1 类包含 3 个孩子(2 个 FloatLayouts 和一个 GoS)。其中每一个都是Screen1 的完整大小,因为默认的size_hint(1,1)FloatLayoutGoS 中的大小将是(100,100),因为GoS 不是Layout 并且不尊重size_hint。目前尚不清楚您希望最终的 gui 是什么样子,但获得具有顶部、中间和底部部分的 gui 的更好方法可能是使用BoxLayout。另请注意FloatLayout 是限制最少的Layout,因此将Label 放在FloatLayout 中并不意味着它会被绘制在里面。
  • 太棒了,谢谢!随意添加这个作为答案,我可以接受它:) 我将我的类 GoS 从小部件更改为 FloatLayout 并修复它。 BoxLayouts 仍然让我有些困惑,但我知道通常容器比浮动更好。还有一个问题,您是否知道我应该调用什么才能调用我的 GoS 课程(最后一点)?
  • 如果您在kv 中的GoS: 规则中添加id(例如:id: gos),那么您的on_press 用于Button 可以是on_press: gos.goscreen()。您可以在 goscreen() 方法中将 self.parent.current = "screen2" 替换为 kv.current = "screen2"

标签: python kivy kivy-language


【解决方案1】:

我建议你使用BoxLayout 来划分你的GUI。

您的按钮不起作用,因为您没有将它链接到有效的小部件。

GoS 小部件必须在 KV 中定义或导入。

这是您的 rec_view.kv 文件的建议:

WindowManager:
    Screen1:
    Screen2:

<GoS>:
    Button:
        text: "PRESS TO GO TO SCREEN 2"
        on_press: root.goscreen()

<Screen1>:
    name: "screen1"
    BoxLayout:
        orientation: "vertical"
        BoxLayout:
            orientation: "horizontal"
            size_hint_y: 0.5   # Proportion of screen height that the widget occupe
            Label:
                font_size: 40
                text: "TEXT AT TOP OF SCREEN"
        BoxLayout:
            orientation: "horizontal"
            size_hint_y: 0.3
            TextInput:
                multline:False
        BoxLayout:
            orientation: "horizontal"
            size_hint_y: 0.2
            GoS:

<Screen2>:
    name: "screen2"
    Label:
        text: "YOU ARE ON SCREEN TWO"

goscreen的定义不正确,GoS不是Screen,所以他的父母没有current,改用App.get_running_app().root.current = "screen2"

我不知道你想做什么以及为什么要定义GoS 类,但你可以避免它。通过将goscreen 定义移动到Screen1 类中,并将Screen1 的第三个BoxLayout 替换为:

    BoxLayout:
        orientation: "horizontal"
        size_hint_y: 0.2
        Button:
            text: "PRESS TO GO TO SCREEN 2"
            on_press: root.goscreen()

【讨论】:

  • 您好,非常感谢您的回答。我尝试这样做的真正原因是因为我正在尝试使用 KivyMob 将广告集成到我的应用程序中,并且文档向我展示了一个带有单独运行命令的单独类,所以我试图找出一种方法在我的主代码中组合它。我希望通过测试代码(就像我所做的那样)可以帮助我了解如何将这两段代码合并在一起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多