Несколько классов на одном экране мешают FloatLayout работать правильно - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь включить рекламу в приложение 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 ()», он не будет работать, так как мой виджет root не имеет этой функции. Какой должен быть правильный синтаксис здесь?

1 Ответ

1 голос
/ 29 апреля 2020

Я рекомендую вам использовать 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 и заменив 3-й BoxLayout из Screen1 следующим:

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