Невозможно переключать экраны с использованием языка киви - PullRequest
0 голосов
/ 19 мая 2019

Я новичок в киви.Я пытаюсь создать простую программу для переключения между двумя экранами.Первый экран содержит кнопку, которая при включении переключится на второй экран.При нажатии кнопки на втором экране вы попадете на первый экран.

Проблемы, с которыми я сталкиваюсь: 1. Кнопка расположена в углу, и я ожидаю, что ее размер будет полным окном, но она небольшая

При нажатии и отпускании кнопки не отображается никакого эффекта.

Chat.kv

<ChatGUI>:
    MainManager:
        MainWindow:
        SecondWindow:

<MainWindow>:
    name: "main"
    Button:
        text:"to second window"
        on_release:app.root.current="second"

<SecondWindow>:
    name: "second"
    Button:
        text:"back to main"
        on_release:app.root.current="main"

код Python:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.graphics import Rectangle, Color, Canvas
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.core.window import Window
from kivy.config import Config
from kivy.lang import Builder

class ChatGUI(Widget):
    present=Builder.load_file("Chat.kv")
class MainWindow(Screen):
    pass
class SecondWindow(Screen):
    pass
class MainManager(ScreenManager):
    pass

class ChatApp(App):
    def build(self):
        return ChatGUI()

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

Мой вывод# Я не могу добавить изображение, поэтому размещена ссылка на вывод

enter image description here

Я практикуюсь из учебника YouTube.

Я проверил много кодов из переполнения стека, и я не вижу проблем в моем коде.

вывод должен отображать кнопку размера, занимающего все окно, и on_release, он должен переключаться на следующий экран.

Можете ли вы дать мне знать, что может быть проблемой.

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Проблема 1 - виджет @ нижний левый угол и не полное окно?

Кнопка расположена в углу, и я ожидаю, что ее размер будет заполнен окно но оно маленькое

Основная причина

  1. Виджет «Кнопка» появился в нижнем левом углу, поскольку корнем является Виджет , и позиция не указана ( pos или pos_hint ). Поэтому была использована позиция по умолчанию (0, 0).
  2. Размер не является полным окном, поскольку по умолчанию размер Виджета равен (100 x 100) или по умолчанию size_hint равен (1, 1).

Kivy Widget »Значения по умолчанию

  • A Виджет не является макетом : он не изменит положение или размер дочерних элементов. Если вы хотите контролировать позиционирование или размер, используйте макет .
  • Размер виджета по умолчанию - (100, 100). Это изменяется только в том случае, если родителем является Layout . Например, если вы добавите метку внутри Кнопка, метка не будет наследовать размер кнопки или положение потому что кнопка не является макетом: это просто другой виджет.
  • Размер size_hint по умолчанию - (1, 1). Если родителем является макет, то размер виджета будет равен размеру родительского макета.

Проблема 2 - при нажатии кнопки разблокировки экран не переключается?

При нажатии и отпускании кнопка не показывает никакого эффекта.

Основная причина

Экран не переключался при отпускании кнопки, поскольку корень приложения не является ScreenManager .

Решение

Есть два варианта решения проблем.

Вариант 1 - использовать Layout в качестве root

Эта опция использует BoxLayout в качестве корня и требует следующих улучшений. A Layout может быть GridLayout, BoxLayout, FloatLayout и т. Д.

Py file

  1. Заменить виджет на BoxLayout
  2. Заменить present = Builder.load_file(...) на Builder.load_file(...)
  3. Переместить Builder.load_file(...) из class ChatGUI() и добавить pass

файл kv

  1. Добавить id: sm под созданным объектом, MainManager:
  2. Заменить app.root.current на app.root.ids.sm.current

Фрагменты - вариант 1

main1.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder


Builder.load_file("main1.kv")


class ChatGUI(BoxLayout):
    pass


class MainWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class MainManager(ScreenManager):
    pass


class ChatApp(App):
    def build(self):
        return ChatGUI()


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

main1.kv

<ChatGUI>:
    MainManager:
        id: sm
        MainWindow:
        SecondWindow:

<MainWindow>:
    name: "main"
    Button:
        text: "to second window"
        on_release: app.root.ids.sm.current="second"

<SecondWindow>:
    name: "second"
    Button:
        text: "back to main"
        on_release: app.root.ids.sm.current="main"

Вариант 2 - использовать ScreenManager в качестве root

Эта опция требует следующих улучшений:

Py file

  1. Удалить оператор импорта, from kivy.uix.widget import Widget
  2. Удалить class ChatGUI()
  3. Заменить return ChatGUI() на return MainManager()
  4. Заменить present = Builder.load_file(...) на Builder.load_file(...)

файл kv

  1. Удалить правило класса: в файле kv
  2. Заменить MainManager: правилом класса:

Отрывки - вариант 2

main2.py

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


Builder.load_file("main2.kv")


class MainWindow(Screen):
    pass


class SecondWindow(Screen):
    pass


class MainManager(ScreenManager):
    pass


class ChatApp(App):
    def build(self):
        return MainManager()


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

main2.kv

<MainManager>:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"
    Button:
        text: "to second window"
        on_release: app.root.current="second"

<SecondWindow>:
    name: "second"
    Button:
        text: "back to main"
        on_release: app.root.current="main"
0 голосов
/ 20 мая 2019

Вам не нужно добавлять ScreenManager внутри Widget. Так

class ChatGUI (ScreenManager):

в файле Python и

<ChatGUI>:
     MainWindow:
     SecondWindow:

в кв файле это все, что я изменил, чтобы ваш пример работал.

Chat.kv

<ChatGUI>:
    MainWindow:
    SecondWindow:

<MainWindow>:
    name: "main"
    Button:
        text:"to second window"
        on_release:app.root.current="second"

<SecondWindow>:
    name: "second"
    Button:
        text:"back to main"
        on_release:app.root.current="main"

main.py

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.graphics import Rectangle, Color, Canvas
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.core.window import Window
from kivy.config import Config
from kivy.lang import Builder

class ChatGUI(ScreenManager):
    present=Builder.load_file("Chat.kv")

class MainWindow(Screen):
    pass
class SecondWindow(Screen):
    pass

class ChatApp(App):
    def build(self):
        return ChatGUI()

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