Kasta_nedaвы там через screen чели все делаете
Kivy
так screenmanager там вроде контролера
вот пусть и контралирует че куда и кому
зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)
Kasta_nedaвы там через screen чели все делаете
Kivy
PEHDOMПримерно так, но на скорую руку
хмм, долно все видеть, можете выложить минимально рабочий код чтиобы посмотреть на проблему
from kivymd.app import MDApp from kivy.uix.textinput import TextInput from kivy.lang import Builder from kivy.uix.boxlayout import BoxLayout from kivy.uix.floatlayout import FloatLayout from kivy.properties import NumericProperty, ListProperty, BooleanProperty, ObjectProperty from kivy.uix.recycleview import RecycleView from kivy.uix.recyclegridlayout import RecycleGridLayout from kivy.uix.recycleview.views import RecycleDataViewBehavior from kivy.uix.label import Label from kivy.uix.recycleboxlayout import RecycleBoxLayout from kivy.uix.behaviors import FocusBehavior from kivy.uix.recycleview.layout import LayoutSelectionBehavior from kivymd.uix.label import MDLabel Builder.load_string(''' <Body>: canvas: Color: rgba:(1, 1, 1, 1) Rectangle: pos: self.pos size: self.size <DropDownWidget>: canvas: Color: rgba:(1, 1, 1, 1) Rectangle: pos: self.pos size: self.size orientation: 'vertical' spacing: 2 txt_input: txt_input rv: rv MyTextInput: id: txt_input size_hint_y: None height: 50 spacing: 10 RV: id: rv <MyTextInput>: readonly: False multiline: False <SelectableLabel>: # Draw a background to indicate selection color: 0,0,0,1 canvas.before: Color: rgba: (0, 0, 1, .5) if self.selected else (1, 1, 1, 1) Rectangle: pos: self.pos size: self.size <RV>: canvas: Color: rgba: 0,0,0,.2 Line: rectangle: self.x +1 , self.y, self.width - 2, self.height -2 bar_width: 10 #scroll_type:['bars'] viewclass: 'SelectableLabel' SelectableRecycleBoxLayout: default_size: None, dp(20) default_size_hint: 1, None size_hint_y: None height: self.minimum_height orientation: 'vertical' multiselect: False ''') class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout): ''' Adds selection and focus behaviour to the view. ''' class SelectableLabel(RecycleDataViewBehavior, Label): ''' Add selection support to the Label ''' index = None selected = BooleanProperty(False) selectable = BooleanProperty(True) def refresh_view_attrs(self, rv, index, data): ''' Catch and handle the view changes ''' self.index = index return super(SelectableLabel, self).refresh_view_attrs( rv, index, data) def on_touch_down(self, touch): ''' Add selection on touch down ''' if super(SelectableLabel, self).on_touch_down(touch): return True if self.collide_point(*touch.pos) and self.selectable: return self.parent.select_with_touch(self.index, touch) def apply_selection(self, rv, index, is_selected): ''' Respond to the selection of items in the view. ''' self.selected = is_selected if is_selected: print("selection changed to {0}".format(rv.data[index])) #self.parent.ids.txt_input.text = rv.data[index] #print(rv.parent, index, is_selected) #print(self.parent.parent.parent) print('ids selectlabel ' ,self.parent.parent.parent.ids.keys()) Body.out_txt(self, str(rv.data[index])) #self.DropDownWidget.ids.txt_input.text = rv.data[index] class RV(RecycleView): def __init__(self, **kwargs): super(RV, self).__init__(**kwargs) effect_cls= "ScrollEffect" #scroll_type= ['bars'] class DropDownWidget(BoxLayout): txt_input = ObjectProperty() rv = ObjectProperty() class MyTextInput(TextInput): txt_input = ObjectProperty() flt_list = ObjectProperty() word_list = ListProperty() #this is the variable storing the number to which the look-up will start starting_no = NumericProperty(3) suggestion_text = '' def __init__(self, **kwargs): super(MyTextInput, self).__init__(**kwargs) def on_text(self, instance, value): #find all the occurrence of the word #import sklad #skl = sklad.skl self.parent.ids.rv.data = [] #matches = [self.word_list[i] for i in range(len(self.word_list)) if self.word_list[i][:self.starting_no] == value[:self.starting_no]] #display the data in the recycleview display_data = [] D = {} patern = value patern = patern.upper() skl = [{"article":"06000000617","name":"Загрузочный кабель "},{"article":"03000004733","name":"ASUS J1900I-C"}] for i in skl: if (patern in i['article'].upper() or patern in i['name'].upper()): #display_data.append({'text':i}) display_data.append({'text':i['article'] + ' ' + i['name'] }) self.parent.ids.rv.data = display_data #ensure the size is okay if len(display_data) <= 10: self.parent.height = (50 + (len(display_data)*20)) else: self.parent.height = 240 def keyboard_on_key_down(self, window, keycode, text, modifiers): if self.suggestion_text and keycode[1] == 'tab': self.insert_text(self.suggestion_text + ' ') return True return super(MyTextInput, self).keyboard_on_key_down(window, keycode, text, modifiers) class Body(FloatLayout): def __init__(self, **kwargs): super(Body, self).__init__(**kwargs) self.widget_1 = DropDownWidget(pos_hint = {'center_x':.5,'center_y':.5}, \ size_hint = (None, None), size = (600, 60)) #widget_1.ids.txt_input.starting_no = 1 self.label_zip = MDLabel(text = 'ok', size_hint= (None, None), pos_hint= {'center_x': .5, 'center_y': .2} ) self.add_widget(self.label_zip) self.add_widget(self.widget_1) print('ids body1 ', self.ids) @classmethod def out_txt(self, dat, *args): print(self, dat) #print(self.label_zip) try: print(self.label_zip) self.label_zip.text = dat except Exception as e: print(e) class MyApp(MDApp): def build(self): return Body() if __name__ == "__main__": MyApp().run()
AD0DE412на девайсе все норм работает
зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)
on_text: self.func(); print("press")
Body.out_txt(self, str(rv.data[index]))
class A: def work(self): B.out_text(self, 'blah-blah') class B: @classmethod def out_text(cls, data, *args): print(cls, data, args) a= A() a.work() >>> <class '__main__.B'> <__main__.A object at 0x02DC9890> ('blah-blah',) >>>
AD0DE412в смысле? зачем передавать ссылку на инстанс себя любимого?ну мало ли зачем. Чтобы другой класс чтото мог считать чтото отуудова, дергнуть метод, или изменить каконить атрибут , или еще чего…Например в том же ткинтере так можно передавать инфу из окна в окно, в самом простом случае.
а не в качестве ошибки а для пользы … для чего такое можно использовать
class A: def work(self): B.out_text(self, 'blah-blah') class B: @classmethod def out_text(cls, data, *args): print(cls, data, args) a= A() a.work() class Am: def __init__(self): self.b = False def work(self): if self.b: self.b(self, 'blah-blah') class Bm: @classmethod def out_text(cls, data, *args): print(cls, data, args) a= Am() a.b = Bm.out_text a.work() ''' (<class __main__.B at 0x02B33A08>, <__main__.A instance at 0x02B34058>, ('blah-blah',)) (<class __main__.Bm at 0x02B33A78>, <__main__.Am instance at 0x02B34080>, ('blah-blah',)) '''
PEHDOMТак я и не передаю, я просто в примере его воткнул(забыл убрать), знаю что self тянет ссылку , я понять хочу как правильно делать. в таких ситуациях
зачем вы в
Body.out_txt(self, str(rv.data))
передаете self?
class A: def work(self): B.out_text(self, 'blah-blah') class B: def __init__(self): self.x = '1' @classmethod def out_text(cls, data, *args): print(cls, data, args) print(cls.x)# как мне обратиться к self.x ? a= A() a.work()