python - 在 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
有任何想法吗 ?
解决方案
推荐阅读
- amazon-web-services - 使用 amazon sagemaker python SDK 与 AWS SDK for python (Boto3) 有什么区别
- python - 停止 Pycharm 中的所有进程
- python - 从数据中获取日期格式
- javascript - 从生成的时隙中识别预定的时隙和维护时间并生成新的时隙
- pandas - SyntaxError: 'return' 与生成器内的参数
- c++ - 将指针转换为指针引用会导致未定义的行为吗?
- java - 从 Azure IoT 接收文件上传通知时出错
- c - 如何为此内联汇编代码编写内部代码?
- python - 如何将具有不同数据类型的对象存储到 Python 中的数组中?
- django - 如何从数据库中获取数据并在表单中显示以更新内容