Найти - Пользователи
Полная версия: Классы
Начало » Python для новичков » Классы
1 2 3 4
AD0DE412
Kasta_neda
Kivy
вы там через screen чели все делаете
так screenmanager там вроде контролера
вот пусть и контралирует че куда и кому

зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)
Kasta_neda
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()
Kasta_neda
AD0DE412
зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)
на девайсе все норм работает

Но в будущем при вызове файлменеджера хочу вызывать системный , хоть и kivymd тоже норм но в системном больше функциональность
AD0DE412
хз ну такое … а вы не пробывали не пероопределять on_text а обрабатывать его в kv
 on_text: self.func(); print("press")
кроме того виджиты можно биндить (self.ids.виджет.bind(событие=self.func))

зы ткните где у вас проблема (ваш код у себя не проверялся … не запускаля … мне для этого нужно среду приготовливать библиотеки итд)
PEHDOM
Kasta_neda хмм… черт, вы вроде не новичек в пайтоне, судя по дате вашей регистрации, но млиин
зачем вы в

 Body.out_txt(self, str(rv.data[index]))
передаете self?
вы понимаете что в def out_txt(self, dat, *args):
ваш переданый self -инстанс SelectableLabel , попадет в переменную dat, а str(rv.data<index>) в *args?
и ваш print(self, dat) выведет: класс Body и инстанс SelectableLabel, но не str(rv.data<index>) котороые у вас в *args.
простой пример:
 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
хм … а не в качестве ошибки а для пользы … для чего такое можно использовать
PEHDOM
AD0DE412
а не в качестве ошибки а для пользы … для чего такое можно использовать
в смысле? зачем передавать ссылку на инстанс себя любимого?ну мало ли зачем. Чтобы другой класс чтото мог считать чтото отуудова, дергнуть метод, или изменить каконить атрибут , или еще чего…Например в том же ткинтере так можно передавать инфу из окна в окно, в самом простом случае.
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',))
'''
хз так по моему хоть и многословней но более ясно

Kasta_neda
PEHDOM
зачем вы в


Body.out_txt(self, str(rv.data))
передаете self?
Так я и не передаю, я просто в примере его воткнул(забыл убрать), знаю что self тянет ссылку , я понять хочу как правильно делать. в таких ситуациях
В ваших примерах все понятно, спасибо, с этим я разобрался , ниже написал что в итоге мне надо.
Kasta_neda
 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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB