m0f*_*1us 1 python kivy kivy-language
我正在尝试使用从 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)`
Run Code Online (Sandbox Code Playgroud)
并出现错误。
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)
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这个问题有两种解决方案。详情请参阅解决方案和示例。
变量,abcd是None当KV文件进行解析。添加if...else...语句来解决问题。
<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
Run Code Online (Sandbox Code Playgroud)
abcd在build()方法中初始化变量。
class TestApp(App):
abcd = StringProperty('')
def build(self):
self.abcd = 'test'
return ScreenManagement()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
#: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
Run Code Online (Sandbox Code Playgroud)