добавление двух значений в два экрана и получение результата - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь создать приложение, которое может рассчитать сумму двух значений. У меня есть экран под названием Therdwindow, в котором есть три виджета для ввода текста.

from kivy.app import App 
from kivy.app import App 
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.scatter import Scatter
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen`
class MainWindow(Screen):
    pass
class SecondWindow(Screen):
    pass
class Therdwindow(Screen):
    pass
class Fourwindow(Screen):
    pass
class FunfthWindow(Screen):
    def calculate3(self,bibi,mimi):
        kiki = str(float(bibi) + float(mimi))
        if kiki:
            try :
                self.result_1.text = str(eval(kiki)) 
            except Exception: 
                self.result_1.text = 'Error'

class Sixwindow(Screen):
    pass
class WindowManager(ScreenManager):
    psss
kv = Builder.load_file("layout.kv")
class MyMainApp(App):
    def build(self):
        return kv
if __name__ == "__main__":
    MyMainApp().run()

Человек должен ввести пароль 'gin', а затем нажать кнопку 'NEXT' до go до следующего экрана с именем SecondWindow, затем нажмите кнопку «NEXT» до go до следующего экрана с именем TherdWindow,

Затем введите первое значение в поле, затем нажмите кнопку «NEXT» до go до следующего Экран с именем fourWindow, затем введите второе значение и нажмите кнопку «СЛЕДУЮЩАЯ», чтобы go перейти к следующему экрану с именем funfthWindow.

должно быть «Результат», если он щелкнет по результату нажатия кнопки. На этом экране есть Метка, которая должна напечатать объем суммы, указанной человеком.

layout.kv

<CustButton@Button>: 
     font_size: 40
WindowManager:
    MainWindow:
    SecondWindow:
    Therdwindow:
    Fourwindow:
    FunfthWindow:
    Sixwindow:

<MainWindow>:
     name: "main"

    <MainWindow>:
        name: "main"
        GridLayout:
            cols:1

            GridLayout:
                cols: 2
                orientation: 'vertical'

                Label:
                    text: "Password: "
                    font_size: "40sp"
                    background_color: (1,1,0,1)
                    font_name: 'RobotoMono-Regular.ttf'

                TextInput:
                    id: passw
                    multiline: False
                    font_size: "40sp"

            CustButton:
                text: "Submit"
                background_color: (0.8,0.8,0,1)
                on_press:
                    app.root.current = "second" if passw.text == "gin" else "six"
                    root.manager.transition.duration = 1 
                    root.manager.transition.direction = "left"


<SecondWindow>:
     name: "second"

     GridLayout:

         cols: 1
         spacing: 10
         CustButton:
             text: "Go Back"
             on_press:
                 app.root.current = "main"
                 root.manager.transition.direction = "right"

         CustButton:
             text: "next"
             on_press:
                 app.root.current = "therd"
                 root.manager.transition.direction = "left"


<Therdwindow>:
     id:lulu
     name: "therd"
     nani:feras1
     rows: 20
     padding: 0
     spacing: 2



     GridLayout:
         spacing: 10
         cols:2
         Label:
             text: "Enter The First Value :  "
             font_size: "30sp"


         TextInput: 
             id:first_Value
             font_size: 40
             multiline: True



         CustButton: 
             text: "go back"
             on_press:
                 app.root.current = "second"
                 root.manager.transition.direction = "right"

         CustButton: 
             text: "Next"
             on_press:
                 app.root.current = "four"
                 root.manager.transition.direction = "left"


<Fourwindow>:
     id:lala
     name: "four"
     nani21:feras2
     rows: 20
     padding: 0
     spacing: 2



     GridLayout:
         spacing: 10
         cols:2
         Label:
             text: "Enter The second Value : "
             font_size: "30sp"



         TextInput: 
             id: second_Value
             font_size: 40
             multiline: True



         CustButton: 
             text: "go back"
             on_press:
                 app.root.current = "therd"
                 root.manager.transition.direction = "right"

         CustButton: 
             text: "NEXT"
             on_press:
                 app.root.current = "funfth"
                 root.manager.transition.direction = "left"


<FunfthWindow>: 
     id:CalcmGridLayout
     name: "funfth"            
     result_1:label_id
     rows: 20
     padding: 0
     spacing: 2



     GridLayout:
         spacing: 10
         cols:2

         CustButton: 
             text: "Result :  "
             font_size: "30sp"
             on_press:CalcmGridLayout.calculate3(first_Value.text,second_Value.text)

         Label: 
             id: label_id
             font_size: 40
             multiline: True    

         CustButton: 
             text: "go back"
             on_press:
                 app.root.current = "four"
                 root.manager.transition.direction = "right"

         CustButton: 
             text: "NEXT"
             on_press:
                 app.root.current = "main"
                 root.manager.transition.direction = "left"


<Sixwindow>:
     name: "six"            
     GridLayout:
         cols: 1
         spacing: 10
         Label:
             text: 'das Password ist falsch'
             font_size: "40sp"

         CustButton:
             text: "nochmal"
             on_press:
                 app.root.current = "main"
                 root.manager.transition.direction = "right"

Когда я нажимаю ' Result ', я получаю эту ошибку NameError : first_Value is not defined

помогите пожалуйста. Буду очень признателен за любые советы.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Вы пытаетесь использовать ids из одного правила внутри другого правила, но ids доступны только для текущего правила. Таким образом, эта строка в вашем kv не будет работать:

on_press:CalcmGridLayout.calculate3(first_Value.text,second_Value.text)

Способ исправить это, получить доступ к ids, сначала получив Screen, где определено это id, и это легче сделать за пределами kv. Поэтому я бы порекомендовал заменить вышеуказанную строку на:

on_press:root.calculate3()

, а затем слегка переписать ваш метод calculate3(), чтобы получить доступ к другим значениям:

class FunfthWindow(Screen):
    def calculate3(self):
        bibi = App.get_running_app().root.get_screen('therd').ids.first_Value.text
        mimi = App.get_running_app().root.get_screen('four').ids.second_Value.text
        kiki = str(float(bibi) + float(mimi))
        if kiki:
            try :
                self.ids.label_id.text = str(eval(kiki))
            except Exception:
                self.ids.label_id.text = 'Error'
0 голосов
/ 31 января 2020

Ну, есть много способов сделать это, для простоты я сделаю все операции в классе MyMainApp:

 from kivy.properties import ObjectProperty
 from Kivy.clock import Clock
...
class Therdwindow(Screen):

    first_Value = ObjectProperty(None)

    def getvalue(self):
        return self.first_Value

class Fourwindow(Screen):

    second_Value = ObjectProperty(None)

    def getvalue(self):
        return self.second_Value

class FunfthWindow(Screen):

    label_id = ObjectProperty(None)

    def getlabel(self):
        return self.label_id

class WindowManager(ScreenManager):
    pass


class MyMainApp(App):
    def build(self):
        with open('layout.kv', encoding='utf-8', errors='ignore') as f:
            Builder.load_string(f.read())
        # creating objects of screens
        self.mainwindow = MainWindow()
        self.secondwindow = SecondWindow()
        self.therdwindow = Therdwindow()
        self.fourwindow = Fourwindow()
        self.funfthwindow = FunthWindow()

        # creating object of screen manager
        self.sm = WindowManager()

        # getting all object properties
        self.first_Value = self.therdwindow.getvalue()
        self.second_Value = self.fourwindow.getvalue()
        self.label_id = self.funfthwindow.getlabel()

        # connecting object properties to widgets from kv file
        # sometimes we need to delay that, because the app can't load so quickly, so let's make a method for it
        Clock.schedule_once(self.getids)

        # adding screens to screen manager
        self.sm.add_widget(self.mainwindow)
        self.sm.add_widget(self.secondwindow)
        self.sm.add_widget(self.therdwindow)
        self.sm.add_widget(self.fourwindow)
        self.sm.add_widget(self.funfthwindow)
        # in case you want screen manager be able to work you should return it
        return self.sm

    def getids(self):
        self.first_Value = self.therdwindow.ids.first_Value
        self.second_Value = self.fourwindow.ids.second_Value
        self.label_id = self.funfthwindow.ids.label_id

    # method that does what you want
    def count(self):
        self.label_id.text = str(int(self.first_Value.text) + int(self.second_Value.text))

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

И вам нужно отредактировать свой файл kv, изменить все это

on_press:
    app.root.current = "second"

к этому:

on_press:
    app.sm.current = "second"

И измените это:

CustButton: 
             text: "Result :  "
             font_size: "30sp"
             on_press:CalcmGridLayout.calculate3(first_Value.text,second_Value.text)

на это:

CustButton: 
             text: "Result :  "
             font_size: "30sp"
             on_press: app.count

Также вам нужно добавить что строки в классах:

<Therdwindow>:
    ...
    first_Value: first_Value.__self__

<Fourwindow>:
    ...
    second_Value: second_Value.__self__

<FunfthWindow>:
    ...
    label_id: label_id.__self__

И удалить это:

WindowManager:
    MainWindow:
    SecondWindow:
    Therdwindow:
    Fourwindow:
    FunfthWindow:
    Sixwindow:
...