如何在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
,那么我会给出空的@987654328@
如果您创建了self.Encrypt = Encrypt()
,那么您不必创建obj = Encrypt()
- 您可以使用self.Encrypt.encrypt(Text, key)
而不是obj.encrypt(Text, key)
还有其他建议:将lower_case_names
用于变量(即self.encrypt
而不是self.Encrypt
或text
而不是Text
)和CamelCaseNames
仅用于类,因为它有助于识别代码中的类.一些 IDE 甚至可能为 CamelCaseNames
使用特殊颜色以更简单地识别代码中的类。
在PEP 8 -- Style Guide for Python Code中查看更多信息
函数encrypt
和decrypt
几乎相同——唯一的区别是+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 中的“未解析的引用‘消息’”?
如何在我的 schema.graphql 文件中为按 id 过滤的查询引用生成的 Prisma 模式