2015-02-20 3 views
1

Я построил графический интерфейс Kivy с использованием класса «App», который предназначен для загрузки файла с помощью выбора файла и внесения его в список. Теперь я понял, что весь фрагмент кода нужно преобразовать в виджет, чтобы он мог быть интегрирован в существующий графический интерфейс. Я не уверен, как обойти «мой код». Любая помощь будет оценена по достоинству.Kivy: превращение приложения в виджет

Ниже мой main.py файл:

from kivy.app import App 
 
from kivy.uix.accordion import Accordion, AccordionItem 
 
from kivy.uix.tabbedpanel import TabbedPanel 
 
from kivy.uix.boxlayout import BoxLayout 
 
from kivy.uix.floatlayout import FloatLayout 
 
from kivy.uix.gridlayout import GridLayout 
 
from kivy.lang import Builder 
 
from kivy.factory import Factory 
 

 
from kivy.uix.popup import Popup 
 
from kivy.uix.button import Button 
 
import os 
 
from kivy.uix.widget import Widget 
 
from kivy.uix.scrollview import ScrollView 
 
from kivy.graphics import * 
 
from kivy.properties import ObjectProperty 
 

 
class OptionMenu(GridLayout): 
 

 
    loadfile = ObjectProperty(None) 
 
    savefile = ObjectProperty(None) 
 
    text_input = ObjectProperty(None) 
 
    def dismiss_popup(self): 
 
     self._popup.dismiss() 
 

 
    def show_load(self): 
 
     content = LoadDialog(load=self.load, cancel=self.dismiss_popup) 
 
     self._popup = Popup(title="Load file", content=content, size_hint=(0.9, 0.9)) 
 
     self._popup.open() 
 

 
    def load(self, path, filename): 
 
     with open(os.path.join(path, filename[0])) as stream: 
 
      self.text_input.text = stream.read() 
 
     self.dismiss_popup() 
 

 
    def show_save(self): 
 
     content = SaveDialog(save=self.save, cancel=self.dismiss_popup) 
 
     self._popup = Popup(title="Save file", content=content, 
 
          size_hint=(0.9, 0.9)) 
 
     self._popup.open() 
 

 
    def save(self, path, filename): 
 
     with open(os.path.join(path, filename), 'w') as stream: 
 
      stream.write(self.text_input.text) 
 

 
     self.dismiss_popup() 
 
class GraphMenu(GridLayout): 
 
    pass 
 
class UnnamedMenu(GridLayout): 
 
    pass 
 

 
class LoadDialog(FloatLayout): 
 
    load = ObjectProperty(None) 
 
    cancel = ObjectProperty(None) 
 

 
class SaveDialog(FloatLayout): 
 
    save = ObjectProperty(None) 
 
    text_input = ObjectProperty(None) 
 
    cancel = ObjectProperty(None) 
 

 

 

 
class MainController(FloatLayout): 
 
    pass 
 

 

 
class MainApp(App): 
 
    def build(self): 
 
     rt = MainController() 
 
     return rt 
 
Factory.register('Main', cls=MainController) 
 
Factory.register('LoadDialog', cls=LoadDialog) 
 
Factory.register('SaveDialog', cls=SaveDialog) 
 

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

Вот мой main.kv файл:

#kivy 1.0 
 
<OptionMenu> 
 
    cols: 2 
 
\t row:10 
 
    Button: 
 
     size_hint_y: 0.05 
 
     text: "Input File" 
 
     on_release: self.parent.show_load() 
 
\t Button: 
 
\t \t size_hint_y:0.05 
 
\t \t text:"Save File" 
 
\t \t on_release:self.parent.show_save() 
 
    TextInput: 
 
     id: text_input 
 
\t \t text:'' 
 
\t RstDocument: 
 
\t \t text: text_input.text 
 
\t \t show_errors: True 
 

 
<MainController> 
 
    BoxLayout: 
 
     orientation: 'horizontal' 
 
     Accordion: 
 
      size_hint_x: 0.3 
 
      orientation: 'vertical' 
 
      AccordionItem: 
 
       title:'Options' 
 
       OptionMenu: 
 
        id: 'AppOpt' 
 
\t \t \t AccordionItem: 
 
\t \t \t \t title:'Config' 
 
\t \t \t \t UnnamedMenu: 
 
\t \t \t \t \t id:ConfigTab 
 
\t \t \t AccordionItem: 
 
\t \t \t \t title:'Graph' 
 
\t \t \t \t GraphMenu: 
 
\t \t \t \t \t id:GraphTab 
 

 
     FloatLayout: 
 
      size_hint_x: 0.7 
 
      Label: 
 
       
 
<scroller> 
 

 
     
 
<LoadDialog>: 
 
    BoxLayout: 
 
     size: root.size 
 
     pos: root.pos 
 
     orientation: "vertical" 
 
     FileChooserListView: 
 
      id: filechooser 
 

 
     BoxLayout: 
 
      size_hint_y: None 
 
      height: 10 
 
      Button: 
 
       text: "Cancel" 
 
       on_release: root.cancel() 
 

 
      Button: 
 
       text: "Load" 
 
       on_release: root.load(filechooser.path, filechooser.selection) 
 
<SaveDialog>: 
 
    text_input: text_input 
 
    BoxLayout: 
 
     size: root.size 
 
     pos: root.pos 
 
     orientation: "vertical" 
 
     FileChooserListView: 
 
      id: filechooser 
 
      on_selection: text_input.text = self.selection and self.selection[0] or '' 
 

 
     TextInput: 
 
      id: text_input 
 
      size_hint_y: None 
 
      height: 30 
 
      multiline: False 
 

 
     BoxLayout: 
 
      size_hint_y: None 
 
      height: 30 
 
      Button: 
 
       text: "Cancel" 
 
       on_release: root.cancel() 
 

 
      Button: 
 
       text: "Save" 
 
       on_release: root.save(filechooser.path, text_input.text)

ответ

0

Я не понимать квесты on, ваше приложение ничего не делает, и все функциональные возможности находятся в виджете MainController. Какое еще разделение вам нужно?

Factory.register('Main', cls=MainController) 
Factory.register('LoadDialog', cls=LoadDialog) 
Factory.register('SaveDialog', cls=SaveDialog) 

Кроме того, эти заводские линии не нужны, виджеты автоматически регистрируются.

+0

Thanks.Honestly, его неясно в документации, которую видят виджеты – Adit2789

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