Реализация кода, который вам требуется:
from kivy.config import Config
from kivy.core.window import Window
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.graphics import Rectangle, Color
mainscreen = BoxLayout(orientation='vertical')
label1 = Label(text='label_1', font_size=18, color=(0, 0, 0, 1), size_hint=(None, None))
label1.bind(texture_size=label1.setter('size'))
def update_rect(instance, *args):
rect.pos = instance.pos
rect.size = instance.size
with label1.canvas.before:
Color(1, .5, 0, 1)
rect = Rectangle(pos=label1.pos, size=label1.size)
label1.bind(pos=update_rect, size=update_rect)
label2 = Label(text='label_2', color=(0, 0, 0, 1))
mainscreen.add_widget(label1)
mainscreen.add_widget(label2)
class MyApp(App):
def build(self):
return mainscreen
if __name__ == '__main__':
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
Window.clearcolor = (1, 1, 1, 1)
MyApp().run()
ИМХО реализация в kv более читаема и более гибка, когда выполняется связывание, как в случае метки, которая соответствует размеру. [1113 ]
from kivy.config import Config
from kivy.core.window import Window
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.graphics import Rectangle, Color
from kivy.properties import ListProperty
class CustomLabel(Label):
bgcolor = ListProperty([0, 0, 0, 1])
def __init__(self, **kwargs):
if kwargs.get('bgcolor'):
self.bgcolor = kwargs['bgcolor']
kwargs.pop('bgcolor')
super(CustomLabel, self).__init__(**kwargs)
self.bind(texture_size=self.setter('size'))
with self.canvas.before:
self.p = Color(*self.bgcolor)
self.rect = Rectangle(pos=self.pos, size=self.size)
self.on_bgcolor()
self.bind(pos=self.geometry_bind, size=self.geometry_bind)
def on_bgcolor(self, *args):
self.p.rgba = self.bgcolor
def geometry_bind(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
class MyApp(App):
def build(self):
mainscreen = BoxLayout(orientation='vertical')
label1 = CustomLabel(text='label_1', font_size=18, color=(0, 0, 0, 1), size_hint=(None, None), bgcolor=(1, .5, 0, 1))
label2 = Label(text='label_2', color=(0, 0, 0, 1))
mainscreen.add_widget(label1)
mainscreen.add_widget(label2)
return mainscreen
if __name__ == '__main__':
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
Window.clearcolor = (1, 1, 1, 1)
MyApp().run()
Объяснение:
bind
: функция bind(foo_property = callback)
отвечает за вызов обратного вызова когда изменяется foo_property.
setter
: функция setter('foo_property')
генерирует обратный вызов, который позволяет вам установить значение.
Если вы присоединитесь к обеим функциям:
class FooClass(Foo_EventDispatcher):
property_a = FooProperty(initial_value_a)
property_b = FooProperty(initial_value_b)
def __init__(self, **kwargs):
super(FooClass, self).__init__(**kwargs)
self.bind(property_a=self.setter('property_b'))
эквивалентно следующей инструкции в .kv:
:
property_b: self.property_a
Я также рекомендовал бы сезам, его легкий вес, довольно легкий устанавливать, и обеспечиваю хорошую производительность для небольших наборов данных. Производительность запросов намного лучше с Сезамом 1.2.x, чем Сезам 2.x из-за добавления поддержки контекста 2.x ряд.
Я протестировал установку/развертывание сезама с котом, смолой и причалом, и это работало легко со всеми ними. Я не рекомендую привязку к компонентам RDBMS, таким как Пост-ГРЭС или MySQL, по крайней мере, в 1.x ряд, производительность не была приемлема, даже для опытных приложений. И собственные реализации в оперативной памяти обеспечивают хорошую производительность запросов и предлагают простую персистентность, хотя они испытывают недостаток в истинных транзакциях.
Йена имеет достойный API и намного больше поддержки баз данных, reasoners, и т.д., но имеет большее место и является немного более громоздкой для использования в целом.
Я был впечатлен ARC2 как предложение PHP/MySQL. Веб-сайт проекта имеет полезное "Начало работы" разбудить Вас и выполнение быстро, и вопросы/проблемы обращены быстро в списке рассылки. В зависимости от того, что Вы пытаетесь сделать, SPARQLscript, дополнение мини-языка к ARC2 для обработки результатов запроса может быть очень полезным.
Проверьте Библиотеку Семантической паутины SWI-пролога. Должно быть очень простым в использовании, даже с небольшим знанием Пролога.
Мы используем сезам. Это реализовано в Java поэтому, у Вас будет межплатформенная поддержка. Если Вы - удобная работа с Tomcat, должно быть довольно легко установить.
Если вы разработчик .NET, вас может заинтересовать Intellidimensions Semantic SDK . Если вы хотите загрузить график в память, а затем выполнить запросы SPARQL к этому графику, код будет таким же простым, как:
var gds = new GraphDataSource();
gds.Read<RdfXmlReader>(File.ReadAllText(@"C:\graph.owl"));
Table results = gds.Query("select ?s ?p ?o where {?s ?p ?o} limit 10");
Если вы студент или исследователь, они обычно предоставляют бесплатную лицензию, если вы связываетесь с ними.
Увеличение версии сборки (GPL) дает вам (почти) все необходимое для управления версией ваших сборок.
Некоторые функции (скопированы с сайта):
Если вы знакомы с Ruby, с библиотекой RDF.rb можно очень быстро начать работу; установка через RubyGems так же проста, как:
$ sudo gem install rdf
В дополнение к работе с данными RDF в памяти, доступные в настоящее время адаптеры хранилища RDF.rb включают SQLite, PostgreSQL, MongoDB, Cassandra, RedStore и Sesame.
Загрузка и анализ данных RDF из Интернета также не может быть проще:
graph = RDF::Graph.load("http://datagraph.org/jhacker/foaf.rdf")
См. Страницу проекта RDF.rb для учебных пособий, примеров кода и документации по API.