Передать аргумент другому свойству - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть два экрана. На коробке у меня есть кнопка с именем. Когда я нажимаю кнопку, я хочу переключить экран на ChangeText, чтобы увидеть имя там. Как только я нажимаю кнопку, текст Box.name должен быть TextInput-text. Я не могу найти решение.

киловольт-файл

<ChangeText>:
    BoxLayout:
        TextInput:
            id: txt
            multiline: False
            text: Box.name
        Button:
            text: "Save"
            on_release: Box.name = txt.text

<Box>:
    BoxLayout:
        Button:
            text: root.name
            on_press: root.change_text(root.name)

пй-файл

class ChangeText(Screen):
    pass

class Box(Screen):
    name = StringProperty("sometext")

    def change_text(label):
        sm.current = 'changetext'
        ### ?!?!? ###

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Проблема - атрибут, имя

При использовании Kivy ScreenManager не объявляйте переменную / атрибут с именем name , поскольку это зарезервированное слово, используемое для именования / идентификации экрана.

ScreenManager »name

name

Имя экрана, который должен быть уникальным в ScreenManager. это это имя, используемое для ScreenManager.current.

name является StringProperty и по умолчанию имеет значение ‘’.

Решение

Решение заключается в следующем:

  1. Переименуйте свойство уровня класса, с name на home_name или что угодно, кроме name
  2. Добавьте id к каждому экрану.
  3. Используйте root.manager.ids для ссылки на виджеты, объявленные на другом экране.
  4. Замените sm.current на self.manager.current, потому что на каждом экране по умолчанию есть менеджер свойств, который дает вам экземпляр используемого ScreenManager.

Пример

main.py

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


class ScreenManagement(ScreenManager):
    pass


class ChangeText(Screen):
    pass


class Box(Screen):
    home_name = StringProperty("sometext")

    def change_text(self):
        self.manager.current = 'changetext'


class TestApp(App):

    def build(self):
        return ScreenManagement()


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

test.kv

#:kivy 1.11.0

<ScreenManagement>:
    Box:
        id: box
        name: 'box'

    ChangeText:
        id: changeText
        name: 'changetext'

<ChangeText>:
    BoxLayout:
        TextInput:
            id: txt
            multiline: False
            text: root.manager.ids.box.home_name
        Button:
            text: "Save"
            on_release: root.manager.ids.box.home_name = txt.text

<Box>:
    BoxLayout:
        Button:
            text: root.home_name
            on_press: root.change_text()

выход

Img01 - Box Screen Img02 - ChangeText Screen

0 голосов
/ 09 сентября 2018

Итак, я нашел обходной путь, который может быть нестабильным, но пока работает. Заняло у меня часы.

Я только что объявил свойство eveyr как глобальную переменную. Затем я написал глобальную функцию экспорта, которая перезаписывает все глобальные переменные. Поэтому, когда я переключаю экран, я выполняю экспорт (реквизит). Теперь все свойства из моего последнего просмотра экспортируются. Мне нужно обновить все свойства каждого экрана. Поэтому каждый экран имеет обновление (). Export () расширяется циклом for для всех экранов, вызывая update ().

home_name = ''

def export(hn):
    home_name = hn
    for screen in sm.screens:
        screen.update()

class Team(BoxLayout):
    home_name = StringProperty()

    def update(self):
        global home_name
        self.home_name = home_name 


class Box(BoxLayout):
    home_name = StringProperty("Home")

    def load_team(self):
        export(self.home_name)
        sm.current = 'team'

    def update(self):
        global home_name
        self.home_name = home_name 
        #further screen specific actions

киловольт

<Team>:
    id: team
    TextInput:
        id: team_name
        text: root.home_name
        multiline: False
    Button:
        text: "Save"
        on_press: root.save(team_name.text)

<Box>:
     Button:
         id: btn_home_name
         text: root.home_name
         on_press: root.load_team()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...