2015-09-18 8 views
0

Я пытаюсь использовать язык kv для повтора программы, которую я уже сделал. Первое было сделано на питоне. Теперь, когда я использую киви-язык, я ничего не могу получить от своего пользовательского интерфейса. В этом примере. когда текст штрих-кода изменяется, он должен обновить его текстовое свойство, которое должно затем отключить мою функцию. Проблема в том, что он не распознает изменение в поле ввода текста.Текст из TextInput не обновляется

main6.py 

class Barcode(TextInput): 

    l_prompt= ObjectProperty() 
    btext = StringProperty() 

    # capture barcode 
    def onText(self): 
     print ('in onText') 
     c=True 
     while c: 
      print('in loop') 
      time.sleep(1/10) 
      print(self.text) 
      if len(self.text) <=5: 
       c= True 
      else: 
       c = False 
       print('in else') 
       self.l_prompt.change_label('test') 
       Clock.schedule_once(self.parent.run_test,1) 

class MainLayout(FloatLayout): 

    dt = str(datetime.today()) 
    pafa = ''  #pass/fail 
    barcode = '' #barcode number 
    counter = 0 #item counter 

    prompt_wid = ObjectProperty() 
    barcode_wid = ObjectProperty(rebind = True) 
    passfail_wid = ObjectProperty() 
    counterlabel_wid = ObjectProperty() 


    def __init__(self, **kwargs): 
     super(MainLayout, self).__init__(**kwargs) 

     #start test 
     #self.starttest(self) 

     self.l=Label() 
     #self.barcode_wid.bind(text=self.l.setter('text')) 

    def detect(self, d): 
     #detect when device is plugged in 
     t = True 
     while t: 
      time.sleep(1) 
      dev = usb.core.find(idVendor= 0x2996) 

      if dev is None: 


       t=False 

       self.prompt_wid.change_label('scan') #label change 
       #self.barcode_wid.focus=True #brings cursor up for input scan 


       j = threading.Thread(target=self.barcode_wid.onText) 
       j.daemon = True 
       j.start() 

ex6.kv 

#: kivy 1.9 


<MainLayout>: 
    orientation: 'vertical' 
    size: root.size 

    prompt_wid: prompt 
    barcode_wid: barcode 
    passfail_wid: passfail 
    counterlabel_wid: counterlabel 

    canvas.before: 
     Color: 
      rgb: 0, 0, .6 
     Rectangle: 
      pos: self.pos 
      size: self.size 

    Prompt: 
     id: prompt 

     canvas.before: 
      Color: 
       rgb: .6, .6, .6 
      Rectangle: 
       pos: self.pos 
       size: self.size 
    Barcode: 
     id: barcode 
     l_prompt: prompt 
     focus: 'True' 
     text:'hey' 

<Barcode>: 

    pos_hint: {'center_x': .5, 'top': 0.666 } 
    size_hint:(1,.3) 
    font_size: self.height/3 
    text: '' 
    multiline: 'False' 
    padding: 0,(self.height/3) 

presentation = Builder.load_file('ex6.kv') 


class MainApp(App): 
    def build(self): 
     ml = MainLayout() 
     Clock.schedule_interval(ml.detect, 2) 
     return MainLayout() 


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

Я пытаюсь использовать свойства Kivy, но я думаю, что недостающий фундаментальную связь между р и кв файлом, так как ни один из моего Labels (l_prompt) не обновляют, а также. Все работает за сценой нормально, но нет изменения пользовательского интерфейса, кроме как вводить символы в поле ввода текста.

ответ

1

Ни в коем случае ваша программа не вызовет функцию onText. Вы имели в виду назвать его on_text, который будет автоматически вызываться при изменении свойства text?

+0

его называют в способе обнаружения на резьбовой части. – mri3

+0

Да, это никогда не вызывается, потому что метод обнаружения никогда не вызывается. – inclement

+0

Мой плохой, я не понял, что не добавил дно файла py для загрузки kv и MainApp. Я старался сделать как можно меньше кода, чтобы не разваливать экран. Спасибо. – mri3

0

Я нашел, что мне нужно было начать мой тест с помощью метода init моего приложения. Поэтому я прокомментировал код в моей секции сборки и раскомментировал код в моем методе init «self.starttest». Я изменил его, думая, что вызов метода сборки выглядит лучше, но я думаю, что произошло то, что, поскольку он пропустил init, я в основном отключил функциональность от пользовательского интерфейса.

main6.py 

class Barcode(TextInput): 

    l_prompt= ObjectProperty() 
    btext = StringProperty() 

    # capture barcode 
    def onText(self): 
     print ('in onText') 
     c=True 
     while c: 
      print('in loop') 
      time.sleep(1/10) 
      print(self.text) 
      if len(self.text) <=5: 
       c= True 
      else: 
       c = False 
       print('in else') 
       self.l_prompt.change_label('test') 
       Clock.schedule_once(self.parent.run_test,1) 

class MainLayout(FloatLayout): 

    dt = str(datetime.today()) 
    pafa = ''  #pass/fail 
    barcode = '' #barcode number 
    counter = 0 #item counter 

    prompt_wid = ObjectProperty() 
    barcode_wid = ObjectProperty(rebind = True) 
    passfail_wid = ObjectProperty() 
    counterlabel_wid = ObjectProperty() 


    def __init__(self, **kwargs): 
     super(MainLayout, self).__init__(**kwargs) 

     #start test 
     self.starttest(self) 

     self.l=Label() 
     #self.barcode_wid.bind(text=self.l.setter('text')) 

    def detect(self, d): 
     #detect when device is plugged in 
     t = True 
     while t: 
      time.sleep(1) 
      dev = usb.core.find(idVendor= 0x2996) 

      if dev is None: 


       t=False 

       self.prompt_wid.change_label('scan') #label change 
       #self.barcode_wid.focus=True #brings cursor up for input scan 


       j = threading.Thread(target=self.barcode_wid.onText) 
       j.daemon = True 
       j.start() 

ex6.kv 

#: kivy 1.9 


<MainLayout>: 
    orientation: 'vertical' 
    size: root.size 

    prompt_wid: prompt 
    barcode_wid: barcode 
    passfail_wid: passfail 
    counterlabel_wid: counterlabel 

    canvas.before: 
     Color: 
      rgb: 0, 0, .6 
     Rectangle: 
      pos: self.pos 
      size: self.size 

    Prompt: 
     id: prompt 

     canvas.before: 
      Color: 
       rgb: .6, .6, .6 
      Rectangle: 
       pos: self.pos 
       size: self.size 
    Barcode: 
     id: barcode 
     l_prompt: prompt 
     focus: 'True' 
     text:'hey' 

<Barcode>: 

    pos_hint: {'center_x': .5, 'top': 0.666 } 
    size_hint:(1,.3) 
    font_size: self.height/3 
    text: '' 
    multiline: 'False' 
    padding: 0,(self.height/3) 

presentation = Builder.load_file('ex6.kv') 


class MainApp(App): 
    def build(self): 
     #ml = MainLayout() 
     #Clock.schedule_interval(ml.detect, 2) 
     return MainLayout() 


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

)

Смежные вопросы