本文介紹了將變量從 .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('
') + ' stations'.rstrip('
'))
lefttime = (businfo.readline().rstrip('
') + ' seconds'.rstrip('
'))
nolinenum = businfo.readline().rstrip('
')
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.
變量abcd
在解析kv文件時為None
.添加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
.
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 文件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!