首页 > 解决方案 > 在 KivyMD 中使用 ScreenManager 时如何在主文件的 kv 文件中引用 id

问题描述

当我只使用一个屏幕时,加密和解密曾经工作过,在使用 ScreenManager 之后,如果我在方法中打印结果而不将其传递给标签但我想打印结果,按下按钮将正常访问终端在 MDLabel id 上输出:单击加密按钮的输出将显示此错误

app.out_encrypt(Text.text, key.text) if key.text != "" else None File "C:\Users\Samoo\PycharmProjects\CryptoMD2\main.py",第 37 行,在 out_encrypt self.root.ids .screen_manager.get_screen("Caesar_Screen").ids.output.text = out_encrypted 文件“kivy\properties.pyx”,第 864 行,位于 kivy.properties.ObservableDict。getattr AttributeError:“超级”对象没有属性“ getattr

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager
import string
from kivy.uix.screenmanager import Screen, ScreenManager

alphabet = string.ascii_lowercase

class Caesar_Screen(Screen):
    pass

class Aes_Screen(Screen):
    pass

sm = ScreenManager()
sm.add_widget(Caesar_Screen(name='Caesar'))
sm.add_widget(Aes_Screen(name='Aes'))


class CryptoMD(MDApp):

    def __init__(self, **kwargs):
        self.Encrypt = Encrypt()
        self.title = 'Crypto'
        self.theme_cls.primary_palette = "Purple"
        super().__init__(**kwargs)

    def out_encrypt(self, Text, key):
        Text = Text.lower()
        key = key
        Key = int(key)
        obj = Encrypt()
        out_encrypted = obj.encrypt(Text, key)
        self.root.ids.screen_manager.get_screen("Caesar_Screen").ids.output.text = out_encrypted

    def out_decrypt(self, Text, key):
        Text = Text.lower()
        key = key
        Key = int(key)
        obj = Encrypt()
        out_decrypted = obj.decrypt(Text, key)
        self.root.Caesar.ids.output.text = out_decrypted


class Encrypt():
    def encrypt(self, Text, key):
        Text = Text.lower()
        key = key
        Key = int(key)
        encrypted_message = ""

        for c in Text:
            if c in alphabet:
                position = alphabet.find(c)
                new_position = (position + Key) % 26
                new_character = alphabet[new_position]
                encrypted_message += new_character
            else:
                encrypted_message += c
        message = str(encrypted_message)
        print(message.upper())
        return message.upper()

    def decrypt(self, Text, key):
        Text = Text.lower()
        key = key
        Key = int(key)
        encrypted_message = ""

        for c in Text:
            if c in alphabet:
                position = alphabet.find(c)
                new_position = (position - Key) % 26
                new_character = alphabet[new_position]
                encrypted_message += new_character
            else:
                encrypted_message += c
        message = str(encrypted_message)
        print(message.upper())
        return message.upper()


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

.kv 文件

#:kivy 1.11.1
#:import rgba kivy.utils.rgba

ScreenManager:
    id: screen_manager

    Caesar_Screen:
    Aes_Screen:

<Caesar_Screen>:
    name: "Caesar_Screen"

    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            id: bx
            orientation: 'vertical'
            size_hint_y: 0.2
            padding: [20, 10, 10, 20]
            canvas.before:
                Color:
                    rgba: rgba('#8A2BE2')
                RoundedRectangle:
                    pos: self.pos
                    size: self.size
                    radius: [0, 0, 90, 90]


        BoxLayout:
            MDCard:
                id: card
                orientation: 'vertical'
                size_hint: [0.35, 1]
                pos_hint: {'center_x': 0.5, 'center_y': 0.65}
                padding: [30, 10, 25, 10]
                spacing: 7

                BoxLayout:
                    orientation: 'horizontal'
                    MDLabel:
                        text: "[color=000000] Caesar Cipher [/color]"
                        text_size: self.size
                        font_size: 28
                        bold: True
                        markup: True
                        halign: "left"
                        valign: "top"

                    MDRoundFlatButton:
                        text: 'AES'
                        size: self.size
                        pos_hint: {'center_x': 0.9, 'center_y': 0.77}
                        on_press: root.manager.current = 'Aes'

                MDLabel:
                    id: output
                    text: "[color=000000] Output [/color]"
                    text_size: self.size
                    font_size: 27
                    bold: False
                    markup: True
                    halign: "center"
                    valign: "top"

                BoxLayout:
                    padding: [0, 0, 50, 0]
                    orientation: 'vertical'

                    MDTextField:
                        id: Text
                        text: "a"
                        auto_indent: True
                        allow_copy: True
                        multiline: False
                        helper_text: "Enter Text..."
                        helper_text_mode: "persistent"
                        max_text_length: 100
                        required: True
                        allow_copy: True

                    MDTextField:
                        id: key
                        text: "1"
                        input_filter: "int"
                        helper_text: "Enter Key..."
                        helper_text_mode: "persistent"
                        required: True
                        allow_copy: True
                BoxLayout:
                    padding: [0, 0, 0, 0]
                    orientation: 'vertical'

                    MDRoundFlatButton:
                        id: encrypt_bt
                        text: "Encrypt"
                        size_hint_x: 0.6
                        pos_hint: {'center_x': 0.5}
                        on_press:
                            app.out_encrypt(Text.text, key.text) if key.text != "" else None

                    MDRoundFlatButton:
                        id: decrypt_bt
                        text: "Decrypt"
                        size_hint_x: 0.6
                        pos_hint: {'center_x': 0.5}
                        on_press:
                            app.out_decrypt(Text.text, key.text) if key.text != "" else None

        BoxLayout:
            orientation: 'horizontal'
            padding: [30, 10, 30, 20]
            spacing: 20
            size_hint_y: 0.25
            pos: self.pos


            Widget:
                canvas.before:
                    Color:
                        rgba: rgba('#bfff00')
                    Ellipse:
                        pos: self.pos
                        size: self.size
            Widget:
                canvas.before:
                    Color:
                        rgba: rgba('#8A2BE2')
                    Ellipse:
                        pos: self.pos
                        size: self.size
            Widget:

                canvas.before:
                    Color:
                        rgba: rgba('#00ffff')
                    Ellipse:
                        pos: self.pos
                        size: self.size


<Aes_Screen>:
    name: "Aes"

    BoxLayout:
        orientation: 'vertical'

        BoxLayout:
            id: bx
            orientation: 'vertical'
            size_hint_y: 0.2
            padding: [20, 10, 10, 20]
            canvas.before:
                Color:
                    rgba: rgba('#8A2BE2')
                RoundedRectangle:
                    pos: self.pos
                    size: self.size
                    radius: [0, 0, 90, 90]


        BoxLayout:
            MDCard:
                id: card
                orientation: 'vertical'
                size_hint: [0.35, 1]
                pos_hint: {'center_x': 0.5, 'center_y': 0.65}
                padding: [30, 10, 25, 10]
                spacing: 7

                BoxLayout:
                    orientation: 'horizontal'
                    MDLabel:
                        text: "[color=000000] AES [/color]"
                        text_size: self.size
                        font_size: 32
                        bold: True
                        markup: True
                        halign: "left"
                        valign: "top"

                    MDRoundFlatButton:
                        text: 'Caesar'
                        size: self.size
                        pos_hint: {'center_x': 0.9, 'center_y': 0.77}
                        on_press: root.manager.current = 'Caesar_Screen'

                MDLabel:
                    id: output
                    text: "[color=000000] Output [/color]"
                    text_size: self.size
                    font_size: 27
                    bold: False
                    markup: True
                    halign: "center"
                    valign: "top"

                BoxLayout:
                    padding: [0, 0, 50, 0]
                    orientation: 'vertical'

                    MDTextField:
                        id: Text
                        text: "a"
                        auto_indent: True
                        allow_copy: True
                        multiline: False
                        helper_text: "Enter Text..."
                        helper_text_mode: "persistent"
                        max_text_length: 100
                        required: True
                        allow_copy: True

                    MDTextField:
                        id: key
                        text: "1"
                        input_filter: "int"
                        helper_text: "Enter Key..."
                        helper_text_mode: "persistent"
                        required: True
                        allow_copy: True
                BoxLayout:
                    padding: [0, 0, 0, 0]
                    orientation: 'vertical'

                    MDRoundFlatButton:
                        id: encrypt_bt
                        text: "Encrypt"
                        size_hint_x: 0.6
                        pos_hint: {'center_x': 0.5}
                        on_press:
                            app.out_encrypt(Text.text, key.text) if key.text != "" else None

                    MDRoundFlatButton:
                        id: decrypt_bt
                        text: "Decrypt"
                        size_hint_x: 0.6
                        pos_hint: {'center_x': 0.5}
                        on_press:
                            app.out_decrypt(Text.text, key.text) if key.text != "" else None

        BoxLayout:
            orientation: 'horizontal'
            padding: [30, 10, 30, 20]
            spacing: 20
            size_hint_y: 0.25
            pos: self.pos


            Widget:
                canvas.before:
                    Color:
                        rgba: rgba('#bfff00')
                    Ellipse:
                        pos: self.pos
                        size: self.size
            Widget:
                canvas.before:
                    Color:
                        rgba: rgba('#8A2BE2')
                    Ellipse:
                        pos: self.pos
                        size: self.size
            Widget:

                canvas.before:
                    Color:
                        rgba: rgba('#00ffff')
                    Ellipse:
                        pos: self.pos
                        size: self.size

有任何想法吗 ?

标签: pythonreferencekivykivymd

解决方案


推荐阅读