2016-08-06 2 views
1

Я написал некоторую программу с python kivy lib, но она не работает.как запустить программу kivy?

import kivy 
from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 
from kivy.graphics import Color 

class Controller(BoxLayout): 

    def welcome(self): 
     wid = BoxLayout(orientation='vertical') 
     wid.add_widget(Label(text='hellow',size_hint=(1,.1))) 
     wid.add_widget(Button(text='welcom',size_hint=(1,.1))) 
     wid.add_widget(Button(text='khoroj',size_hint=(1,.1))) 
     wid.add_widget(Button(text='rahnama',size_hint=(1,.1))) 

class UiApp(App): 
    def build(self): 
     root = Controller() 
     return root 
if __name__ == '__main__': 
     UiApp().run() 

Когда я запускаю программу, отображается только черное окно, без виджетов. В чем проблема?

+0

пут «self.add_widget (WID)», как последняя строка приветствия (и убедитесь, что приветствуют получить звонок от somwere ...) – cox

+0

@cox по сути мой ответ – EL3PHANTEN

+0

@ EL3PHANTEN Да, только вам лучше объяснить. Я видел это слишком поздно – cox

ответ

1

Здесь есть две проблемы.

В этом ответе я покажу два примера. Первый без вложенных BoxLayout, а второй с вложенными BoxLayout.
В обоих примерах я буду использовать __init__ вместо welcome()
Вы также можете использовать welcome(). Прочтите ниже, как это сделать.

Затем к двум проблемам:

Первое:

Вы никогда не запускать метод welcome() в вашем Controller классе.
Вы можете исправить это, выполнив его в приложении build, прежде чем вы вернетесь root. Как это:

root.welcome() 
return root 

Или вы могли бы поставить его в методе __init__ в классе. Я покажу пример этого, после того, как я объясню, что вторая проблема здесь.

Вторая проблема заключается в том, что вы создаете новый BoxLayout в свой класс, который allready наследует BoxLayout. Но вы никогда не добавляете этот новый BoxLayout в ваш виджет, который в этом случае allready является BoxLayout.

Итак, как исправить это.
Поскольку класс allready наследует BoxLayout, вам не нужно создавать новое в этом простом приложении. Только если вам нужно вложить BoxLayout, вы это сделаете.

Допустим, вам не нужно гнездиться еще BoxLayout.
Пример того, как вы сделаете это, и использовать __init__ метод:

import kivy 
from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 


class Controller(BoxLayout): 

    def __init__(self,**kwargs): 
     super(Controller,self).__init__(**kwargs) 
     # this is what you need to overite the BoxLayout's __init__ method 

     # self.orientation and self.add_widget because self is the BoxLayout you inherited 
     self.orientation='vertical' 
     self.add_widget(Label(text='hellow',size_hint=(1,.1))) 
     self.add_widget(Button(text='welcom',size_hint=(1,.1))) 
     self.add_widget(Button(text='khoroj',size_hint=(1,.1))) 
     self.add_widget(Button(text='rahnama',size_hint=(1,.1))) 


class UiApp(App): 
    def build(self): 
     root = Controller() 
     return root 


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

Допустим, вам нужно гнездо другой BoxLayout.
Вы бы так:

import kivy 
from kivy.app import App 
from kivy.uix.button import Button 
from kivy.uix.label import Label 
from kivy.uix.boxlayout import BoxLayout 


class Controller(BoxLayout): 

    def __init__(self,**kwargs): 
     super(Controller,self).__init__(**kwargs) 
     # this is what you need to overite the BoxLayout's __init__ method 
     # I make this BoxLayout horizontal, and add a Button, just to show the idea of nesting 
     self.orientation='horizontal' 

     self.add_widget(Button(text='First Button')) 


     self.nested_boxlayout = BoxLayout(orientation="vertical") 

     # then we add stuff to the nested layout 

     self.nested_boxlayout.add_widget(Label(text='hellow',size_hint=(1,.1))) 
     self.nested_boxlayout.add_widget(Button(text='welcom',size_hint=(1,.1))) 
     self.nested_boxlayout.add_widget(Button(text='khoroj',size_hint=(1,.1))) 
     self.nested_boxlayout.add_widget(Button(text='rahnama',size_hint=(1,.1))) 

     # but we still need to add the nested layout to the root layout. (nest it) 

     self.add_widget(self.nested_boxlayout) 


class UiApp(App): 
    def build(self): 
     root = Controller() 
     return root 


if __name__ == '__main__': 
     UiApp().run() 
+0

спасибо за ответ после редактирования __init__ work: D – motad333

+0

@ motad333 без проблем – EL3PHANTEN

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