1

私はKivyで初めてモバイルアプリに取り組んでいます。私はいくつかの進歩を遂げました。「メイン」ページを何よりも先に表示したいと考えています。ユーザーがボタンを押すと、ページがもう少し便利なものに変わります。

現時点では、巨大なボタンが表示され、クリックしても何も起こりません...

私はkivyが初めてで、どんな助けも素晴らしいでしょう。

私は自分のコードに何が起こっていると「思う」かをコメントしようとしました。

from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.carousel import Carousel
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.graphics import Color
from kivy.app import App
from kivy.graphics.instructions import CanvasBase

CAROUSEL_OUTPUT = [0,1,2,3,4,5,6,7,8,9]

class MyApp(App):
    def build(self):
        #for starters just show a big button that will call
        #showData when clicked.
        b = Button(text='Click Me!!!')
        self.layout = GridLayout(cols=1,rows=4,spacing=[2,0])
        self.layout.add_widget(b)
        #i pass the layout thinking that i can it
        #not sure what i need to change to make it work
        b.bind(on_press=(lambda e=1:self.showData(self.layout)))        
        return self.layout

    def showData(self,layout):
        self.Money = []
        self.Trip = []
        self.Gals = []
        #set up the local layout
        layout = GridLayout(cols=1,rows=4,spacing=[2,0])
        row1 = BoxLayout(orientation='vertical')
        row2 = BoxLayout(orientation='vertical')
        row3 = BoxLayout(orientation='vertical')
        w = self.makeCarousels(6,4,1)
        l = Label(text='Please enter the total amount paid.')
        row1.add_widget(l)
        row1.add_widget(w)
        layout.add_widget(row1)
        w = self.makeCarousels(7,3,2)
        l = Label(text='Please enter the total amount of gallons of gasoline purchased.')
        row2.add_widget(l)
        row2.add_widget(w)
        layout.add_widget(row2)
        w = self.makeCarousels(5,4,3)
        b = Button(text='Click Me!!!')
        b.bind(on_press=(lambda e=1: self.printCindexes()))
        l = Label(text='Please enter the miles driven on your last tank.(Trip)')
        row3.add_widget(l)
        row3.add_widget(w)
        layout.add_widget(row3)
        layout.add_widget(b)
        self.layout = layout
        return layout

    def makeCarousels(self,numOfCarous,placeHolder,row):
        #this function just makes numOfCarous carousels
        #and puts a '.' at placeHolder
        check = False
        layout = BoxLayout(orientation='horizontal')
        for i in range(0,numOfCarous):
            if i == (placeHolder - 1):
                check = True
                c = Carousel(direction = 'top')
            else:
                c = Carousel(direction = 'top')
            if row == 1:
                self.Money.append(c)
            elif row == 2:
                self.Gals.append(c)
            elif row == 3:
                self.Trip.append(c)
            for num in CAROUSEL_OUTPUT:
                l = Label(text=str(num))
            c.add_widget(l)
        if check:
            l = Label(text='.')
            layout.add_widget(c)
            layout.add_widget(l)
            check = False
        else:           
            layout.add_widget(c)                
        return layout

    def printCindexes(self):
        self.calculateValues(self.Money,4,1)
        self.calculateValues(self.Gals,3,2)
        self.calculateValues(self.Trip,4,3)
        print '\n'

    def calculateValues(self,list,placeHolder,row):
        numOfEntries = len(list)
        total = 0.0
                factor = 1.0
        for n in range(0,placeHolder-1):
            factor=factor*10.0
        for n in list:
            total += factor*n.index
            factor = factor/10.0
        if row == 1:
            print 'Total Paid: $%6.2f' %(total)
        elif row == 2:
            print 'Total Gallons: %7.4f gallons' %(total)
        elif row == 3:
            print 'Total Trip: %5.1f miles' %(total)


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

みんなありがとう!

4

2 に答える 2

2

@inclementにはこれ以上同意できません。Kivy Languageを使用する必要があります。ScreenManagerを使用することをお勧めします。以下に、以前の回答の簡単な例を投稿しています。プロパティを使用して、必要な数の画面を表示し、切り替えることができることに注意してください current

on_press: root.current = 'screen2'

Kivyのプロパティ(またはここでは ) は、単純な属性以上のものです。インターフェイスを最新の状態に保つために使用されるイベントをトリガーします。@inclement が指摘したように、Kivy 言語を使用してイベントをバインドすることもできます。Calcクラスで定義されているメソッドを呼び出すには、次のようにする必要があります。

on_press: root.product(*args)

または、それほど複雑でない場合は、Kivy 言語で実行することもできます。

on_press: _result.text = str(int(_a.text) + int(_b.text))

達成しようとしている同様のコードは次のとおりです。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager

Builder.load_string("""
<Calc@ScreenManager>:
    a: _a
    b: _b
    result: _result
    Screen:
        name: 'screen1'
        Button:
            size_hint: .3,.1
            center: self.parent.center
            text: 'Go to Screen 2'
            on_press: root.current = 'screen2'
    Screen:
        name: 'screen2'
        GridLayout:
            cols: 2
            Label:
                text: 'Value 1'
            TextInput:
                id: _a
                text: '3'
            Label:
                text: 'Value 2'
            TextInput:
                id: _b
                text: '5'
            Label:
                text: 'Result'
            Label:
                id: _result
            Button:
                text: 'sum'
                # You can do the opertion directly
                on_press: _result.text = str(int(_a.text) + int(_b.text))
            Button:
                text: 'product'
                # Or you can call a method from the root class (instance of calc)
                on_press: root.product(*args)
            Button:
                text: 'Go to Screen 1'
                on_press: root.current = 'screen1'
""")

class Calc(ScreenManager):
    # define the multiplication of a function
    def product(self, instance):
        # self.result, self.a and self.b where defined explicitely in the kv
        self.result.text = str(int(self.a.text) * int(self.b.text))

class TestApp(App):
    def build(self):
        return Calc()

if __name__ == '__main__':
    TestApp().run()
于 2013-07-24T04:38:01.203 に答える