将变量从.py传递到.kv文件

2024-09-26 22:52:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用python文件到.kv文件的变量 所以我搜索了类似的问题,找到了使用Property的方法,并编写了如下代码:

# 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)`

一个错误出现了。在

^{pr2}$

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)

Tags: pathfromposimportselfsizedeflabel
1条回答
网友
1楼 · 发布于 2024-09-26 22:52:42

这个问题有两种解决办法。请参考解决方案和示例了解详细信息。在

解决方案1:kv文件-使用If语句

解析kv文件时,abcdNone。添加if...else...语句来解决问题。在

代码段-kv文件

<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。在

代码片段-Python代码

^{pr2}$

示例

在主.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()

在试验电压在

#: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

输出

Img01

相关问题 更多 >

    热门问题