簡體   English   中英

Kivy 中的簡單計算器問題

[英]Simple calculator issue in Kivy

我正在開發一個計算器,它會根據您的支出和月底的收入進行計算。

我將為您提供 .kv 和 .py。 問題是,我已經完成了視覺效果並創建了包含數學的計算器類,現在我需要將它組合成一個正常運行的 GUI 應用程序。

所以我想要實現的是應用程序,當你點擊標記為“izracunaj”的按鈕時,計算器類(在 ''' 中)應該接受用戶輸入並計算它並返回結果。

主文件

import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

class Screen(GridLayout):
    def __init__(self, **kwargs):
        super(Screen, self).__init__(**kwargs)
        self.cols = 1

        self.add_widget(Label(text="Koliko imas na racunu"))
        self.stanjeNovaca = TextInput(multiline=False)
        self.add_widget(self.stanjeNovaca)

        self.add_widget(Label(text="Koliko dana do place"))
        self.stanjeDani = TextInput(multiline=False)
        self.add_widget(self.stanjeDani)

        self.add_widget(Label(text="Koliko trosis na dan"))
        self.stanjePotrosnja = TextInput(multiline=False)
        self.add_widget(self.stanjePotrosnja)

'''
class Calculator():
    def calculation():
        stanjeNovaca = input("Koliko imas para na racunu? ")
        stanjeDani = input("Koliko dana do place? ")
        stanjePotrosnja = input("koliko trosis na dan? ")
        svakiDanTrosis = stanjeDani*stanjePotrosnja
        naKrajuMjeseca = stanjeNovaca-svakiDanTrosis
        print("Ako svaki dan trosis {}, na kraju mjeseca ce ti ostati {}").format(stanjePotrosnja, naKrajuMjeseca)
        return calculation();
'''
class CalculatorApp(App):
  def build(self):
    return Screen()


CalculatorApp().run()

千伏

<Screen>
    Button:
        text: "izracunaj"

我已修復您的程序。 當您按下按鈕時,kv文件中添加的命令將觸發計算,結果將被打印出來。

main.py

import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput

class Screen(GridLayout):
    def __init__(self, **kwargs):
        super(Screen, self).__init__(**kwargs)
        self.cols = 1

        self.add_widget(Label(text="Koliko imas na racunu"))
        self.stanjeNovaca = TextInput(multiline=False)
        self.add_widget(self.stanjeNovaca)

        self.add_widget(Label(text="Koliko dana do place"))
        self.stanjeDani = TextInput(multiline=False)
        self.add_widget(self.stanjeDani)

        self.add_widget(Label(text="Koliko trosis na dan"))
        self.stanjePotrosnja = TextInput(multiline=False)
        self.add_widget(self.stanjePotrosnja)

    def calculation(self):
        svakiDanTrosis = float(self.stanjeDani.text) * float(self.stanjePotrosnja.text)
        naKrajuMjeseca = float(self.stanjeNovaca.text) - svakiDanTrosis
        print("Ako svaki dan trosis {}, na kraju mjeseca ce ti ostati {}".format(self.stanjePotrosnja.text, naKrajuMjeseca))
        return naKrajuMjeseca

class CalculatorApp(App):
  def build(self):
    return Screen()


CalculatorApp().run()

計算器

<Screen>
    Button:
        text: "izracunaj"
        on_release: root.calculation()

如果要在GUI中顯示結果,只需在Screen添加Widget (例如Label )並相應地設置其文本即可。

這個計算器在黑暗模式下看起來像 Windows 10 計算器

main.py(下)

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.lang.builder import Builder
import re

Builder.load_file('./calculator.kv')
Window.size = (350, 550)

class CalculatorWidget(Widget):
    # Clear the screen
    def clear(self):
        self.ids.input_box.text = "0"

    # Remove the last character
    def remove_last(self):
        prev_number = self.ids.input_box.text
        prev_number = prev_number[:-1]
        self.ids.input_box.text = prev_number

    # Getting the button value
    def button_value(self, number):
        prev_number = self.ids.input_box.text

        if "wrong equation" in prev_number:
            prev_number = ''

        if prev_number == '0':
            self.ids.input_box.text = ''
            self.ids.input_box.text = f"{number}"

        else:
            self.ids.input_box.text = f"{prev_number}{number}"

    # Getting the sings
    def sings(self, sing):
        prev_number = self.ids.input_box.text
        self.ids.input_box.text = f"{prev_number}{sing}"

    # Getting decimal value
    def dot(self):
        prev_number = self.ids.input_box.text
        num_list = re.split("\+|\*|-|/|%", prev_number)

        if ("+" in prev_number or "-" in prev_number or "*" in prev_number or "/" in prev_number or "%" in prev_number) and "." not in num_list[-1]:
            prev_number = f"{prev_number}."
            self.ids.input_box.text = prev_number

        elif '.' in prev_number:
            pass

        else:
            prev_number = f'{prev_number}.'
            self.ids.input_box.text = prev_number

    # Calculate the result
    def results(self):
        prev_number = self.ids.input_box.text
        try:
            result = eval(prev_number)
            self.ids.input_box.text = str(result)
        except:
            self.ids.input_box.text = "wrong equation"

    # Positive to negative
    def positive_negative(self):
        prev_number = self.ids.input_box.text
        if "-" in prev_number:
            self.ids.input_box.text = f"{prev_number.replace('-', '')}"
        else:
            self.ids.input_box.text = f"-{prev_number}"


class CalculatorApp(App):
    def build(self):
        return CalculatorWidget()

if __name__ == "__main__":
    CalculatorApp().run()

下面是 .kv 文件中的代碼

<Button>
    size_hint: (0.2, 0.2)
    background_normal: ""
    background_color: (0, 0, 0, 0)

<CalculatorWidget>
    BoxLayout
        orientation: "vertical"
        size: root.width, root.height

        TextInput:
            id: input_box
            text: "0"
            font_size: 43
            multiline: False
            halign: "right"
            size_hint: (1, 0.19)
            background_color: (20/255, 20/255, 30/255, 1)
            foreground_color: (1, 1, 1, 1)

        GridLayout:
            cols: 4
            rows: 5

            ### Row 1 ####
            Button:
                text: "%"
                font_size: 32
                on_press: root.sings("%")
                background_color: (14/255, 73/255, 176/255, 1)

            Button:
                text: "C"
                font_size: 32
                on_press: root.clear()
                background_color: (14/255, 73/255, 176/255, 1)

            Button:
                text: u"\u00AB"
                font_size: 32
                on_press: root.remove_last()
                background_color: (14/255, 73/255, 176/255, 1)

            Button:
                text: "/"
                font_size: 32
                background_color: (14/255, 73/255, 176/255, 1)
                on_press: root.sings("/")
                background_color: (14/255, 73/255, 176/255, 1)

            #### Row 2 #####
            Button:
                text: "7"
                font_size: 32
                on_press: root.button_value(7)

            Button:
                text: "8"
                font_size: 32
                on_press: root.button_value(8)

            Button:
                text: "9"
                font_size: 32
                on_press: root.button_value(9)

            Button:
                text: "x"
                font_size: 32
                background_color: (14/255, 73/255, 176/255, 1)
                on_press: root.sings("*")

            #### Row 3 ###
            Button:
                text: "4"
                font_size: 32
                on_press: root.button_value(4)

            Button:
                text: "5"
                font_size: 32
                on_press: root.button_value(5)

            Button:
                text: "6"
                font_size: 32
                on_press: root.button_value(6)

            Button:
                text: "-"
                font_size: 32
                background_color: (14/255, 73/255, 176/255, 1)
                on_press: root.sings("-")

            ### Row 4 ###
            Button:
                text: "1"
                font_size: 32
                on_press: root.button_value(1)

            Button:
                text: "2"
                font_size: 32
                on_press: root.button_value(2)

            Button:
                text: "3"
                font_size: 32
                on_press: root.button_value(3)

            Button:
                text: "+"
                font_size: 32
                background_color: (14/255, 73/255, 176/255, 1)
                on_press: root.sings("+")

            ### Row 5 ###
            Button:
                text: "+/-"
                font_size: 32
                on_press: root.positive_negative()

            Button:
                text: "0"
                font_size: 32
                on_press: root.button_value(0)

            Button:
                text: "."
                font_size: 32
                on_press: root.dot()

            Button:
                text: "="
                font_size: 32
                background_color: (14/255, 73/255, 176/255, 1)
                on_press: root.results()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM