0

我对 Kivy 很陌生(昨天开始),我正在尝试创建一个足够简单的应用程序,该应用程序具有用于计算体积的多个高度和面积值的输入框。我找不到任何这样做的工作方法。到目前为止,我所拥有的是:

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


Builder.load_string("""
<MenuScreen>:
    FloatLayout:

        Label:
            text: 'Please Select an Area to Work With:'
            pos: 230, 490
            size_hint: .15, .05
            font_size: 23



        Button:
            text: "A"
            pos: 230, 100
            size_hint: .4,.1
            font_size: 23
            on_press: root.manager.current = 'settings'


        Button:
            text: "B"
            pos: 230, 210
            size_hint: .4,.1
            font_size: 23
            on_press: root.manager.current = 'settings'


        Button:
            text: "C"
            pos: 230, 320
            size_hint: .4,.1
            font_size: 23
            on_press: root.manager.current = 'settings'



        Button:
            text: "D"
            pos: 230, 420
            size_hint: .4,.1
            font_size: 23
            on_press: root.manager.current = 'settings'






<SettingsScreen>:
    GridLayout:
        Label:
            text: 'Room 1'
            pos: 6, 460
            size_hint: .15, .05
            font_size: 23

        Label:
            text: 'Room 2'
            pos: 6, 420
            size_hint: .15, .05
            font_size: 23

        Label:
            text: 'Room 3'
            pos: 6, 380
            size_hint: .15, .05
            font_size: 23

        Label:
            text: 'Room 4'
            pos: 6, 340
            size_hint: .15, .05
            font_size: 23

        Label:
            text: 'Room 5'
            pos: 6, 300
            size_hint: .15, .05
            font_size: 23

        Label:
            text: 'Room 6'
            pos: 6, 260
            size_hint: .15, .05
            font_size: 23

        TextInput:
            text1: "0"
            multiline: False
            pos: 200,420
            font_size: 23
            on_text: viewer.text = self.text1
            size_hint: .001, .001

        TextInput:
            text2: "0"
            multiline: False
            pos: 200, 420
            font_size: 23
            on_text: viewer.text = self.text2
            size_hint: .001, .001

        TextInput:
            text3: "0"
            multiline: False
            pos: 200,380
            font_size: 23
            on_text: viewer.text = self.text3
            size_hint: .001, .001

        TextInput:
            text4: "0"
            multiline: False
            pos: 200,340
            font_size: 23
            on_text: viewer.text = self.text4
            size_hint: .001, .001


        TextInput:
            text5: "0"
            multiline: False
            pos: 200,300
            font_size: 23
            on_text: viewer.text = self.text5
            size_hint: .001, .001

        TextInput:
            text6: "0"
            multiline: False
            pos: 200,240
            font_size: 23
            on_text: viewer.text = self.text6
            size_hint: .001, .001
""")

# Declare both screen
class MenuScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))

class TestApp(App):

    def build(self):
        return sm

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

我计划为每个按下的按钮设置唯一的第二页,但希望任何帮助都将不胜感激。

4

1 回答 1

1

我希望我能理解你的问题。您正在寻求执行此操作的方法。简单的答案是您拥有整个 Python 来执行您想要的所有操作。Kivy 是一个提供大量组件来设计 GUI 的库。它还为您提供了一种由Builder.load_string(). 这是一个可能或多或少是您正在寻找的示例。它有点像第一个屏幕上的计算器。第二个屏幕是空的,您可以使用底部按钮在它们之间移动。

第一个屏幕上的计算器有两个InputTexts和两个按钮(SumProduct)。Sum 按钮直接在 kivy 语言上实现了求和。Product Button 调用根中的一个方法(Calc 的一个实例)。该方法本身并不存在。我在 kivy 部分下面的 python 代码中创建。关于我所说的代码有一些评论。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

Builder.load_string("""
<Calc>:
    # This are attributes of the class Calc now
    a: _a
    b: _b
    result: _result
    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'top'
        ScreenManager:
            size_hint: 1, .9
            id: _screen_manager
            Screen:
                name: 'screen1'
                GridLayout:
                    cols:1
                    TextInput:
                        id: _a
                        text: '3'
                    TextInput:
                        id: _b
                        text: '5'
                    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)
            Screen:
                name: 'screen2'
                Label: 
                    text: 'The second screen'
    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'bottom'
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1, .1
            Button:
                text: 'Go to Screen 1'
                on_press: _screen_manager.current = 'screen1'
            Button:
                text: 'Go to Screen 2'
                on_press: _screen_manager.current = 'screen2'""")

class Calc(FloatLayout):
    # 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-03T02:51:37.947 回答