問題描述
我正在嘗試制作一個可以計算圓錐體積的應用程序(到目前為止).我有一個名為 ConeVolumeScreen 的屏幕,它有兩個 TextInput 小部件.
<ConeVolumeScreen>:盒子布局:方向: ...填充:...間距:...標簽:文本:'半徑:'文本輸入:編號:cone_vol_radius多行:假輸入類型:數字"標簽:文字:'身高:'文本輸入:編號:cone_vol_height多行:假輸入類型:數字"按鈕:文字:'解決'on_release: app.root.changeScreen('求解錐體體積')
一個人應該在這兩個小部件中輸入圓錐的半徑和高度.然后該人可以單擊一個按鈕以轉到名為 SolveConeVolumeScreen 的下一個屏幕.在此屏幕中,有一個標簽應該打印人員指定的錐體的體積.
<SolveConeVolumeScreen>:盒子布局:方向: ...填充:...間距:...標簽:文本:app.getConeVolume(cone_vol_radius, cone_vol_height)
getConeVolume() 是這里的一個方法
類 CalculatorRoot(BoxLayout):def __init__(self, **kwargs):super(CalculatorRoot, self).__init__(**kwargs)self.screen_list = []def changeScreen(self, next_screen):如果 self.ids.calc_screen_manager.current 不在 self.screen_list 中:self.screen_list.append(self.ids.calc_screen_manager.current)如果 next_screen == '音量':self.ids.calc_screen_manager.current = 'volume_screen'elif next_screen == 'area_screen':self.ids.calc_screen_manager.current = 'area_screen'elif next_screen == '表面積':self.ids.calc_screen_manager.current = 'surfarea_screen'elif next_screen == '圓錐體積':self.ids.calc_screen_manager.current = 'coneVolume_screen'elif next_screen == '求解錐體體積':self.ids.calc_screen_manager.current = 'solveConeVolume_screen'elif next_screen == '基于矩形的金字塔體積':self.ids.calc_screen_manager.current = 'rectPyramidVolume_screen'def onBackButton(self):如果 self.screen_list:self.ids.calc_screen_manager.current = self.screen_list.pop()返回真返回假類計算器應用程序(應用程序):def __init__(self, **kwargs):super(CalculatorApp, self).__init__(**kwargs)Window.bind(on_keyboard=self.onBackButton)def onBackButton(self, window, key, *args):如果鍵 == 27:返回 self.root.onBackButton()定義構建(自我):返回計算器根()def getConeVolume(self, r, h):first_step = 'π * ' + str(r) + '^2 * ' + str(h) + '/3
'rr = 圓形(r * r, 2)second_step = 'π * ' + str(rr) + ' * ' + str(h) + '/3
'rh = 圓形(rr * h, 2)第三步 = 'π * ' + str(rh) + '/3
'pirh = round(pi * rh, 2)第四步 = str(pirh) + '/3
'結果=圓形(pi * rh,2)final_step = '答案是' + str(result) + '.'事情 = first_step + second_step + third_step + Fourth_step + final_step退貨
但是錯誤說沒有定義cone_vol_radius.
<代碼> ...128: 間距: min(root.width, root.height) * .02129:標簽:
<塊引用><塊引用>
130:文本:app.getConeVolume(cone_vol_radius, cone_vol_height)131:132::...BuilderException:解析器:文件/Users/fayzulloh/Desktop/Calculator App/calculator.kv",第 130 行:...128: 間距: min(root.width, root.height) * .02129:標簽:130:文本:app.getConeVolume(cone_vol_radius,cone_vol_height)131:132::...NameError: name 'cone_vol_radius' 未定義
請幫忙.我真的很感激任何建議.
這是我的屏幕管理器
<CalculatorRoot>:方向:垂直"屏幕管理器:id: calc_screen_manager開始屏幕:名稱:'start_screen'卷屏:id:volume_screen名稱:'volume_screen'區域屏幕:id: area_screen名稱:'area_screen'表面積屏幕:id: surfarea_screen名稱:surfarea_screen"錐體屏幕:id:coneVolume_screen名稱:'coneVolume_screen'SolveConeVolumeScreen:id:solveConeVolume_screen名稱:'solveConeVolume_screen'RectPyramidVolumeScreen:id: rectPyramidVolume_screen名稱:'rectPyramidVolume_screen'
錯誤
應用程序中有幾個錯誤.
NameError - 解決方案
將 root.ids.ids.coneVolume_screen.ids.
添加到參數中.
屬性錯誤
解決 NameError 后,會發生 AttributeError.AttributeError: 'NoneType' 對象沒有屬性 'ids'
.這是因為內部 id 尚不可用.
I'm trying to make an app that can calculate the volume of a cone(so far). I have a screen named ConeVolumeScreen that has two TextInput widgets.
<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')
A person is supposed to enter the radius and height of the cone into these two widgets. Then the person can click on a button to go to the next screen named SolveConeVolumeScreen. In this screen there is a Label that should print the volume of the cone that the person specified.
<SolveConeVolumeScreen>:
BoxLayout:
orientation: ...
padding: ...
spacing: ...
Label:
text: app.getConeVolume(cone_vol_radius, cone_vol_height)
getConeVolume() is a method over here
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
'
rr = round(r * r, 2)
second_step = 'π * ' + str(rr) + ' * ' + str(h) + ' / 3
'
rh = round(rr * h, 2)
third_step = 'π * ' + str(rh) + ' / 3
'
pirh = round(pi * rh, 2)
fourth_step = str(pirh) + ' / 3
'
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
But the error says that cone_vol_radius is not defined.
...
128: spacing: min(root.width, root.height) * .02
129: Label:
130: text: app.getConeVolume(cone_vol_radius, cone_vol_height) 131: 132:: ... BuilderException: Parser: File "/Users/fayzulloh/Desktop/Calculator App/calculator.kv", line 130: ... 128: spacing: min(root.width, root.height) * .02 129: Label: 130: text: app.getConeVolume(cone_vol_radius, cone_vol_height) 131: 132:: ... NameError: name 'cone_vol_radius' is not defined
please help. I would really appreciate any advice.
here is my screenmanager
<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'
Errors
There are a couple of errors in the application.
NameError - Solution
Add root.ids.ids.coneVolume_screen.ids.
to the arguments.
AttributeError
After solving the NameError, an AttributeError will occurred. AttributeError: 'NoneType' object has no attribute 'ids'
. This is because inner ids are not available yet.
Kivy Language ? ids
Note that the outermost widget applies the kv rules to all its inner widgets before any other rules are applied. This means if an inner widget contains ids, these ids may not be available during the inner widget’s
__init__
function.
AttributeError: ids - Solutions
- Give an
id
to the Label e.g.id: result
- Add an
on_pre_enter
event to invokegetConeVolume()
method. - Replace TextInput object with TextInput's text i.e. replace
cone_vol_radius
andcone_vol_height
withcone_vol_radius.text
andcone_vol_height.text
respectively. - Add
int()
function to convert TextInput's text/string to integer.
Snippet
<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
Output
這篇關于如何在 Kivy/Python 的另一個屏幕中從一個屏幕引用 TextInput?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!