Как я могу отобразить вход на другом экране в киве? - PullRequest
0 голосов
/ 07 июля 2019

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

Есть экран, на котором я хочу отобразить пользовательские вводы с предыдущего экрана.

class MainWindow(Screen):
    panjang= float
    lebar= float
    tingi= float
    luas1 = (panjang*tinggi)/10
    luas2= (lebar*tinggi)/10
    cat= luas1*2+luas2*2

    def logOut(self):
        sm.current = "create"

    def on_enter(self, *args):
        self.panjang.text = "Panjang: " + panjang
        self.lebar.text = "Lebar: " + lebar
        self.tinggi.text = "Tinggi: " + tinggi

КВ файл:

<MainWindow>:
    panjang:panjang
    lebar: lebar
    tinggi:tinggi

    FloatLayout:
        Label:
            id: panjang
            pos_hint:{"x": 0.1, "top":0.9}
            size_hint:0.8, 0.2
            text: "Panjang: "

        Label:
            id: lebar
            pos_hint:{"x": 0.1, "top":0.7}
            size_hint:0.8, 0.2
            text: "Lebar: "

        Label:
            id: tinggi
            pos_hint:{"x": 0.1, "top":0.5}
            size_hint:0.8, 0.2
            text: "Tinggi:"

        Button:
            pos_hint:{"x":0.2, "y": 0.1}
            size_hint:0.6,0.2
            text: "Semula"
            on_release:
                app.root.current = "create"
                root.manager.transition.direction = "down"

Входные данные не отображаются, и отображается сообщение об ошибке «Панджанг не определен». Как я могу это исправить? И, судя по моему кодированию, можно вычислить luas1, 2 и cat?

Edit: Я просто понял, что эти строки вышли в сообщении об ошибке:

 78:
      79:<MainWindow>:
 >>   80:    panjang:panjang
      81:    lebar: lebar
      82:    tinggi:tinggi

Затем я попытался добавить пробел и добавил другие переменные следующим образом:

panjang: panjang
    lebar: lebar
    tinggi: tinggi
    luas1: luas1
    luas2: luas2
    cat: cat

Затем вышли следующие строки:

 2:    name: "create"
       3:
 >>    4:    panjang: panjang
       5:    lebar: lebar
       6:    tinggi: tinggi

Почему в этой переменной только ошибка?

Edit2:

Полная кодировка Python:

# main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from database import DataBase
from kivy.properties import NumericProperty


class CreateAccountWindow(Screen):
    panjang = ObjectProperty(None)
    lebar = ObjectProperty(None)
    tinggi = ObjectProperty(None)

    def submit(self):
        if self.tinggi.text !="":
            try:
                if float(self.tinggi.text) and float(self.lebar.text) and float(self.panjang.text):

                    sm.current = "main"

            except:
                invalidForm()

        else:
            invalidForm()


    def login(self):
        self.reset()
        sm.current = "main"

    def reset(self):
        self.panjang.text = ""
        self.lebar.text = ""
        self.tinggi.text = ""

class MainWindow(Screen):
    # Each screen has by default a property manager that gives 
    # you the instance of the ScreenManager used.

    # declare class attributes
    panjang = ObjectProperty(None)
    lebar = ObjectProperty(None)
    tingi = ObjectProperty(None)

    # declare and initialize to 0.0 (float)
    luas1 = NumericProperty(0.0)
    luas2 = NumericProperty(0.0)
    cat = NumericProperty(0.0)

    def logOut(self):
        self.manager.current = "create"

    def volume(self):
        self.luas1 = float(self.manager.ids.create.panjang.text) * float(self.tinggi) / 10
        self.luas2 = (self.lebar * self.tinggi) / 10
        self.cat = self.luas1*2 + self.luas2*2

    def on_enter(self, *args):
        self.volume()    # calculate volume
        self.panjang.text = "Panjang: " + self.manager.ids.create.panjang.text
        self.lebar.text = "Lebar: " + self.manager.ids.create.lebar.text
        self.tinggi.text = "Tinggi: " + self.manager.ids.create.tinggi.text
        self.luas1.text = "Luas:" + self.manager.ids.main.luas1.text
        self.luas2.text = "Luas:" + self.manager.ids.main.luas2.text
        self.cat.text = "Luas:" + self.manager.ids.main.cat.text


class WindowManager(ScreenManager):
    pass


def invalidLogin():
    pop = Popup(title='Invalid Login',
                  content=Label(text='Invalid username or password.'),
                  size_hint=(None, None), size=(400, 400))
    pop.open()


def invalidForm():
    pop = Popup(title='Invalid Form',
                  content=Label(text='Please fill in all inputs with valid information.'),
                  size_hint=(None, None), size=(400, 400))

    pop.open()


kv = Builder.load_file("banyaknyakerja.kv")

sm = WindowManager()

screens = [CreateAccountWindow(name="create"),MainWindow(name="main")]
for screen in screens:
    sm.add_widget(screen)

sm.current = "create"


class MyMainApp(App):
    def build(self):
        return sm


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

полное кодирование KV:

<ScreenManagement>:
    CreateWindow:
        id:create
        name: "create"

    MainWindow:
        id: main
        name: "main"

<CreateAccountWindow>:

    panjang: panjang
    lebar: lebar
    tinggi: tinggi

    FloatLayout:
        cols:1

        FloatLayout:
            size: root.width, root.height/2

            Label:
                text: "serfbgokmfor"
                size_hint: 0.8, 0.2
                pos_hint: {"x":0.1, "top":1}
                font_size: (root.width**2 + root.height**2) / 14**4

            Label:
                size_hint: 0.5,0.12
                pos_hint: {"x":0, "top":0.8}
                text: "Panjang: "
                font_size: (root.width**2 + root.height**2) / 14**4

            TextInput:
                pos_hint: {"x":0.5, "top":0.8}
                size_hint: 0.4, 0.12
                id: panjang
                multiline: False
                font_size: (root.width**2 + root.height**2) / 14**4

            Label:
                size_hint: 0.5,0.12
                pos_hint: {"x":0, "top":0.8-0.13}
                text: "Lebar: "
                font_size: (root.width**2 + root.height**2) / 14**4

            TextInput:
                pos_hint: {"x":0.5, "top":0.8-0.13}
                size_hint: 0.4, 0.12
                id: lebar
                multiline: False
                font_size: (root.width**2 + root.height**2) / 14**4

            Label:
                size_hint: 0.5,0.12
                pos_hint: {"x":0, "top":0.8-0.13*2}
                text: "Tinggi:"
                font_size: (root.width**2 + root.height**2) / 14**4

            TextInput:
                pos_hint: {"x":0.5, "top":0.8-0.13*2}
                size_hint: 0.4, 0.12
                id: tinggi
                multiline: False
                font_size: (root.width**2 + root.height**2) / 14**4

        Button:
            pos_hint:{"x":0.3,"y":0.25}
            size_hint: 0.4, 0.1
            font_size: (root.width**2 + root.height**2) / 17**4
            text: "Fefrkglt;mlfavsmdmcfr"
            on_release:
                root.manager.transition.direction = "left"
                root.login()

        Button:
            pos_hint:{"x":0.2,"y":0.05}
            size_hint: 0.6, 0.15
            text: "Kira"
            font_size: (root.width**2 + root.height**2) / 14**4
            on_release:
                root.manager.transition.direction = "left"
                root.submit()



<MainWindow>:
    panjang: panjang
    lebar: lebar
    tinggi: tinggi
    luas1: luas1
    luas2: luas2
    cat: cat

    FloatLayout:
        Label:
            id: panjang
            pos_hint:{"x": 0.1, "top":0.9}
            size_hint:0.8, 0.2
            text: "Panjang: "

        Label:
            id: lebar
            pos_hint:{"x": 0.1, "top":0.8}
            size_hint:0.8, 0.2
            text: "Lebar: "

        Label:
            id: tinggi
            pos_hint:{"x": 0.1, "top":0.7}
            size_hint:0.8, 0.2
            text: "Tinggi:"

        Label:
            id: luas1
            pos_hint:{"x": 0.1, "top":0.6}
            size_hint:0.8, 0.2
            text: "Luas:"

        Label:
            id: luas2
            pos_hint:{"x": 0.1, "top":0.5}
            size_hint:0.8, 0.2
            text: "Luas:"

        Label:
            id: cat
            pos_hint:{"x": 0.1, "top":0.4}
            size_hint:0.8, 0.2
            text: "Cat:"

        Button:
            pos_hint:{"x":0.2, "y": 0.1}
            size_hint:0.6,0.2
            text: "Semula"
            on_release:
                app.root.current = "create"
                root.manager.transition.direction = "down"

1 Ответ

0 голосов
/ 07 июля 2019

Проблема 1

panjang не определена

Основная причина

Ошибка возникла из-за того, что ваше приложение пыталось получить доступ к справочной информации или сослаться на нее.атрибут / переменная, которая не определена локально в методе on_enter().

Решение

Чтобы получить доступ к входным значениям из другого экрана, необходимо связать экраны с ScreenManager, выполнив следующие действия:

  1. Назначение id: каждому экрану в файле kv
  2. Файл Kv: Доступ к входным значениям в <CreateWindow>: из <MainWindow>:, используйте root.manager.ids.create.ids.panjang.text (используя все ids) или root.manager.ids.create.panjang.text (используя смесь ids и ObjectProperty)
  3. Py File: Доступ к входным значениям в <CreateWindow>: из <MainWindow>:, использование self.manager.ids.create.ids.panjang.text (использование всех ids) или self.manager.ids.create.panjang.text (использование смеси ids и ObjectProperty)

Snippets - файл kv

<WindowManager>:
    CreateAccountWindow:
        id: create
        name: 'create'

    MainWindow:
        id: main
        name: 'main'

<CreateAccountWindow>:
    ...
<MainWindow>:
    ...

Snippets

def on_enter(self, *args):
    self.panjang.text = "Panjang: " + self.manager.ids.create.panjang.text
    self.lebar.text = "Lebar: " + self.manager.ids.create.lebar.text
    self.tinggi.text = "Tinggi: " + self.manager.ids.create.tinggi.text

Задача 2

Можно ли рассчитать luas1, 2 и cat?

Решение

Да, они могут бытьlculated.

  • Реализуйте метод volume() и вставьте в него свою формулу
  • Вызывайте новый метод всякий раз, когда вам нужно вычислить объем краски

Фрагменты

from kivy.properties import NumericProperty, ObjectProperty
...

class MainWindow(Screen):
    # Each screen has by default a property manager that gives 
    # you the instance of the ScreenManager used.

    # declare class attributes
    panjang = ObjectProperty(None)
    lebar = ObjectProperty(None)
    tingi = ObjectProperty(None)
    luas1 = ObjectProperty(None)
    luas2 = ObjectProperty(None)
    cat = ObjectProperty(None)

    def logOut(self):
        self.manager.current = "create"

    def volume(self):
        luas1 = float(self.manager.ids.create.panjang.text) * float(self.manager.ids.create.tinggi.text) / 10
        luas2 = float(self.manager.ids.create.lebar.text) * float(self.manager.ids.create.tinggi.text) / 10

        self.luas1.text = str(luas1)
        self.luas2.text = str(luas2)
        self.cat.text = str(luas1 * 2 + luas2 * 2)

    def on_enter(self, *args):
        self.volume()    # calculate volume
        self.panjang.text = "Panjang: " + self.manager.ids.create.panjang.text
        self.lebar.text = "Lebar: " + self.manager.ids.create.lebar.text
        self.tinggi.text = "Tinggi: " + self.manager.ids.create.tinggi.text

Выход

MainWindow displayed

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...