1

Тема: Програма обчислення відсотків (Python + Kivy)

Доброго дня.

Почав вивчати Python.
Написав програму для використання на роботі.
Чи може хтось допомогти з Kivy?
Хочу створити програму для Android щоб змогли користуватись колеги.
PyCharm налаштував, працює з Kivy без помилок.

x = float(input('Номінальна вага '))
y = float(input('Мінімальна вага '))
z = float(input('Максимальна вага '))

r = y/x * 100 - 100
r1 = z/x * 100 - 100

r2 = round(x)
r3 = round(r, 1)
r4 = round(r1, 1)

def func(number):
    if number < 0:
        number = number * -1
    elif number >= 0:
        number = number
    return number

print('Номінальна вага ' + str(r2) + 'г')
print('Мінімальна вага ' + str(func(r3)) + '%')
print('Максимальна вага ' + str(r4) + '%')

2

Re: Програма обчислення відсотків (Python + Kivy)

Хто підкаже що не так роблю

main.py

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

Window.size = (480, 853)

from kivy.config import Config
Config.set('kivy', 'keyboard_mode', 'systemanddock')

def get_brutto(x):
    r = str(round((y / x) * 100 - 100))
    r1 = str(round((z / x) * 100 - 100))

    return {'x': x, 'r': r, 'r1': r1}

class Container(GridLayout):

    def calculate(self):
        try:
            x = int(self.text_input.x)
            y = int(self.text_input.y)
            z = int(self.text_input.z)
        except:
            x = 0

        brutto = get_brutto(x)
        self.x.text = brutto.get(x)
        self.r.text = brutto.get(r)
        self.r1.text = brutto.get(r1)

class MyApp(App):
    def build(self):
        return Container()


if __name__ == '__main__':
    MyApp().run()

my.kv

<ItemLabel@Label>:
    font_size: '25sp'
    haline: 'left'
    valign: 'middle'
    text_size: self.size

<Container>:
    rows: 6
    text_input: x
    text_input: y
    text_input: z

    AnchorLayout:
        size_hint: 1, 1
        rows:3

        GridLayout:
            rows: 3
            FloatLayout:
                TextInput:
                    id: x
                    font_size: '45sp'
                    #size_hint: 1, 0.4
                    #pos: 100, 100
                    pos_hint: {'top': 1}
                    multiline: False
                    font_size: 40
            FloatLayout:
                TextInput:
                    id: y
                    font_size: '45sp'
                    #size_hint: 1, 0.4
                    pos_hint: {'top': 1}
                    #pos: 100, 50
                    multiline: False
                    font_size: 40
            FloatLayout:
                TextInput:
                    id: z
                    font_size: '45sp'
                    #size_hint: 1, 0.4
                    pos_hint: {'top': 1}
                    #pos: 100, 10
                    multiline: False
                    font_size: 40

    GridLayout:
        cols: 2

        BoxLayout:
            orientation: 'vertical'
            padding: [30, 0, 0, 0]
            ItemLabel:
                text: 'Номінальна вага'

            ItemLabel:
                text: 'Мінімальна вага'

            ItemLabel:
                text: 'Максимальна вага'

        BoxLayout:
            orientation: 'vertical'
            padding: [30, 0, 0, 0]
            size_hint: 1, 1
            ItemLabel:
                id: x
                text: '0   '

            ItemLabel:
                id: r
                text: '0%'

            ItemLabel:
                id: r1
                text: '0%'

    BoxLayout:
        size_hint: 0.9, 0.5
        padding: [30, 0, 30, 20]
        Button:
            #size_hint: 0.5, 0.4
            pos_hint: {'center_x': 0.5, 'y': 0.1}
            text: 'Розрахувати'

            on_release:
                root.calculate()

    BoxLayout:
        size_hint: 0.9, 0.5
        padding: [30, 0, 30, 20]
        Button:
            #size_hint: 0.5, 0.4
            pos_hint: {'center_x': 0.5, 'y': 0.1}
            text: 'SinglePack'
    BoxLayout:
        size_hint: 0.9, 0.5
        padding: [30, 0, 30, 20]
        Button:
            #size_hint: 0.5, 0.4
            pos_hint: {'center_x': 0.5, 'y': 0.1}
            text: 'MultiPack'

3

Re: Програма обчислення відсотків (Python + Kivy)

Ніколи не працював з Kivy, але вам навряд чи хтось допоможе, якщо ви не скажете, в чому проблема. Чому саме ви вирішили, що щось не так робите?

Подякували: 777011

4

Re: Програма обчислення відсотків (Python + Kivy)

вилітає помилка при розрахуванні

 Traceback (most recent call last):
   File "C:\Users\Professional\PycharmProjects\pythonProject4\main.py", line 41, in <module>
     MyApp().run()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\app.py", line 955, in run
     runTouchApp()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\base.py", line 574, in runTouchApp
     EventLoop.mainloop()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\base.py", line 339, in mainloop
     self.idle()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\base.py", line 383, in idle
     self.dispatch_input()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\base.py", line 334, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\base.py", line 302, in post_dispatch_input
     wid.dispatch('on_touch_up', me)
   File "kivy\_event.pyx", line 731, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up
     self.dispatch('on_release')
   File "kivy\_event.pyx", line 727, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1307, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1191, in kivy._event.EventObservers._dispatch
   File "C:\Users\Professional\PycharmProjects\pythonProject4\venv\lib\site-packages\kivy\lang\builder.py", line 55, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "C:\Users\Professional\PycharmProjects\pythonProject4\my.kv", line 88, in <module>
     root.calculate()
   File "C:\Users\Professional\PycharmProjects\pythonProject4\main.py", line 28, in calculate
     brutto = get_brutto(x)
   File "C:\Users\Professional\PycharmProjects\pythonProject4\main.py", line 13, in get_brutto
     r = str(round((y / x) * 100 - 100))
 NameError: name 'y' is not defined

5 Востаннє редагувалося koala (26.06.2022 11:33:37)

Re: Програма обчислення відсотків (Python + Kivy)

Ось ця функція

def get_brutto(x):
    r = str(round((y / x) * 100 - 100))
    r1 = str(round((z / x) * 100 - 100))

    return {'x': x, 'r': r, 'r1': r1}

звертається до y та z, які в ній не встановлені, тобто мають бути глобальними. Однак і глобальних змінних з такими іменами немає. Гадаю, найпростіше - передавати y та z у get_brutto як аргументи:

def get_brutto(x, y, z):
    r = str(round((y / x) * 100 - 100))
    r1 = str(round((z / x) * 100 - 100))

    return {'x': x, 'r': r, 'r1': r1}
...
    brutto = get_brutto(x, y, z)
Подякували: 777011

6

Re: Програма обчислення відсотків (Python + Kivy)

тепер ось така помилка

     brutto = get_brutto(x, y, z)
 UnboundLocalError: local variable 'z' referenced before assignment

7

Re: Програма обчислення відсотків (Python + Kivy)

77701 написав:
        try:
            x = int(self.text_input.x)
            y = int(self.text_input.y)
            z = int(self.text_input.z)
        except:
            x = 0

Схоже, у вас тут не всі значення задані

Подякували: 777011

8

Re: Програма обчислення відсотків (Python + Kivy)

Та вроді ті що потрібні для обчислення.