如何在py文件中引用这个id

Posted

技术标签:

【中文标题】如何在py文件中引用这个id【英文标题】:How to reference this id in py file 【发布时间】:2021-07-25 11:48:54 【问题描述】:

如何在main.py 文件中引用id: output 以在标签上打印消息?

我试过了

self.root.ids.screen_manager.get_screen("Caesar_Screen").ids.output.text =“”

但我总是收到此错误

C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\Scripts\python.exe 

C:\Users\Samoo\PycharmProjects\CryptoMD2\main.py
[INFO   ] [Logger      ] Record log in C:\Users\Samoo\.kivy\logs\kivy_21-05-03_57.txt
[INFO   ] [deps        ] Successfully imported "kivy_deps.gstreamer" 0.3.2
[INFO   ] [deps        ] Successfully imported "kivy_deps.angle" 0.3.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.glew" 0.3.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2" 0.3.1
[INFO   ] [Kivy        ] v2.0.0
[INFO   ] [Kivy        ] Installed at "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\__init__.py"
[INFO   ] [Python      ] v3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)]
[INFO   ] [Python      ] Interpreter at "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\Scripts\python.exe"
[INFO   ] [KivyMD      ] v0.104.1
[INFO   ] [Factory     ] 186 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] GLEW initialization succeeded
[INFO   ] [GL          ] Backend used <glew>
[INFO   ] [GL          ] OpenGL version <b'4.3.0 - Build 20.19.15.5126'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 4600'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 3
[INFO   ] [GL          ] Shading version <b'4.30 - Build 20.19.15.5126'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [GL          ] NPOT texture support is available
[INFO   ] [Base        ] Start application main loop
B
[INFO   ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "kivy\properties.pyx", line 861, in kivy.properties.ObservableDict.__getattr__
 KeyError: 'screen_manager'
 
 During handling of the above exception, another exception occurred:
 
 Traceback (most recent call last):
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\main.py", line 46, in <module>
     CryptoMD().run()
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\app.py", line 950, in run
     runTouchApp()
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\base.py", line 582, in runTouchApp
     EventLoop.mainloop()
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\base.py", line 347, in mainloop
     self.idle()
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\base.py", line 391, in idle
     self.dispatch_input()
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\base.py", line 342, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\core\window\__init__.py", line 1412, in on_motion
     self.dispatch('on_touch_down', me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\core\window\__init__.py", line 1428, in on_touch_down
     if w.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\screenmanager.py", line 1198, in on_touch_down
     return super(ScreenManager, self).on_touch_down(touch)
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\relativelayout.py", line 297, in on_touch_down
     ret = super(RelativeLayout, self).on_touch_down(touch)
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\behaviors\button.py", line 138, in on_touch_down
     if super(ButtonBehavior, self).on_touch_down(touch):
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivymd\uix\behaviors\ripplebehavior.py", line 231, in on_touch_down
     return super().on_touch_down(touch)
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivymd\uix\button.py", line 961, in on_touch_down
     return super().on_touch_down(touch)
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
     self.dispatch('on_press')
   File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\cryptomd.kv", line 100, in <module>
     app.out_encrypt(Text.text, key.text) if key.text != "" else None
   File "C:\Users\Samoo\PycharmProjects\CryptoMD2\main.py", line 34, in out_encrypt
     self.root.ids.screen_manager.get_screen("Caesar_Screen").ids.output.text = out_encrypted
   File "kivy\properties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

在显示 [INFO] 的终端中。 离开应用程序之前的字母 B 是我要在标签上显示的消息。错误消息以

开头
 KeyError: 'screen_manager'
 During handling of the above exception, another exception occurred:

.py

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

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):
        obj = Encrypt()
        Text = Text.lower()
        key = key
        Key = int(key)
        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):
        obj = Encrypt()
        Text = Text.lower()
        key = key
        Key = int(key)
        out_decrypted = obj.decrypt(Text, key)
        self.root.ids.screen_manager.get_screen("Caesar_Screen").ids.output.text = out_encrypted


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()

#: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"

                    MDFillRoundFlatButton:
                        text: 'AES'
                        size: self.size
                        pos_hint: 'center_x': 0.9, 'center_y': 0.77
                        on_press: root.manager.current = 'Aes_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]
                    spacing: 3
                    orientation: 'vertical'

                    MDRoundFlatButton:
                        id: encrypt_bt
                        text: "Encrypt"
                        size: self.size
                        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: self.size
                        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_Screen"
    BoxLayout:
        orientation: 'vertical'

【问题讨论】:

总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。 什么类包含该行:self.root.ids.screen_manager.get_screen("Caesar_Screen").ids.output.text = out_encrypted? 显示更多代码。你在哪个地方运行它?我记得 Kivy 类可能会在运行 __init___ 后加载 kv,所以 __init__ 中的代码可能无法工作 - 它可能需要使用调度程序来运行代码,延迟很小。 为我工作:self.root.get_screen("Caesar_Screen").ids.output.text 没有 .ids.screen_manager 顺便说一句:代码在没有sm = ScreenManager()sm.add_widget(...) 的情况下也可以工作,因为它创建了第二个从未使用过的屏幕管理器。如果我使用sm.get_screen("Caesar_Screen").ids,那么我会得到空 【参考方案1】:

坦率地说,有时我不明白为什么ids 有效。

在你的代码中工作

 self.root.get_screen("Caesar_Screen").ids.output.text 

没有.ids.screen_manager


顺便说一句:

您不需要sm = ScreenManager()sm.add_widget(...),因为它会创建第二个从未使用过的屏幕管理器。如果我使用sm.get_screen("Caesar_Screen").ids,那么我会给出空的@9​​87654328@

如果您创建了self.Encrypt = Encrypt(),那么您不必创建obj = Encrypt() - 您可以使用self.Encrypt.encrypt(Text, key) 而不是obj.encrypt(Text, key)

还有其他建议:将lower_case_names 用于变量(即self.encrypt 而不是self.Encrypttext 而不是Text)和CamelCaseNames 仅用于类,因为它有助于识别代码中的类.一些 IDE 甚至可能为 CamelCaseNames 使用特殊颜色以更简单地识别代码中的类。

在PEP 8 -- Style Guide for Python Code中查看更多信息

函数encryptdecrypt 几乎相同——唯一的区别是+key-key——因此您可以创建一个函数并使用+key-key 运行它


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

alphabet = string.ascii_lowercase


class Caesar_Screen(Screen):
    pass

class Aes_Screen(Screen):
    pass


class CryptoMD(MDApp):

    def __init__(self, **kwargs):
        self.encrypt = Encrypt()   # PEP8: `CamelCaseNames` for classes, but `loser_case_names` for variables
        self.title = 'Crypto'
        self.theme_cls.primary_palette = "Purple"
        super().__init__(**kwargs)

    def out_encrypt(self, text, key):
        out_encrypted = self.encrypt.encrypt(text, key)
        self.root.get_screen("Caesar_Screen").ids.output.text = out_encrypted
 
    def out_decrypt(self, text, key):
        out_encrypted = self.encrypt.decrypt(text, key)
        self.root.get_screen("Caesar_Screen").ids.output.text = out_encrypted


class Encrypt():

    def encrypt(self, text, key):
        return self.convert(text,  int(key))

    def decrypt(self, text, key):  # PEP8: `lower_case_names` for variables
        return self.convert(text, -int(key))

    def convert(self, text, key):
        text = text.lower()
        key = int(key)
        
        encrypted_message = ""

        for char in text:
            if char in alphabet:
                position = alphabet.find(char)
                new_position = (position + key) % 26
                new_character = alphabet[new_position]
                encrypted_message += new_character
            else:
                encrypted_message += char

        print(encrypted_message.upper())
        
        return encrypted_message.upper()

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

【讨论】:

以上是关于如何在py文件中引用这个id的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 discord.py 中的“未解析的引用‘消息’”?

求助一下,python如何调用另一个py文件

python如何导入自定义模块

如何在我的 schema.graphql 文件中为按 id 过滤的查询引用生成的 Prisma 模式

如何从我的 html 表单获取 post id 到 views.py

在 web2py 中复制记录及其引用