Kivy - 计算器应用



本章,我们将学习如何使用 Kivy 库构建一个计算器应用程序。计算器包含每个数字和运算符的按钮。它应该有一个带有“=”标题的按钮来计算运算,还有一个按钮来清除结果。

让我们从以下设计开始:

Kivy Calculator App

上述布局显示顶部有一个输入框,后面跟着一个用于按钮的 3 列布局,此外,四个运算符按钮排列在一列中。

我们将使用一个只有一列的顶部网格布局,并在其下方添加一个右对齐的 TextInput,然后在其下方放置另一个两列的网格。此网格的左侧单元格包含三列的数字、“=”和“C”按钮。第二列是另一个只有一列的网格,用于所有算术运算符。

以下“kv”文件采用了此逻辑:

<calcy>:
   GridLayout:
      cols:1
      TextInput:
         id:t1
         halign:'right'
         size_hint:1,.2
         font_size:60
      GridLayout:
         cols:2
         GridLayout:
            cols:3
            size:root.width, root.height
            Button:
               id:one
               text:'1'
               on_press:root.onpress(*args)
            Button:
               id:two
               text:'2'
               on_press:root.onpress(*args)
            Button:
               id:thee
               text:'3'
               on_press:root.onpress(*args)
            Button:
               id:four
               text:'4'
               on_press:root.onpress(*args)
            Button:
               id:five
               text:'5'
               on_press:root.onpress(*args)
            Button:
               id:six
               text:'6'
               on_press:root.onpress(*args)
            Button:
               id:seven
               text:'7'
               on_press:root.onpress(*args)
            Button:
               id:eight
               text:'8'
               on_press:root.onpress(*args)
            Button:
               id:nine
               text:'9'
               on_press:root.onpress(*args)
            Button:
               id:zero
               text:'0'
               on_press:root.onpress(*args)
            Button:
               id:eq
               text:'='
               on_press:root.onpress(*args)
            Button:
               id:clr
               text:'C'
               on_press:root.onpress(*args)
      GridLayout:
         cols:1
         size_hint:(.25, root.height)
         Button:
            id:plus
            text:'+'
            on_press:root.onpress(*args)
         Button:
            id:minus
            text:'-'
            on_press:root.onpress(*args)
         Button:
            id:mult
            text:'*'
            on_press:root.onpress(*args)
         Button:
            id:divide
            text:'/'
            on_press:root.onpress(*args)

请注意,每个按钮在其 on_press 事件上都绑定了 onpress() 方法。

onpress() 方法基本上读取按钮标题(其 text 属性)并确定操作过程。

  • 如果按钮的标题是数字,则将其附加到 TextInput 框的 text 属性。

self.ids.t1.text=self.ids.t1.text+instance.text
  • 如果按钮代表任何算术运算符 (+, -, *, /),则此时文本框中的数字将存储在一个变量中以供进一步操作,并且文本框将被清除。

if instance.text in "+-*/":
self.first=int(self.ids.t1.text)
self.ids.t1.text='0'
self.op=instance.text
  • 如果按钮的 text 属性是“=”,则此时文本框中的数字为第二个操作数。执行相应的算术运算,并将结果显示在文本框中。

if instance.text=='=':
if self.first==0: return
self.second=int(self.ids.t1.text)
if self.op=='+': result=self.first+self.second
if self.op=='-': result=self.first-self.second
if self.op=='*': result=self.first*self.second
if self.op=='/': result=self.first/self.second
self.ids.t1.text=str(result)
self.first=self.second=0
  • 最后,如果按钮的标题为“C”,则文本框将设置为空。

if instance.text=='C':
self.ids.t1.text=''
self.first=self.second=0

示例

上述“kv”文件加载到 App 类的 build() 方法中。这是完整代码

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.core.window import Window

Window.size = (720,400)

class calcy(GridLayout):
   def __init__(self, **kwargs):
      super(calcy, self).__init__(**kwargs)
      self.first=self.second=0

   def onpress(self, instance):
      if instance.text=='C':
         self.ids.t1.text=''
         self.first=self.second=0
      elif instance.text in "+-*/":
         self.first=int(self.ids.t1.text)
         self.ids.t1.text='0'
         self.op=instance.text

      elif instance.text=='=':
         if self.first==0: return
            self.second=int(self.ids.t1.text)
         if self.op=='+': result=self.first+self.second
         if self.op=='-': result=self.first-self.second
         if self.op=='*': result=self.first*self.second
         if self.op=='/': result=self.first/self.second
         self.ids.t1.text=str(result)
         self.first=self.second=0
      else:
         self.ids.t1.text=self.ids.t1.text+instance.text

class calculatorapp(App):
   def build(self):
      return calcy(cols=3)
      
calculatorapp().run()

输出

运行上述程序,并使用此应用程序执行所有基本的算术计算。

Kivy Calculator
广告