我正在尝试制作一个可以计算圆锥体体积的应用程序(到目前为止)。 我有一个名为ConeVolumeScreen的屏幕,其中有两个TextInput小部件。
<ConeVolumeScreen>:
BoxLayout:
orientation: ...
padding: ...
spacing: ...
Label:
text: 'Radius:'
TextInput:
id: cone_vol_radius
multiline: False
input_type: 'number'
Label:
text: 'Height:'
TextInput:
id: cone_vol_height
multiline: False
input_type: 'number'
Button:
text: 'Solve'
on_release: app.root.changeScreen('solve cone volume')
应该将一个人的圆锥的半径和高度输入到这两个小部件中。然后,此人可以单击按钮以转到名为SolveConeVolumeScreen的下一个屏幕。在此屏幕中,有一个标签应打印该人指定的锥体的体积。
<SolveConeVolumeScreen>:
BoxLayout:
orientation: ...
padding: ...
spacing: ...
Label:
text: app.getConeVolume(cone_vol_radius, cone_vol_height)
getConeVolume()是这里的一种方法
class CalculatorRoot(BoxLayout):
def __init__(self, **kwargs):
super(CalculatorRoot, self).__init__(**kwargs)
self.screen_list = []
def changeScreen(self, next_screen):
if self.ids.calc_screen_manager.current not in self.screen_list:
self.screen_list.append(self.ids.calc_screen_manager.current)
if next_screen == 'volume':
self.ids.calc_screen_manager.current = 'volume_screen'
elif next_screen == 'area_screen':
self.ids.calc_screen_manager.current = 'area_screen'
elif next_screen == 'surface area':
self.ids.calc_screen_manager.current = 'surfarea_screen'
elif next_screen == 'cone volume':
self.ids.calc_screen_manager.current = 'coneVolume_screen'
elif next_screen == 'solve cone volume':
self.ids.calc_screen_manager.current = 'solveConeVolume_screen'
elif next_screen == 'rectangular based pyramid volume':
self.ids.calc_screen_manager.current = 'rectPyramidVolume_screen'
def onBackButton(self):
if self.screen_list:
self.ids.calc_screen_manager.current = self.screen_list.pop()
return True
return False
class CalculatorApp(App):
def __init__(self, **kwargs):
super(CalculatorApp, self).__init__(**kwargs)
Window.bind(on_keyboard=self.onBackButton)
def onBackButton(self, window, key, *args):
if key == 27:
return self.root.onBackButton()
def build(self):
return CalculatorRoot()
def getConeVolume(self, r, h):
first_step = 'π * ' + str(r) + '^2 * ' + str(h) + ' / 3\n'
rr = round(r * r, 2)
second_step = 'π * ' + str(rr) + ' * ' + str(h) + ' / 3\n'
rh = round(rr * h, 2)
third_step = 'π * ' + str(rh) + ' / 3\n'
pirh = round(pi * rh, 2)
fourth_step = str(pirh) + ' / 3\n'
result = round(pi * rh, 2)
final_step = 'The answer is ' + str(result) + '.'
thing = first_step + second_step + third_step + fourth_step + final_step
return thing
但是该错误表明未定义cone_vol_radius。
...
128: spacing: min(root.width, root.height) * .02
129: Label:
130:文本:app.getConeVolume(cone_vol_radius,cone_vol_height) 131: 132 :: ... BuilderException:解析器:文件“ / Users / fayzulloh / Desktop / Calculator App / calculator.kv”,第130行: ... 128:间距:最小值(root.width,root.height)* .02 129:标签: 130:文本:app.getConeVolume(cone_vol_radius,cone_vol_height) 131: 132 :: ... NameError:名称“ cone_vol_radius”未定义
请帮助。我真的很感谢任何建议。
这是我的屏幕管理器
<CalculatorRoot>:
orientation: "vertical"
ScreenManager:
id: calc_screen_manager
StartScreen:
name: 'start_screen'
VolumeScreen:
id: volume_screen
name: 'volume_screen'
AreaScreen:
id: area_screen
name: 'area_screen'
SurfaceAreaScreen:
id: surfarea_screen
name: 'surfarea_screen'
ConeVolumeScreen:
id: coneVolume_screen
name: 'coneVolume_screen'
SolveConeVolumeScreen:
id: solveConeVolume_screen
name: 'solveConeVolume_screen'
RectPyramidVolumeScreen:
id: rectPyramidVolume_screen
name: 'rectPyramidVolume_screen'
答案 0 :(得分:0)
应用程序中有几个错误。
在参数中添加root.ids.ids.coneVolume_screen.ids.
。
解决NameError后,将发生AttributeError。 AttributeError: 'NoneType' object has no attribute 'ids'
。这是因为内部ID尚不可用。
注意,最外面的小部件在应用其他任何规则之前,先将kv规则应用于其所有内部小部件。 这意味着如果 内部小部件包含ID,这些ID可能在 内部小部件的
__init__
函数。
id
赋予标签,例如id: result
on_pre_enter
事件以调用getConeVolume()
方法。cone_vol_radius
和cone_vol_height
替换cone_vol_radius.text
和cone_vol_height.text
。int()
函数以将TextInput的文本/字符串转换为整数。<SolveConeVolumeScreen>:
on_pre_enter:
root.ids.result.text = app.getConeVolume(int(app.root.ids.coneVolume_screen.ids.cone_vol_radius.text), int(app.root.ids.coneVolume_screen.ids.cone_vol_height.text))
BoxLayout:
orientation: 'vertical'
Label:
id: result