Kivy理解

Har*_*vic 6 python kivy

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

1.如何将我的自定义窗口小部件类添加到kv文件中的root?(示例)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:
Run Code Online (Sandbox Code Playgroud)

如何HelloWorldForm使用add_widget方法添加widget类

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

main.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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

3.如何在python中访问kvlang属性?例如,我想从按钮中获取文本.我怎样才能做到这一点?

小智 7

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

我建议在你的python代码中添加:

class MainApp(App):
    def build(self):
            self.helloworldform = HelloWorldForm()
            self.mainform = MainForm()
            return self.mainform
Run Code Online (Sandbox Code Playgroud)

在你的kv替换root.add_widget(HelloWorldForm)为root.add_widget(app.helloworldform) 这将添加你在构建函数中定义的HelloWorldForm的实例.

  1. 这与第一个问题相关,您现在可以通过对构建函数中保存的helloworldform和mainform的引用访问clear_widgets和add_widget函数:

    self.mainform.clear_widgets()
    self.mainform.add_widget(self.helloworldform)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 例如,要获取btnChangeForm的文本:

    self.mainform.btnOpenForm.text = 'This will change the text of the button.'
    
    Run Code Online (Sandbox Code Playgroud)

你做的很奇怪btnOpenForm: btnChangeForm.这将保存对btnChagneForm的引用,但name为btnOpenForm.为什么不让它们同名?btnChangeForm: btnChangeForm