关于kivyMD基础的几个问题|为什么 init 中的函数调用两次?为什么我看不到我的按钮?|如何向按钮添加文本?

问题描述 投票:0回答:1

我正在学习 kivyMD 并创建简单的应用程序。我有很多奇怪的问题。

  1. 为什么我的屏幕是黑的并且看不到我的按钮?

  2. 如果我添加 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>
    
    
  3. 如何在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
kivy kivy-language kivymd
1个回答
0
投票

print
被调用两次,因为你的 kivy 文件
main.kv
被加载了两次。当您将应用程序命名为
SomethingApp
时,Kivy 会自动加载
something.kv
。因此,在您的情况下,
main.kv
会自动加载。

您有两种选择来解决您的问题:

  1. 重命名您的应用程序:
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()
  1. 请勿显式加载
    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"
© www.soinside.com 2019 - 2024. All rights reserved.