Ярлык не обновляет Kivy - PullRequest
0 голосов
/ 22 мая 2018

Итак, у меня есть два файла:

  1. returnStation.py
  2. returnStationLayout.kv

Чего я пытаюсь достичь: Есть два экрана.Одним из них является цифровая клавиатура.Как только вы наберете свой номер и нажмете клавишу ввода, вы попадете на следующий экран.И я надеюсь, что на другом экране отобразится номер, который вы только что набрали.

Проблема, с которой я столкнулся: Я попытался получить доступ к идентификатору метки, которую я пытаюсь изменить, чтобы показать номер, ноэто не работает: / Я не получаю никакой ошибки в терминале.

Могу ли я получить доступ к значениям неправильно?Если да, то посоветуйте, пожалуйста, как это сделать на двух экранах.Цени любую помощь!


Это файл - returnStation.py:

Как я пытался изменить метку с помощью getPoints ()

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

class ScreenOne(Screen):
    pass

class ScreenTwo(Screen):
    pass

class PhoneGridLayout(GridLayout):

    def backspace(self, textString):
        newTextString = textString[0:-1]
        self.display.text = newTextString

    def getPoints(self, phoneNumber):
        st = ScreenTwo()
        st.ids.memberStatus.text = phoneNumber   #THIS IS HOW I ATTEMPTED TO CHANGE THE LABEL

class ReturnStationLayoutApp(App):
    pass


mainscreen = ScreenOne()
mainlayout = PhoneGridLayout()
mainscreen.add_widget(mainlayout)

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

это файл - returnStationLayout.kv:

Метка, которую я пытаюсь изменить, находится полностью внизуэтот файл

ScreenManager:
    id: screen_manager
    ScreenOne:
        id: screen_one
        name: 'menu'
        manager: 'screen_manager'
    ScreenTwo:
        id: screen_two
        name: 'settings'
        manager: 'screen_manager'

<CustButton@Button>:
    font_size: 32

<ScreenOne>:
    PhoneGridLayout:
        id: numberPad
        display: entry
        rows: 5
        padding: [300,200]
        spacing: 10

        # Where input is displayed
        BoxLayout:
            Label:
                text: "+65"
                font_size: 50
                size_hint: 0.2, 1
            TextInput:
                id: entry
                font_size: 50
                multiline: False
                padding: [20, ( self.height - self.line_height ) / 2]


        BoxLayout:
            spacing: 10
            CustButton:
                text: "1"
                on_press: entry.text += self.text
            CustButton:
                text: "2"
                on_press: entry.text += self.text
            CustButton:
                text: "3"
                on_press: entry.text += self.text
            CustButton:
                text: "DEL"
                on_press: numberPad.backspace(entry.text)

        BoxLayout:
            spacing: 10
            CustButton:
                text: "4"
                on_press: entry.text += self.text
            CustButton:
                text: "5"
                on_press: entry.text += self.text
            CustButton:
                text: "6"
                on_press: entry.text += self.text
            CustButton:
                text: "AC"
                on_press: entry.text = ""

        BoxLayout:
            spacing: 10
            CustButton:
                text: "7"
                on_press: entry.text += self.text
            CustButton:
                text: "8"
                on_press: entry.text += self.text
            CustButton:
                text: "9"
                on_press: entry.text += self.text
            CustButton:
                text: "Enter" #HERE IS THE ENTER BUTTON
                on_press:
                    app.root.transition.direction = 'left'
                    app.root.transition.duration = 1
                    app.root.current = 'settings'
                    numberPad.getPoints(entry.text)

        BoxLayout:
            spacing: 10
            Label:
                text: ""
            CustButton:
                text: "0"
                on_press: entry.text += self.text
            Label:
                text: ""
            Label:
                text: ""

<ScreenTwo>:
    BoxLayout:
        Label:
            id: memberStatus
            text: ''  #THIS IS THE LABEL I AM TRYING TO CHANGE
        Button:
            text: 'Back to menu'
            on_press:
                app.root.transition.direction = "right"
                app.root.current = 'menu'

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Используйте Kivy ObjectProperty и ScreenManager , вы можете использовать root.manager ... в файле kv и self.manager вСкрипт Python.

Подробнее см. В следующих рекомендациях и примерах.

  1. Определите класс для ScreenManager и объявите ObjectProperty для ScreenOne и ScreenTwo.
  2. СScreenManager, замените app.root ... на root.manager ... в файле kv.
  3. Реализуйте два метода из класса PhoneGridLayout в классе ScreenOne,и удалите класс PhoneGridLayout
  4. Объявите ObjectProperty для memberStatus в классе ScreenTwo.
  5. Remove st = ScreenTwo(), поскольку не хотите создавать экземпляр другого объекта ScreenTwo, который будет отличаться от того, который уже используетсясоздается в файле kv.
  6. Заменить st.ids.memberStatus.text на self.manager.screen_two.member_status.text

Диспетчер экрана »Основное использование

Создайте оба экрана.Обратите внимание на root.manager.current: так вы можете управлять ScreenManager из kv.Каждый экран имеет по умолчанию менеджер свойств, который дает вам экземпляр используемого ScreenManager.

Руководство по программированию »Язык KV

Хотя самоМетод .ids очень лаконичен, его обычно считают «наилучшей практикой» для использования ObjectProperty.Это создает прямую ссылку, обеспечивает более быстрый доступ и является более явным.

Пример

returnStation.py

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


class ScreenManagement(ScreenManager):
    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)


class ScreenOne(Screen):
    member_status = ObjectProperty(None)

    def backspace(self, textString):
        newTextString = textString[0:-1]
        self.display.text = newTextString

    def getPoints(self, phoneNumber):
        print(phoneNumber)
        self.manager.screen_two.member_status.text = phoneNumber   #THIS IS HOW I ATTEMPTED TO CHANGE THE LABEL


class ScreenTwo(Screen):
    pass


class ReturnStationLayoutApp(App):

    def build(self):
        return ScreenManagement()


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

returntationlayout.kv

#:kivy 1.10.0

<ScreenManagement>:
    screen_one: screen_one
    screen_two: screen_two

    ScreenOne:
        id: screen_one
        name: 'menu'
    ScreenTwo:
        id: screen_two
        name: 'settings'

<CustButton@Button>:
    font_size: 32

<ScreenOne>:
    display: entry
    # PhoneGridLayout
    GridLayout:
        id: numberPad
        rows: 5
        padding: [300,200]
        spacing: 10

        # Where input is displayed
        BoxLayout:
            Label:
                text: "+65"
                font_size: 50
                size_hint: 0.2, 1
            TextInput:
                id: entry
                font_size: 50
                multiline: False
                padding: [20, ( self.height - self.line_height ) / 2]


        BoxLayout:
            spacing: 10
            CustButton:
                text: "1"
                on_press: entry.text += self.text
            CustButton:
                text: "2"
                on_press: entry.text += self.text
            CustButton:
                text: "3"
                on_press: entry.text += self.text
            CustButton:
                text: "DEL"
                on_press: root.backspace(entry.text)

        BoxLayout:
            spacing: 10
            CustButton:
                text: "4"
                on_press: entry.text += self.text
            CustButton:
                text: "5"
                on_press: entry.text += self.text
            CustButton:
                text: "6"
                on_press: entry.text += self.text
            CustButton:
                text: "AC"
                on_press: entry.text = ""

        BoxLayout:
            spacing: 10
            CustButton:
                text: "7"
                on_press: entry.text += self.text
            CustButton:
                text: "8"
                on_press: entry.text += self.text
            CustButton:
                text: "9"
                on_press: entry.text += self.text
            CustButton:
                text: "Enter" #HERE IS THE ENTER BUTTON
                on_press:
                    root.manager.transition.direction = 'left'
                    root.manager.transition.duration = 1
                    root.manager.current = 'settings'
                    root.getPoints(entry.text)

        BoxLayout:
            spacing: 10
            Label:
                text: ""
            CustButton:
                text: "0"
                on_press: entry.text += self.text
            Label:
                text: ""
            Label:
                text: ""

<ScreenTwo>:
    member_status: memberStatus
    BoxLayout:
        Label:
            id: memberStatus
            text: ''  #THIS IS THE LABEL I AM TRYING TO CHANGE
        Button:
            text: 'Back to menu'
            on_press:
                root.manager.transition.direction = "right"
                root.manager.current = 'menu'

Выход

Img01 Img02

0 голосов
/ 22 мая 2018

Самое маленькое исправление, которое вы можете применить, - это переместить метод getPoints в ваш класс ReturnStationLayoutApp и обновить оттуда нужное поле, вот так:

class ReturnStationLayoutApp(App):

    def getPoints(self, phoneNumber):
        self.root.ids.screen_two.ids.memberStatus.text = phoneNumber

Естественно, для этого потребуетсяизменив строку numberPad.getPoints(entry.text) в файле .kv на app.getPoints(entry.text).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...