Как очистить ввод текста по кнопке с другой страницы в Kivy? - PullRequest
0 голосов
/ 04 июня 2019

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

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

Py.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty, BooleanProperty






class MainScreen(Screen):
    pass

class SecondScreen(Screen):
    def clear_inputs(self, text_inputs):
        for text_input in text_inputs:
            text_input.text = ''

class ScreenManagement(ScreenManager):
    def changescreen(self, value):

        try:
            if value !='main':
                self.current = value
        except:
            print('No Screen named'+ value)




class testiApp(App):
    def build(self):
        self.title = 'Hello'



testiApp().run()

KV.


ScreenManagement:
    MainScreen:
        name:'Main'
    SecondScreen:
        name:'Page2'



<MainScreen>:
    name:'Main'
    BoxLayout:
        orientation:'vertical'
        GridLayout:
            cols:2
            Label:
                text:'testfield1'
            TextInput:
                id: textfield1
            Label:
                text:'testfield2'
            TextInput:
                id: textfield2

        Button:
            text:'Next Page'
            on_release: app.root.current ='Page2'




<SecondScreen>:
    name:'Page2'
    Button:
        text:'Clear textfields'
        on_release:


Ответы [ 2 ]

1 голос
/ 04 июня 2019

Следующие усовершенствования (файл kv и скрипт Python) необходимы для очистки текста TextInput на другом экране.

файл кв

  • Чтобы получить доступ к виджетам TextInput, добавьте id: container к созданному объекту, GridLayout:
  • Каждый экран по умолчанию имеет свойство manager, которое дает вам экземпляр используемого ScreenManager.
  • Привязать событие on_release к методу, clear_inputs() без аргументов

Фрагменты - файл kv

<MainScreen>:
    name:'Main'
    BoxLayout:
        orientation:'vertical'
        GridLayout:
            id: container
            ...

        Button:
            text:'Next Page'
            on_release: root.manager.current ='Page2'


<SecondScreen>:
    name:'Page2'
    Button:
        text:'Clear textfields'
        on_release: root.clear_inputs()

Py file

  • Добавить оператор импорта, from kivy.uix.textinput import TextInput
  • Используйте функцию ScreenManager get_screen('Main') для получения экземпляра объекта, MainScreen
  • Используйте цикл for для обхода потомков GridLayout: через ids.container
  • Используйте функцию isinstance() для проверки TextInput виджета

Snippets - Py file

from kivy.uix.textinput import TextInput
...
class SecondScreen(Screen):

    def clear_inputs(self):
        main = self.manager.get_screen('Main')
        for child in reversed(main.ids.container.children):
            if isinstance(child, TextInput):
                child.text = ''
0 голосов
/ 04 июня 2019

Если я правильно понимаю, что вы хотите сделать, это использовать кнопку на странице X (Main?), Чтобы изменить текст на странице Y (Page2?).Я не эксперт по Kivy, так что может быть лучше, но вот несколько мыслей:

1) Я попытался дать атрибут класса parent для всех экранов, который оказалсяплохая идея, потому что имя уже использовалось Kivy.Вы можете просто изменить его на parent_ или еще что-нибудь и попробовать.Вам нужно передать «родителя» в качестве параметра __init__ при создании:

class ScreenManagement(ScreenManager):
    def __init__(self, children_, **kwargs):
        # you might need to save the children too
        self.children_ = children_

    def add_child(self, child):
        # maybe as dict
        self.children_[child.name] = child


class SecondScreen(Screen):
    def __init__(self, parent_, **kwargs):
        super().__init__(**kwargs)
        # maybe the screen manager or the main app?
        self.parent_ = parent_
        self.name_ = "Second"
    ....
    def clear_inputs(self, text_inputs):
        ....

class MainScreen(Screen):
    def __init__(self, parent_, **kwargs):
        super().__init__(**kwargs)
        # maybe the screen manager or the main app?
        self.parent_ = parent_
        # you may want to 
    ....
        # Get the appropriate screen from the parent
        self.parent_.children_["Second"].clear_inputs(...)

2) Я также видел другой путь из учебника YouTube .Вместо непосредственного запуска приложения присвойте его переменной и создайте ссылку на эту переменную.Это может потребовать вмешательства для продвинутых пользователей:

# Use the global variable within your classes/methods
class Whatever:
    def whatever2(self, params):
        app.something() 

....

app = testiApp()
app.run()

...