)
我正在学习 kivyMD 并创建简单的应用程序。我有很多奇怪的问题。
为什么我的屏幕是黑的并且看不到我的按钮?
如果我添加 2 个或更多按钮(查看代码中的注释),我会看到错误:
kivy.uix.widget.WidgetException: Cannot add <kivymd.uix.button.button.MDButton object at 0x00000202D8648E40>, it already has a parent <kivymd.uix.boxlayout.MDBoxLayout object at 0x00000202D86420B0>
如何在py中设置按钮文本?
self.button = MDButton(style="filled",text='btn')
不起作用。文档讲述了如何在 kivy 文件中实现它。
4.当我尝试调试时,我注意到我的 init 调用了两次。为什么?我完全不知道。
你能给我解释一下这些基本的事情吗?
main.py 中是:
#kivy=2.3.0
#kivymd=2.0.1
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDButton
from kivymd.uix.screen import MDScreen
from kivymd.uix.screenmanager import MDScreenManager
class ExampleScreen(MDScreen):
def __init__(self,**kwargs):
print(1)
super(ExampleScreen, self).__init__(**kwargs)
# ADDING STRUCTURAL ELEMENTS
self.window = MDBoxLayout()
self.button = MDButton(style="filled")
self.window.add_widget(self.button)
#self.window.add_widget(self.button) unhash on 2 point
#self.window.add_widget(self.button) unhash on 2 point
class Screen_Menager(MDScreenManager):
pass
class MainApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Green"
return Builder.load_file('main.kv')
MainApp().run()
我的kv。文件很简单:main.kv:
Screen_Menager:
ExampleScreen:
我的输出是:
INFO ] [Logger ] Record log in C:\Users\Marek\.kivy\logs\kivy_24-01-26_64.txt
[INFO ] [deps ] Successfully imported "kivy_deps.angle" 0.4.0
[INFO ] [deps ] Successfully imported "kivy_deps.glew" 0.3.1
[INFO ] [deps ] Successfully imported "kivy_deps.sdl2" 0.7.0
[INFO ] [Kivy ] v2.3.0
[INFO ] [Kivy ] Installed at "D:\pulpit\programowanie\Nice2meetU\lib\site-packages\kivy\__init__.py"
[INFO ] [Python ] v3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)]
[INFO ] [Python ] Interpreter at "D:\pulpit\programowanie\Nice2meetU\Scripts\python.exe"
[INFO ] [Logger ] Purge log fired. Processing...
[INFO ] [Logger ] Purge finished!
[INFO ] [Factory ] 195 symbols loaded
[INFO ] [KivyMD ] 2.0.1.dev0, git-Unknown, 2024-01-26 (installed at "D:\pulpit\programowanie\Nice2meetU\lib\site-packages\kivymd\__init__.py")
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: pil(['text_sdl2'] 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.6.0 - Build 31.0.101.2114'>
[INFO ] [GL ] OpenGL vendor <b'Intel'>
[INFO ] [GL ] OpenGL renderer <b'Intel(R) UHD Graphics 630'>
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version <b'4.60 - Build 31.0.101.2114'>
[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 ] [Clipboard ] Provider: winctypes
[INFO ] [GL ] NPOT texture support is available
1
1
[INFO ] [Base ] Start application main loop
[INFO ] [KivyMD ] Color scheme generation. Get a color scheme from an installed palette - 0.006442700000000023 sec.
[INFO ] [Base ] Leaving application in progress...
Process finished with exit code 0
print
被调用两次,因为你的 kivy 文件 main.kv
被加载了两次。当您将应用程序命名为 SomethingApp
时,Kivy 会自动加载 something.kv
。因此,在您的情况下,main.kv
会自动加载。
您有两种选择来解决您的问题:
class MyApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Green"
return Builder.load_file('main.kv')
MyApp().run()
main.kv
:class MainApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
self.theme_cls.primary_palette = "Green"
MainApp().run()
编辑:抱歉我忽略了回答你的其他问题。您永远不会将
self.window
(顺便说一句,命名不好的布局)添加到您的 ExampleScreen
中。您应该用 self.add_widget(self.window)
添加它。同样,MDButtonText 可以添加到 MDButton(请参阅 help):
class ExampleScreen(MDScreen):
def __init__(self,**kwargs):
print(1)
super(ExampleScreen, self).__init__(**kwargs)
# ADDING STRUCTURAL ELEMENTS
self.window = MDBoxLayout()
self.button = MDButton(style="filled")
self.button.add_widget(MDButtonText(text='btn text'))
self.window.add_widget(self.button)
self.add_widget(self.window)
我个人更喜欢直接在 .kv 文件中声明结构元素(在这种情况下按钮的宽度更适合):
Screen_Menager:
ExampleScreen:
MDBoxLayout:
MDButton:
style: "filled"
MDButtonText:
text: "btn text"