Kivy副屏无输出

问题描述 投票:0回答:1

Labels 中的文本是可见的,但它没有变化,就好像没有计算它一样。这是我第一次使用 Kivy,我找不到解决方案。

想法是用户在 TextInput 中输入一个数字,然后在 nft_footprint 的公式中使用它,结果在第二个屏幕上有一个“统计”输出。

起初它甚至没有打开,但我设法解决了这个问题。所有的屏幕、标签和 TextInput 都有它们的 ID(屏幕是“命名的”)。

第一屏(py):

class MainWindow(Screen):
    def nft_footprint(self):
        energy_kWh = str(340 * int(self.manager.ids.main.text_input.text))
        emission = str(211 * int(self.manager.ids.main.text_input.text))
        energy_ru = str(round(340 * int(self.manager.ids.main.text_input.text) / 85))
        airplane = str(2 * int(self.manager.ids.main.text_input.text))
        car_drive = str(int(self.manager.ids.main.text_input.text))
        computer = str(10 * int(self.manager.ids.main.text_input.text))
        kettle = str(round(4.5 * int(self.manager.ids.main.text_input.text)))

        return {'energy_kWh': energy_kWh, 'emission': emission, 'energy_ru': energy_ru, 'airplane': airplane, 'car_drive': car_drive, 'computer': computer, 'kettle': kettle}

第二屏(py):

class SecondWindow(Screen):
    def calculate(self, *args):
        self.nft_footprint()
        self.energy_kWh.text = self.manager.ids.second.energy_kWh.text + ' кВтч'
        self.emission.text = self.manager.ids.second.emission.text + ' кг'
        self.energy_ru.text = self.manager.ids.second.energy_ru.text + ' мес.'
        self.airplane.text = self.manager.ids.second.airplane.text + ' ч.'
        self.car_drive.text = self.manager.ids.second.car_drive.text + ' тысяч км'
        self.computer.text = self.manager.ids.second.computer.text + ' мес.'
        self.kettle.text = self.manager.ids.second.kettle.text + ' тысяч раз'

kv文件:

<ItemLabel@Label>:
    font_size: '15sp'
    halign: 'left'
    valign: 'middle'
    text_size: self.size

WindowManager:
    MainWindow:
        id: main
    SecondWindow:
        id: second
    ThirdWindow:

<MainWindow>:
    name: 'main'
    text_input: text_input

    GridLayout:
        rows: 5
        padding: 10
        BoxLayout:
            size_hint: 1, 0.5

        Image:
            size_hint: 0.5, 0.3
            source: 'saveplanetlogo.png'

        BoxLayout:
            size_hint: 1, 0.2
            Label:
                text: 'Хочешь купить NFT?'
                font_size: '20sp'

        TextInput:
            id: text_input
            size_hint: 0.5, 0.2
            multiline: False
            input_filter: 'int'
            input_type: 'number'

        BoxLayout:
            padding: [0, 10, 0, 0]
            Button:
                size_hint: 0.5, 0.2
                text: 'А что не так?'

                on_release:
                    root.nft_footprint()
                    app.root.current = 'second'

<SecondWindow>:
    name: 'second'

    BoxLayout:
        orientation: 'vertical'

        energy_kWh: energy_kWh
        emission: emission
        energy_ru: energy_ru
        airplane: airplane
        car_drive: car_drive
        computer: computer
        kettle: kettle

        ScrollView:
            GridLayout:
                cols: 2
                height: self.minimum_height
                size_hint_y: None
                row_force_default: True
                row_default_height: 600
                BoxLayout:
                    pos: 0, 500
                    orientation: 'vertical'
                    padding: [30, 0, 0, 0]
                    ItemLabel:
                        text: 'Затраты энергии:'
                    ItemLabel:
                        text: 'Выброс СО2:'
                    Label:
                        text: 'Это эквивалентно:'
                        font_size: '20sp'
                        halign: 'left'
                        valign: 'middle'
                        text_size: self.size

                    ItemLabel:
                        text: 'Использованная электроэнергия жителем России в течении:'
                    ItemLabel:
                        text: 'Лететь на самолете в течении:'
                    ItemLabel:
                        text: 'Проехать на машине:'
                    ItemLabel:
                        text: 'Использовать компьютер в течении:'
                    ItemLabel:
                        text: 'Разогреть чайник:'

                BoxLayout:
                    size_hint: 0.5, 1
                    orientation: 'vertical'
                    padding: [50, 0, 0, 0]
                    ItemLabel:
                        id: energy_kWh
                        text: '' #empty brackets is where the output should be
                    ItemLabel:
                        id: emission
                        text: ''
                    ItemLabel:
                        text: ''
                    ItemLabel:
                        id: energy_ru
                        text: ''
                    ItemLabel:
                        id: airplane
                        text: ''
                    ItemLabel:
                        id: car_drive
                        text: ''
                    ItemLabel:
                        id: computer
                        text: ''
                    ItemLabel:
                        id: kettle
                        text: ''
python kivy kivy-language
1个回答
0
投票

有一些问题。

  • 首先
    nft_footprint()
    方法的 return 没有在任何地方使用,因此 return 语句可以被删除。
  • 计算的值(在
    nft_footprint()
    中)没有分配给
    Labels
    窗口的
    second
  • 你正在定义
    BoxLayout
    中的
    SecondWindow
    的属性,我怀疑你实际上想要作为
    SecondWindow
    的属性。

您可以通过将这些属性定义移出

BoxLayout
并移入
SecondWindow
来解决最后一点:

<SecondWindow>:
    name: 'second'

    energy_kWh: energy_kWh
    emission: emission
    energy_ru: energy_ru
    airplane: airplane
    car_drive: car_drive
    computer: computer
    kettle: kettle

    BoxLayout:
        orientation: 'vertical'

        ScrollView:

然后就可以修改

nft_footprint()
方法,删除
return
语句,添加语句将文本赋值给标签:

class MainWindow(Screen):
    def nft_footprint(self):
        energy_kWh = str(340 * int(self.manager.ids.main.text_input.text))
        emission = str(211 * int(self.manager.ids.main.text_input.text))
        energy_ru = str(round(340 * int(self.manager.ids.main.text_input.text) / 85))
        airplane = str(2 * int(self.manager.ids.main.text_input.text))
        car_drive = str(int(self.manager.ids.main.text_input.text))
        computer = str(10 * int(self.manager.ids.main.text_input.text))
        kettle = str(round(4.5 * int(self.manager.ids.main.text_input.text)))

        secondWindow = self.manager.get_screen('second')  # get a reference to the SecondWindow
        secondWindow.energy_kWh.text = energy_kWh  # assign Label text

        # return {'energy_kWh': energy_kWh, 'emission': emission, 'energy_ru': energy_ru, 'airplane': airplane, 'car_drive': car_drive, 'computer': computer, 'kettle': kettle}

我只包括设置一个

Label
,但其他的都差不多。

© www.soinside.com 2019 - 2024. All rights reserved.