如何在py文件中引用这个id
How to reference this id in py file
如何在 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'
坦率地说,有时我不明白为什么 ids
有效或无效。
在您的代码中有效
self.root.get_screen("Caesar_Screen").ids.output.text
没有.ids.screen_manager
顺便说一句:
您不需要 sm = ScreenManager()
和 sm.add_widget(...)
,因为它会创建从未使用过的第二个屏幕管理器。如果我使用 sm.get_screen("Caesar_Screen").ids
然后我给空 {}
如果您创建了 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()
如何在 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'
坦率地说,有时我不明白为什么 ids
有效或无效。
在您的代码中有效
self.root.get_screen("Caesar_Screen").ids.output.text
没有.ids.screen_manager
顺便说一句:
您不需要 sm = ScreenManager()
和 sm.add_widget(...)
,因为它会创建从未使用过的第二个屏幕管理器。如果我使用 sm.get_screen("Caesar_Screen").ids
然后我给空 {}
如果您创建了 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()