2016-03-17 4 views
0

Я делаю приложение с kivy, и у меня есть проблема с сохранением информации о вводе текстов. Как вы можете видеть в коде, программа имеет 2 экрана: первый - это выбор полей, которые будут отображаться на втором экране, а во втором - один вход для каждого поля, выбранного на главном экране. Проблема в том, что я хочу распечатать входы, когда на втором экране нажата кнопка Run, и я не знаю, как это сделать. Мне сказали, что, возможно, с ListProperty я мог бы сэкономить все входы, но я много раз пробовал и не работал.Как сохранить textinput в kivy python?

# -*- coding: utf-8 -*- 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.textinput import TextInput 
from kivy.uix.label import Label 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.properties import DictProperty 

Builder.load_string(''' 
<Root>: 
    MainScreen: 
     name: 'main' 
    AnotherScreen: 
     name: 'another' 

<MainScreen>: 
    GridLayout: 
     cols: 2 
     Label: 
      text: "Select Subjects" 
      font_size: 15 
     Label: 
      text: " " 
     CheckBox: 
      on_active:root.ping('240031',self.active) 
     Label: 
      text: "Electromagnetisme" 
     CheckBox: 
      on_active:root.ping('240033',self.active) 
     Label: 
      text: "Materials" 
     CheckBox: 
      on_active:root.ping('240052',self.active) 
     Label: 
      text: "Termodinàmica" 
     CheckBox: 
      on_active:root.ping('240053',self.active) 
     Label: 
      text: "Electrotècnia" 
     CheckBox: 
      on_active:root.ping('240054',self.active) 
     Label: 
      text: "Mecànica dels Medis Continus" 
     CheckBox: 
      on_active:root.ping('240061',self.active) 
     Label: 
      text: "Mecànica de Fluids" 
     CheckBox: 
      on_active:root.ping('240063',self.active) 
     Label: 
      text: "Resistència de Materials" 
     CheckBox: 
      on_active:root.ping('240072',self.active) 
     Label: 
      text: "Electrònica" 
     CheckBox: 
      on_active:root.ping('240073',self.active) 
     Label: 
      text: "Sistemes de Fabricació" 
     CheckBox: 
      on_active:root.ping('240151',self.active) 
     Label: 
      text: "Tecnologia i Selecció de Materials" 
     CheckBox: 
      on_active:root.ping('240161',self.active) 
     Label: 
      text: "Màquines Elèctriques" 
     CheckBox: 
      on_active:root.ping('240171',self.active) 
     Label: 
      text: "Termotècnia" 
     CheckBox: 
      on_active:root.ping('240172',self.active) 
     Label: 
      text: "Control Automàtic" 

     Button: 
      text: "Exit" 
      background_color: .7, 1, 6, 1 
      on_release:root.parent.current='another' 
     Button: 
      text: "Run" 
      font_size: 
      background_color: .7, .7, 1, 1 
      on_release: root.parent.current='another' 

<AnotherScreen>: 
    GridLayout: 
     id: container 
     cols: 2 

''') 


class MainScreen(Screen): 
    def __init__(self, **kw): 
     super(MainScreen, self).__init__(**kw) 
     self.a = App.get_running_app() 
    def ping(self, n, value): 
     self.a.big_dict[n] = value 

class AnotherScreen(Screen): 
    def on_pre_enter(self, *args): 
     a = App.get_running_app() 
     t=[] 
     self.ids.container.add_widget(Label(markup=True,text="[b]Name[/b]",background_color=[0,1,1,1])) 
     self.ids.container.add_widget(Label(markup=True,background_color=[0,1,1,1],text="[b]Insert Data[/b]")) 
     def add(self,p): 
      t.append(p) 
     for k,v in a.big_dict.iteritems(): 
      if v: 
       e=k 
       self.ids.container.add_widget(Label(text=k)) 
       self.k=TextInput(id=k,multiline=False) 
       self.k.bind(text=add) 
       self.ids.container.add_widget(self.k) 

     def run(self): 
      print t 
     b1=Button(text='Exit',background_color=[0,1,0,1]) 
     self.ids.container.add_widget(b1) 
     b2=Button(text='Run',background_color=[0,1,0,1]) 
     self.ids.container.add_widget(b2) 
     b1.bind(on_release=exit) 
     b2.bind(on_release=run) 



class Root(ScreenManager): 
    pass 
class SimpleKivy(App): 
    big_dict = DictProperty({'240161': False, '240061': False, '240171': False, '240151': False, '240063': False, '240073': False, '240072': False, '240031': False, '240033': False, '240054': False, '240053': False, '240052': False, '240172': False}) 
    def build(self): 
     return Root() 
SimpleKivy().run() 

Если кто-нибудь знает, как сохранить информацию, которая вставляется в textinput коробки, пожалуйста, комментарий, потому что я уже пробовал много вещей, и я не нахожу ошибку.

ответ

0

Вам не нужно действовать на изменения текста, только тогда, когда нажата кнопка «Запустить». Итак, храните TextEdits в собственности:

class AnotherScreen(Screen): 
    tes = ListProperty() 

... 

     for k,v in a.big_dict.iteritems(): 
      if v: 
       self.ids.container.add_widget(Label(text=k)) 
       te = TextInput(id=k,multiline=False) 
       self.tes.append(te) 
       self.ids.container.add_widget(te) 
... 
     b2.bind(on_release=self.run) 

.... 
    def run(self, instance): 
     print [t.text for t in self.tes] 
0

Проблема в том, что вы добавляете к списку каждый раз, когда меняются text. Если вы используете dict вместо этого вы получите желаемый результат:

t={} 
    self.ids.container.add_widget(Label(markup=True,text="[b]Name[/b]",background_color=[0,1,1,1])) 
    self.ids.container.add_widget(Label(markup=True,background_color=[0,1,1,1],text="[b]Insert Data[/b]")) 
    def add(self,p): 
     t[self.id] = p 

Что будет печатать что-то вроде следующего:

{'240031': u'aa', '240033': u'bb', '240052': u'cc'} 

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

  • Нет связанных вопросов^_^