本文介绍了将变量从.py传递到.kv文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用从python文件到.kv文件的变量所以我搜索了类似的问题,并找到了使用Property的方式,并进行了如下编码:

I am trying to use variables from python file to .kv file so I searched similar questions and found out the way use Property and coded like this:

# in python file
class Test2App(App):
    abcd = StringProperty('test')
    def build(self):
        return presentation

# in kv file
<MyButton@Button>:
    text: "contents (%s)"%(app.abcd)

    background_color: (255, 255, 255,1)`

出现错误.

 AttributeError: 'NoneType' object has no attribute 'bind'
   File "/usr/local/lib/python2.7/dist-packages/kivy/lang/builder.py", line 249, in create_handler
     return eval(value, idmap), bound_list
   File "/root/Desktop/hi/t2.kv", line 61, in <module>
     text: "contents (%s)"%(app.abcd)
   File "/usr/local/lib/python2.7/dist-packages/kivy/lang/parser.py", line 75, in __getattribute__
     object.__getattribute__(self, '_ensure_app')()
   File "/usr/local/lib/python2.7/dist-packages/kivy/lang/parser.py", line 70, in _ensure_app
     app.bind(on_stop=lambda instance:

   File "/usr/local/lib/python2.7/dist-packages/kivy/lang/builder.py", line 615, in _apply_rule
     rctx['ids'])
   File "/usr/local/lib/python2.7/dist-packages/kivy/lang/builder.py", line 254, in create_handler
     cause=tb)

t2.py

#-*- coding: utf-8 -*-
__version__ = "1.0"

import kivy
import os
kivy.require('1.10.0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.clock import Clock
from kivy.properties import StringProperty
#from kivy.config import Config #windows size fixed
#Config.set('graphics', 'resizable', 0)
from kivy.core.window import Window 
Window.size = (540, 960)
#Window.size = (1080, 1920) 
##########FOR BUS INFORMATION UPDATE#############
from urllib import urlencode, quote_plus
from urllib2 import Request as RQ
from urllib2 import urlopen as UO
import urllib
import xml.etree.ElementTree as etree
import os
import datetime


def oopath(ndid, uor):
    path = os.path.join(ndid + '.txt')
    return path

##############################################################################################################

class StationTest(Screen):

    def __init__(self, **kwargs):
        super(StationTest, self).__init__(**kwargs)

    oo = oopath('TESTTEST', 0) 
    self.rpandgv(oo)

    def rpandgv(self,path): 
    with open(path) as businfo:
        Businfo= [] 
        nolinenum=businfo.readline()
        while nolinenum!='': 
        Businfo.append(nolinenum)
        leftstations = (businfo.readline().rstrip('\n') + ' stations'.rstrip('\n'))
        lefttime = (businfo.readline().rstrip('\n') + ' seconds'.rstrip('\n'))
        nolinenum = businfo.readline().rstrip('\n')
        Businfo.append(leftstations)
        Businfo.append(lefttime)
        self.businfolist = Businfo
        self.lenbil = int(len(Businfo))
        self.numberoflist = int(len(Businfo)/3)




class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("t2.kv")

class Test2App(App):
    abcd = StringProperty('test')
    def build(self):
        return presentation


Test2App().run()

t2.kv

# -*- coding: utf-8 -*-
#:import NoTransition kivy.uix.screenmanager.NoTransition
#:import SlideTransition kivy.uix.screenmanager.SlideTransition
#:import Label kivy.uix.button.Label

ScreenManagement:
    transition: SlideTransition(direction='left')
    StationTest:

<StationTest>: 
    name: 'StationTest'
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size 
            source: 'image/background.png' #backgroundimage
    header: _header
    ScrollView:
        FloatLayout:
            size_hint_y: None
            height: 500
            BoxLayout:
                id: _header
                orientation: 'vertical'
                size_hint: 1, 0.10
                pos_hint: {'top': 1.0}
                anchor: _anchor
                canvas:
                    Color:              
                        rgba: 0.8, 0.6, 0.4, 1.0
                    Rectangle:
                        pos: self.pos
                        size: self.size
                Label:
                    text: "STATION > STATION"
                    font_size: 40
                BoxLayout
                    id: _anchor
                    size_hint_y: 0.3
                    canvas.before:
                        Color:              
                            rgba: 0.3, 0.5, 0.8, 1.0
                        Rectangle:
                            pos: self.pos
                            size: self.size
                    Label:
                        text: "TEST1234"

            BoxLayout:
                orientation: 'vertical'
                size_hint: 1, 0.35
                padding: 0, -200, 0, 0
                MyButton:
                MyButton:
                MyButton:
                MyButton:



<MyButton@Button>:
    text: "contents (%s)"%(app.abcd)

    background_color: (255, 255, 255,1)

推荐答案

有两个解决方案.有关详细信息,请参阅解决方案和示例.

There are two solutions to this problem. Please refer to the solutions and example for details.

在解析kv文件时,变量abcdNone.添加if...else...语句以解决该问题.

The variable, abcd is None when the kv file is parsed. Add if...else... statement to solve the problem.

<MyButton@Button>:
    text: "" if app.abcd is None else "contents (%s)"%(app.abcd)

    background_color: (255, 255, 255,1)    # white background color
    color: 0, 0, 0, 1    # black color text

解决方案2:Python代码-在build()方法中初始化

build()方法中初始化变量abcd.

Solution 2: Python code - Initialize in build() method

Initialize variable, abcd in the build() method.

class TestApp(App):
    abcd = StringProperty('')

    def build(self):
        self.abcd = 'test'
        return ScreenManagement()

示例

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty


class StationTest(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class TestApp(App):
    abcd = StringProperty('test')

    def build(self):
        return ScreenManagement()


TestApp().run()

test.kv

#:kivy 1.11.0
#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<ScreenManagement>:
    transition: SlideTransition(direction='left')
    StationTest:

<StationTest>:
    name: 'StationTest'
    BoxLayout:
        orientation: 'vertical'
        size_hint: 1, 0.35
        padding: 0, -200, 0, 0
        MyButton:
        MyButton:
        MyButton:
        MyButton:



<MyButton@Button>:
    # text: "" if app.abcd is None else "contents (%s)"%(app.abcd)
    text: "contents (%s)"%(app.abcd)

    background_color: (1, 1, 1, 1)    # white background
    color: 0, 0, 0, 1    # black color text

输出

这篇关于将变量从.py传递到.kv文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 20:49