Как изменить текст на разных ярлыках из одного поля TextInput? - PullRequest
0 голосов
/ 06 июля 2019

В моей программе у меня есть кнопка, которая добавляет новый блок.Когда вы нажимаете кнопку в этом новом окне, оно добавляет новое поле и так далее.В каждом поле у ​​меня есть метка, и я хочу иметь возможность изменить этот текст из того же поля ввода текста.Но я не хочу, чтобы один и тот же текст в каждом блоке, поэтому я хочу выбрать блок, написать текст, а затем нажать кнопку, чтобы текст передавался из поля ввода в этот конкретный блок / метку.Я удалил все остальное из своего приложения, поэтому я покажу вам полный код, чтобы вы могли попробовать программу, чтобы понять, что я имею в виду.

Я пытался использовать кнопку на главном виджете, но потом я не знаю, как выбрать, какое поле следует обновить.Я также пытался использовать кнопку в поле (называемую в коде буквой «R»), но тогда я получаю только ошибку.

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

"AttributeError: 'super' object has no attribute '__getattr__'"

Я был бы очень признателен за помощь!Большое спасибо.

Это файл python:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout


class Home(FloatLayout):

    def first(self, *args):
        a = box()
        self.ids.frame.add_widget(a)
        b = a.ids.btn3
        b.bind(on_press=self.second)
        c = a.ids.btn1
        c.bind(on_press=self.textedit)

    def second(self, *args):
        d = box()
        e = d.ids.mains
        e.pos_hint={"right": .5, "top": .7}
        self.ids.frame.add_widget(d)
        f = d.ids.btn3
        f.bind(on_press=self.third)
        g = d.ids.btn1
        g.bind(on_press=self.textedit)

    def third(self, *args):
        h = box()
        i = h.ids.mains
        i.pos_hint = {"right": .3, "top": .9}
        self.ids.frame.add_widget(h)
        j = h.ids.btn1
        j.bind(on_press=self.textedit)

    def textedit(self, *args):
        print("Hello")
       #k = self.ids.tinput.text
       #l = self.ids.lab
       #l.text = k

    def textedit2(self, *args):
        print("hei")
       #This is the submitbutton on the main widget

class HiApp(App):
    def build(self):
        return Home()

class box(FloatLayout):
    pass

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

Это файл .kv

<Home>:
    FloatLayout:
        id: frame
        size_hint_y: 1
        pos_hint:{"right":1,"top":1}
        canvas.before:
            Color:
                rgba: (1, 1, 1, 1)
            Rectangle:
                size: self.size
                pos: self.pos

    BoxLayout:
        id: boks
        orientation: "vertical"
        size_hint_x: .20
        size_hint_y: .15
        pos_hint:{"right":1,"top":1}
        canvas.before:
            Color:
                rgba: (0, 1, 0, 1)
            Rectangle:
                size: self.size
                pos: self.pos
        TextInput:
            id: tinput
            hint_text: "Frome here"

        Button:
            id: t_sub
            text: "Submit"
            on_press: root.textedit2()

    Button:
        id: start
        text: "Start"
        font_size: 20
        color: 0, 0, 0, 1
        background_normal: ''
        background_color: .88, .88, .88, 1
        size_hint: .1, .1
        pos_hint:{"right":.5,"top":.35}
        on_press: root.first()

<box>:

    BoxLayout:
        id: mains
        orientation: "vertical"
        size_hint_x: .18
        size_hint_y: .13
        pos_hint:{"right":.3,"top":.5}
        canvas.before:
            Color:
                rgba: (.20, .05, .0, 1)
            Rectangle:
                size: self.size
                pos: self.pos

        BoxLayout:
            id: c1
            size_hint_y: .25
            pos_hint:{"left":.1,"top":.5}

            GridLayout:
                rows: 1
                cols: 3
                padding: 4
                spacing: 4

                Button:
                    id: btn1
                    text: "R"
                    font_size: 30
                    color: 0, 0, 0, 1
                    background_normal: ''
                    background_color: .88, .88, .88, 1
                    size_hint: .3, .3
                    pos_hint:{"left":.5,"top":.5}
                    on_press:

                Button:
                    id: btn2
                    text: "-"
                    font_size: 30
                    color: 1, 0, 0, 1
                    background_normal: ''
                    background_color: .88, .88, .88, 1
                    size_hint: .3, .3
                    pos_hint:{"left":.5,"top":.5}
                    on_press:

                Button:
                    id: btn3
                    text: "+"
                    font_size: 30
                    color: 0, 1, 0, 1
                    background_normal: ''
                    background_color: .88, .88, .88, 1
                    size_hint: .3, .3
                    pos_hint:{"left":.5,"top":.5}
                    on_press:

        GridLayout:
            rows: 1
            cols: 2
            padding: 4
            spacing: 4

            Label:
                id: lab
                text: "Text here"

            TextInput:
                hint_text: "0"

1 Ответ

0 голосов
/ 06 июля 2019

Задача

Я хочу написать текст в поле ввода с помощью id: tinput (верхний левый угол), а затем нажмите кнопку (R), чтобы текст идет от поля ввода к метке.

Решение

Решением является использование следующих ключевых слов в файле kv:

  1. app - всегда относится к экземпляру вашего приложения
  2. root - ссылается на базовый виджет / шаблон в текущем правиле

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

            Button:
                id: btn1
                text: "R"
                font_size: 30
                color: 0, 0, 0, 1
                background_normal: ''
                background_color: .88, .88, .88, 1
                size_hint: .3, .3
                pos_hint:{"left":.5,"top":.5}
                on_press:
                    lab.text = app.root.ids.tinput.text

выход

Entered text Box's Label's text changed

...