我的compsci课程的作业涉及制作一个简单的GUI来检查产品。我们上周刚刚开始使用Python / Kivy。我有一个问题,让我的按钮添加到总价格。
我希望这个程序要做的是当你点击一个免费汉堡的按钮时,总共加2美元。单击付费汉堡的按钮时,请为总计添加1美元。我无法让他们添加到总数中。
from kivy.app import App
from kivy.modules import inspector # For inspection.
from kivy.core.window import Window # For inspection.
from kivy.properties import NumericProperty
from kivy.properties import BooleanProperty
__app_package__ = 'edu.unl.cse.soft161.order'
__app__ = 'Order Meal'
__version__ = '0.1'
__flags__ = ['--bootstrap=sdl2', '--requirements=python2,kivy', '--orientation=landscape']
class OrderApp(App):
total = NumericProperty(0)
freeBurger = BooleanProperty(False)
paidBurger = BooleanProperty(False)
def build(self):
inspector.create_inspector(Window, self) # For inspection (press control-e to toggle).
def item(self, item):
amount = NumericProperty(self.item)
self.total = amount + self.total
def service(self, service):
amount = NumericProperty(self.service)
self.total = self.total * amount
if __name__ == '__main__':
app = OrderApp()
app.run()
KIVY APP HERE
BoxLayout:
orientation: 'vertical'
BoxLayout:
orientation: 'horizontal'
Button:
id: button1
text: 'Order Free Burger'
value: 2
on_press: app.item(self.value)
Button:
id: button2
text: 'Order Paid Burger'
value: 1
on_press: app.item(self.value)
BoxLayout:
orientation: 'horizontal'
Button:
id: service1
value: 1.2
text: 'Good service'
on_press: app.service(self.value)
Button:
id: service2
value: 1.15
text: 'Okay service'
Button:
id: service3
value: 1.1
text: 'Bad service'
BoxLayout:
orientation: 'horizontal'
Label:
id: label1
text: 'Meal Total:'
Label:
id: totalLabel
text: str(app.total)
答案 0 :(得分:1)
而不是你的
on_press: app.service(self.value)
在.kv文件中你可以做到
on_press: app.total += self.value
您可以安全地删除Python文件中的item
- 方法。
保留.kv文件,并将item
- 方法更改为
def item(self, amount):
self.total = amount + self.total # or shorter: self.total += amount
在您的item
- 方法版本中,您使用的是self.item
,而不是名为item
的参数。但是self
引用了OrderApp
类型的对象,因此self.item
引用了名为item
的方法 - 而不是此方法的参数恰好具有相同的名称。为了减少混淆的可能性,我在第二个解决方案中将参数的名称更改为amount
。
此外,您似乎试图在NumericProperty
- 方法中定义item
。不要这样做;)这样的属性声明只在类级别(在任何方法之外)进行。 (并且因为您只想在item
- 方法结束之前使用参数item
,所以无论如何都不需要永久保存它。)可以将参数添加到self.total
没有任何转变。
如果您再次面临类似问题,可能需要在代码中添加一些print
语句。这使您可以在应用程序崩溃之前查看变量的状态。这种技术的一个例子是
def item(self, item):
print "*" * 300 # prints 300 asterisks so you can find it quickly
print self.item # shows that self.item is a method and *not* the argument
# ... more code ...
玩得开心! :)