我是使用Kivy GUI框架的新手,并且有几个与kvlang相关的问题:

1.如何将自定义窗口小部件类添加到kv文件的根目录中?(示例)
PS:我在这里使用clear_widgets(),然后尝试添加自定义小部件,但单击按钮后出现错误。

#:kivy 1.8

<HelloWorldForm@BoxLayout>:
    orientation: "vertical"
    Label:
        text:"Hello world"
    Button:
        text: "Go back"
        on_press: app.formGoBack()


<MainForm@BoxLayout>:
    orientation: "vertical"
    btnOpenForm: btnChangeForm
    BoxLayout:
        size_hint_y:None
        height:"40dp"
        Button:
            id:btnChangeForm
            text:"Go to hello world form"
            on_press:
                root.clear_widgets()
                root.add_widget(HelloWorldForm)
        Button:
            id:btnExit
            text:"Exit"
            on_press: app.Exit()


MainForm:

如何使用HelloWorldForm方法添加add_widget小部件类

2.如何在python代码中使用add_widgetclear_widgets方法?(例如)

主.kv
   <MainForm@BoxLayout>:
        orientation: "vertical"
        btnOpenForm: btnChangeForm
        BoxLayout:
            size_hint_y:None
            height:"40dp"
            Button:
                id:btnChangeForm
                text:"Go to hello world form"
                on_press: app.changeForm()

main.py
#!/usr/bin/python3.4


import kivy

kivy.require('1.8.0')

from kivy.app import App
from kivy.uix import *


class MainApp(App):
    def changeForm(self)
    /**
     TO-DO
    **/




app=MainApp()
app.run()

3.如何在python中访问kvlang属性?例如,我想从按钮中获取文本。我该如何实现?

最佳答案

  • 问题出在这一行:root.add_widget(HelloWorldForm)。您要添加一个类而不是一个类实例。特别是,您可能希望每次调用时都添加相同的实例,而不是创建一个新实例,因此您应该而不是root.add_widget(HelloWorldForm())

  • 我建议在您的python代码中添加:
    class MainApp(App):
        def build(self):
                self.helloworldform = HelloWorldForm()
                self.mainform = MainForm()
                return self.mainform
    

    并在您的kv中用root.add_widget(HelloWorldForm)替换root.add_widget(app.helloworldform)这将添加您在构建函数中定义的HelloWorldForm实例。
  • 这关系到第一个问题,您现在可以通过引用保存在build函数中的helloworldform和mainform来访问clear_widgets和add_widget函数:
    self.mainform.clear_widgets()
    self.mainform.add_widget(self.helloworldform)
    
  • 例如,获取btnChangeForm的文本:
    self.mainform.btnOpenForm.text = 'This will change the text of the button.'
    

  • 您执行btnOpenForm: btnChangeForm很奇怪。这将保存对btnChagneForm的引用,但名称为btnOpenForm。为什么不使用相同的名称? btnChangeForm: btnChangeForm

    关于python - 奇异的理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25844093/

    10-12 22:02