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: ''
有一些问题。
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
,但其他的都差不多。