Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2020 17:11:30

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Классы

Kasta_neda
Kivy
вы там через screen чели все делаете
так screenmanager там вроде контролера
вот пусть и контралирует че куда и кому

зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Май 25, 2020 17:34:03)

Офлайн

#2 Май 25, 2020 17:46:33

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Классы

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 (Май 25, 2020 17:56:52)

Офлайн

#3 Май 25, 2020 18:01:33

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Классы

AD0DE412
зы вы еще софтклавиатуру (системную а не vkeyboad) не прикручивалали вот где запара (впрочем решаемо)
на девайсе все норм работает

Но в будущем при вызове файлменеджера хочу вызывать системный , хоть и kivymd тоже норм но в системном больше функциональность

Отредактировано Kasta_neda (Май 25, 2020 18:09:15)

Офлайн

#4 Май 25, 2020 18:51:23

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Классы

хз ну такое … а вы не пробывали не пероопределять on_text а обрабатывать его в kv

 on_text: self.func(); print("press")
кроме того виджиты можно биндить (self.ids.виджет.bind(событие=self.func))

зы ткните где у вас проблема (ваш код у себя не проверялся … не запускаля … мне для этого нужно среду приготовливать библиотеки итд)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Май 25, 2020 19:04:15)

Офлайн

#5 Май 25, 2020 19:17:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Классы

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',)
>>> 



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 25, 2020 19:40:04)

Офлайн

#6 Май 25, 2020 19:39:39

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Классы

хм … а не в качестве ошибки а для пользы … для чего такое можно использовать



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#7 Май 25, 2020 19:46:15

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Классы

AD0DE412
а не в качестве ошибки а для пользы … для чего такое можно использовать
в смысле? зачем передавать ссылку на инстанс себя любимого?ну мало ли зачем. Чтобы другой класс чтото мог считать чтото отуудова, дергнуть метод, или изменить каконить атрибут , или еще чего…Например в том же ткинтере так можно передавать инфу из окна в окно, в самом простом случае.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 25, 2020 19:46:58)

Офлайн

#8 Май 25, 2020 19:58:52

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Классы

да … глупое подумолось … хотя нет тут не все так просто надо это обдумать … спсб

 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',))
'''
хз так по моему хоть и многословней но более ясно



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Май 25, 2020 20:38:40)

Офлайн

#9 Май 25, 2020 21:07:32

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Классы

PEHDOM
зачем вы в


Body.out_txt(self, str(rv.data))
передаете self?
Так я и не передаю, я просто в примере его воткнул(забыл убрать), знаю что self тянет ссылку , я понять хочу как правильно делать. в таких ситуациях
В ваших примерах все понятно, спасибо, с этим я разобрался , ниже написал что в итоге мне надо.

Отредактировано Kasta_neda (Май 25, 2020 21:38:30)

Офлайн

#10 Май 25, 2020 21:28:39

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Классы

 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()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version