Как получить экземпляр из RecycleView с кнопкой Viewclass как? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть приложение клавиатуры, которое загружает 9 кнопок из RecycleView с Viewclass, установленным как Button в RecycleGridLayout.Основная проблема заключается в том, что я не могу получить экземпляр кнопок, когда кнопки добавляются как Viewclass.Но я могу получить экземпляр кнопки, если я добавлю кнопки как виджеты к обычному GridLayout.

. Это код RecycleView, из которого я не могу получить экземпляр кнопки:

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.properties import ObjectProperty

Builder.load_string('''
<myKeyPad>:
    show_input: show_input
    TextInput:
        id: show_input
        hint_text: 'Type number'
        pos_hint: {'x': 0.05,'top': 0.98}
        size_hint: [0.9,0.1]
        font_size: self.height / 1.7
    RecycleView:
        id: view_keypad
        viewclass: 'Button'
        pos_hint: {'x': 0.35,'top': 0.86}
        size_hint: [1,1]
        RecycleGridLayout:
            cols: 3
            defualt_size: [None, 20]
            defualt_size_hint: [1, 0.2]

''')
class myKeyPad(FloatLayout):
    show_input = ObjectProperty(None)
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        btn = ['7','8','9','4','5','6','1','2','3','*','0','#']
        key_padbtns=[]
        for b in btn:
            if b=='#':
                key_padbtns.append({'text':b, 'on_press':self.process_output})
            else:
                key_padbtns.append({'text':b, 'on_press':self.get_input})
        self.ids.view_keypad.data = key_padbtns
    def get_input(self,instance):
        the_input = (instance.text)
        i_no = self.show_input
        i_no.text = i_no.text + the_input
    def process_output(self):
        the_output = self.show_input.text
        self.show_input.text = ''
        print(the_output)
class theKeyPadApp(App):
    title='Keypad Input'
    def build(self):
        return myKeyPad()

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

Из этого кода я могу получить экземпляр:

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.properties import ObjectProperty

Builder.load_string('''
<myKeyPad>:
    show_input: show_input
    TextInput:
        id: show_input
        hint_text: 'Type number'
        pos_hint: {'x': 0.05,'top': 0.98}
        size_hint: [0.9,0.1]
        font_size: self.height / 1.7
    GridLayout:
        cols: 3
        id: view_keypad
        pos_hint: {'x': 0.05,'top': 0.86}
        size_hint: [0.9,0.5]

''')
class myKeyPad(FloatLayout):
    show_input = ObjectProperty(None)
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        btn = ['7','8','9','4','5','6','1','2','3','*','0','#']
        print(btn)
        key_padbtns=[]
        for b in btn:
            if b=='#':
                key_padbtns.append(Button(text=b, on_press=self.process_output))
            else:
                key_padbtns.append(Button(text=b, on_press=self.get_input))

        for k in key_padbtns:
            self.ids.view_keypad.add_widget(k)
    def get_input(self,instance):
        print(instance)
        the_input = (instance.text)
        i_no = self.show_input
        i_no.text = i_no.text + the_input
    def process_output(self):
        the_output = self.show_input.text
        self.show_input.text = ''
        print(the_output)
class theKeyPadApp(App):
    title='Keypad Input'
    def build(self):
        return myKeyPad()

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

Как получить свойства объектов кнопки, например kivy.uix.button.Button object, из RecycleView, где Viewclass - «Button»?

1 Ответ

1 голос
/ 21 мая 2019

Проблема

Не удается получить экземпляр кнопок при добавлении кнопок в качестве класса просмотра.

Решение

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

файл kv

В файле kv добавьте следующее on_press событие для Button класса.

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

<Button>:
    on_press:
        if self.text == '#': app.root.process_output()
        else: app.root.get_input(self)

Py file

В скрипте Python внесите следующие изменения:

Snippets - Py file

def __init__(self, **kwargs):
    super().__init__(**kwargs)
    btn = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '*', '0', '#']
    key_padbtns = []
    for b in btn:
        key_padbtns.append({'text': b})
    self.ids.view_keypad.data = key_padbtns
...