2016-07-24 3 views
1

У меня есть простое приложение, которое запрашивает ваше имя и возраст в поле TextInput. При нажатии кнопки сохранения открывается Popup, и вы можете сохранить имя и возраст от TextInput в файле.Kivy get TextInput from Popup

Вопрос: Как я могу получить доступ к названию и возрасту, когда Popup уже открыт? Прямо сейчас я храню данные TextInput в словаре, прежде чем открыть Popup. Этого решение делает работу, но, безусловно, есть более элегантное решение, чем это:

class SaveDialog(Popup): 
    def redirect(self, path, filename): 
     RootWidget().saveJson(path, filename) 
    def cancel(self): 
     self.dismiss() 

class RootWidget(Widget): 
    data = {} 

    def show_save(self): 
     self.data['name'] = self.ids.text_name.text 
     self.data['age'] = self.ids.text_age.text 
     SaveDialog().open() 

    def saveFile(self, path, filename): 
     with open(path + '/' + filename, 'w') as f: 
      json.dump(self.data, f) 
     SaveDialog().cancel() 

ответ

2

Yoy может передать свой объект в всплывающем объект. Таким образом, вы можете использовать все атрибуты виджетов для всплывающего объекта. Пример этого может выглядеть так.

from kivy.uix.popup import Popup 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.textinput import TextInput 
from kivy.app import App 


class MyWidget(BoxLayout): 

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

     self.orientation = "vertical" 

     self.name_input = TextInput(text='name') 

     self.add_widget(self.name_input) 

     self.save_button = Button(text="Save") 
     self.save_button.bind(on_press=self.save) 

     self.save_popup = SaveDialog(self) # initiation of the popup, and self gets passed 

     self.add_widget(self.save_button) 


    def save(self,*args): 
     self.save_popup.open() 


class SaveDialog(Popup): 

    def __init__(self,my_widget,**kwargs): # my_widget is now the object where popup was called from. 
     super(SaveDialog,self).__init__(**kwargs) 

     self.my_widget = my_widget 

     self.content = BoxLayout(orientation="horizontal") 

     self.save_button = Button(text='Save') 
     self.save_button.bind(on_press=self.save) 

     self.cancel_button = Button(text='Cancel') 
     self.cancel_button.bind(on_press=self.cancel) 

     self.content.add_widget(self.save_button) 
     self.content.add_widget(self.cancel_button) 

    def save(self,*args): 
     print "save %s" % self.my_widget.name_input.text # and you can access all of its attributes 
     #do some save stuff 
     self.dismiss() 

    def cancel(self,*args): 
     print "cancel" 
     self.dismiss() 


class MyApp(App): 

    def build(self): 
     return MyWidget() 

MyApp().run() 
+1

Есть ли способ сделать это назад, получить данные из всплывающего окна и получить доступ к нему в главном приложении? – user2067030

+0

@ user2067030 Да в главном классе виджетов 'self.save_popup' является всплывающим объектом. Таким образом, вы можете получить доступ к своим данным, вызвав его атрибуты 'self.save_popup.whatever_data_you_save_in_there' – EL3PHANTEN

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