bugfix
This commit is contained in:
parent
888461b834
commit
4c75d9f6a6
@ -545,13 +545,14 @@ class Blocks(EventDispatcher):
|
|||||||
if not isinstance(desc,dict):
|
if not isinstance(desc,dict):
|
||||||
Logger.info('Block: desc must be a dict object',
|
Logger.info('Block: desc must be a dict object',
|
||||||
desc,type(desc))
|
desc,type(desc))
|
||||||
raise Exception('desc must be a dict')
|
return None
|
||||||
|
|
||||||
desc = self.valueExpr(desc)
|
desc = self.valueExpr(desc)
|
||||||
widget = self.w_build(desc)
|
widget = self.w_build(desc)
|
||||||
self.dispatch('on_built',widget)
|
self.dispatch('on_built',widget)
|
||||||
if hasattr(widget,'ready'):
|
if hasattr(widget,'ready'):
|
||||||
widget.ready()
|
widget.ready()
|
||||||
|
return widget
|
||||||
|
|
||||||
if not (isinstance(desc, DictObject) or isinstance(desc, dict)):
|
if not (isinstance(desc, DictObject) or isinstance(desc, dict)):
|
||||||
print('Block: desc must be a dict object',
|
print('Block: desc must be a dict object',
|
||||||
@ -582,7 +583,7 @@ class Blocks(EventDispatcher):
|
|||||||
|
|
||||||
if addon:
|
if addon:
|
||||||
desc = dictExtend(desc,addon)
|
desc = dictExtend(desc,addon)
|
||||||
doit(desc)
|
return doit(desc)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def getWidgetById(self,id,from_widget=None):
|
def getWidgetById(self,id,from_widget=None):
|
||||||
|
@ -21,6 +21,7 @@ Config.set('kivy', 'default_font', [
|
|||||||
'DroidSansFallback.ttf'])
|
'DroidSansFallback.ttf'])
|
||||||
|
|
||||||
from kivy.app import App
|
from kivy.app import App
|
||||||
|
from kivy.utils import platform
|
||||||
from .threadcall import HttpClient,Workers
|
from .threadcall import HttpClient,Workers
|
||||||
from .utils import *
|
from .utils import *
|
||||||
from .pagescontainer import PageContainer
|
from .pagescontainer import PageContainer
|
||||||
@ -61,20 +62,6 @@ def signal_handler(signal, frame):
|
|||||||
|
|
||||||
signal.signal(signal.SIGINT, signal_handler)
|
signal.signal(signal.SIGINT, signal_handler)
|
||||||
|
|
||||||
def on_close(*args,**kwargs):
|
|
||||||
"""
|
|
||||||
catch the "x" button's event of window
|
|
||||||
"""
|
|
||||||
Logger.info('kivyblocks: on_close(), args=%s, kwargs=%s',str(args),str(kwargs))
|
|
||||||
app = App.get_running_app()
|
|
||||||
if len(app.root.pageWidgets) <= 1:
|
|
||||||
app.workers.running = False
|
|
||||||
Logger.info('kivyblocks: on_close(), return False')
|
|
||||||
return False
|
|
||||||
app.root.previous()
|
|
||||||
Logger.info('kivyblocks: on_close(), return True')
|
|
||||||
return True
|
|
||||||
|
|
||||||
def getAuthHeader():
|
def getAuthHeader():
|
||||||
app = App.get_running_app()
|
app = App.get_running_app()
|
||||||
if not hasattr(app,'serverinfo'):
|
if not hasattr(app,'serverinfo'):
|
||||||
@ -88,39 +75,35 @@ def getAuthHeader():
|
|||||||
print('serverinfo authCode not found')
|
print('serverinfo authCode not found')
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def closeWorkers():
|
|
||||||
app = App.get_running_app()
|
|
||||||
app.workers.running = False
|
|
||||||
|
|
||||||
def appBlocksHack(app):
|
|
||||||
config = getConfig()
|
|
||||||
# app.on_close = on_close
|
|
||||||
app.getAuthHeader = getAuthHeader
|
|
||||||
app.__del__ = closeWorkers
|
|
||||||
Window.bind(on_request_close=app.on_close)
|
|
||||||
app.serverinfo = ServerInfo()
|
|
||||||
app.title = 'Test Title'
|
|
||||||
app.blocks = Blocks()
|
|
||||||
app.workers = Workers(maxworkers=config.maxworkers or 80)
|
|
||||||
app.workers.start()
|
|
||||||
app.hc = HttpClient()
|
|
||||||
WindowBase.softinput_mode='below_target'
|
|
||||||
|
|
||||||
class BlocksApp(App):
|
class BlocksApp(App):
|
||||||
def build(self):
|
def build(self):
|
||||||
appBlocksHack(self)
|
|
||||||
root = PageContainer()
|
|
||||||
x = None
|
|
||||||
config = getConfig()
|
config = getConfig()
|
||||||
blocks = Factory.Blocks()
|
self.public_headers = {}
|
||||||
blocks.bind(on_built=self.addTopWidget)
|
Window.bind(on_request_close=self.on_close)
|
||||||
blocks.bind(on_error=self.showError)
|
Window.bind(size=self.device_info)
|
||||||
blocks.widgetBuild(config.root)
|
self.workers = Workers(maxworkers=config.maxworkers or 80)
|
||||||
return root
|
self.workers.start()
|
||||||
|
self.running = True
|
||||||
def addTopWidget(self,o,w):
|
blocks = Blocks()
|
||||||
self.root.add_widget(w)
|
print(config.root)
|
||||||
|
x = blocks.widgetBuild(config.root)
|
||||||
def showError(self,o,e):
|
if x is None:
|
||||||
alert(str(self.config.root)+': cannt build widget')
|
alert('buildError,Exit', title='Error')
|
||||||
|
self.on_close()
|
||||||
|
return x
|
||||||
|
|
||||||
|
def device_info(self, *args):
|
||||||
|
d = {
|
||||||
|
"platform":platform,
|
||||||
|
"width":Window.width,
|
||||||
|
"height":Window.height
|
||||||
|
}
|
||||||
|
device = {
|
||||||
|
"device_info":";".join([f'{k}={v}' for k,v in d.items()])
|
||||||
|
}
|
||||||
|
self.public_headers.update(device)
|
||||||
|
|
||||||
|
def on_close(self, *args):
|
||||||
|
self.workers.running = False
|
||||||
|
return False
|
||||||
|
|
||||||
|
102
kivyblocks/chart2d.py
Normal file
102
kivyblocks/chart2d.py
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
from kivyblocks.graph import *
|
||||||
|
from kivy.utils import get_color_from_hex as rgb
|
||||||
|
from .threadcall import HttpClient
|
||||||
|
|
||||||
|
class Chart2d(Graph):
|
||||||
|
"""
|
||||||
|
json format:
|
||||||
|
{
|
||||||
|
"widgettype":"Chart2d",
|
||||||
|
"options":{
|
||||||
|
"xlabel":"Xlabel",
|
||||||
|
"ylable":"Ylabel",
|
||||||
|
"x_ticks_minor":1,
|
||||||
|
"x_ticks_major":5,
|
||||||
|
"y_ticks_minor":1,
|
||||||
|
"y_ticks_major":5,
|
||||||
|
"x_grid_label":true,
|
||||||
|
"y_grid_label":true,
|
||||||
|
"padding":5,
|
||||||
|
"xlog":false,
|
||||||
|
"ylog":false,
|
||||||
|
"x_grid":true,
|
||||||
|
"y_grid":true,
|
||||||
|
"xmin":0,
|
||||||
|
"xmax":100,
|
||||||
|
"ymax":100,
|
||||||
|
"ymin":1,
|
||||||
|
"x_field":"xxx",
|
||||||
|
"dataurl":"xxx",
|
||||||
|
"charts":[
|
||||||
|
{
|
||||||
|
"y_field":"yy",
|
||||||
|
"color":"efefef",
|
||||||
|
"charttype":"LinePlot"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
plotmappings={
|
||||||
|
"line":LinePlot,
|
||||||
|
"hbar":BarPlot
|
||||||
|
}
|
||||||
|
graph_theme = {
|
||||||
|
'label_options': {
|
||||||
|
'color': rgb('444444'), # color of tick labels and titles
|
||||||
|
'bold': True},
|
||||||
|
'background_color': rgb('f8f8f2'), # canvas background color
|
||||||
|
'tick_color': rgb('808080'), # ticks and grid
|
||||||
|
'border_color': rgb('808080') # border drawn around each graph
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, dataurl='',
|
||||||
|
data=None,
|
||||||
|
x_field='',
|
||||||
|
params={},
|
||||||
|
headers={},
|
||||||
|
charts=[],
|
||||||
|
**kw):
|
||||||
|
self._dataurl = dataurl
|
||||||
|
self._params = params
|
||||||
|
self._headers = {}
|
||||||
|
self.x_field = x_field
|
||||||
|
self._data = data
|
||||||
|
if not self._data:
|
||||||
|
self._data = self.get_data()
|
||||||
|
xmax = len(data)
|
||||||
|
ymax = 0
|
||||||
|
xvalues = [ self._data[i][self.x_field] for i in range(xmax) ]
|
||||||
|
self._charts = charts
|
||||||
|
plots = []
|
||||||
|
for c in charts:
|
||||||
|
plotKlass = self.plotmappings.get('charttype')
|
||||||
|
if not plot:
|
||||||
|
continue
|
||||||
|
yvalue = [self._data[i][c['y_field']] for i in range(xmax)]
|
||||||
|
color = rgb(c.get('color','d8d8d8'))
|
||||||
|
plot = plotKlass(color=color)
|
||||||
|
plot.points = [(xvalue[i],yvalue[i]) for i in range(xmax)]
|
||||||
|
plots.append(plot)
|
||||||
|
maxv = max(yvalue)
|
||||||
|
if ymax < maxv:
|
||||||
|
ymax = maxv
|
||||||
|
|
||||||
|
gkw = kw.copy()
|
||||||
|
gkw['ymax'] = ymax
|
||||||
|
gkw['xmax'] = xmax
|
||||||
|
Graph.__init__(self, **kw)
|
||||||
|
self.ymax = ymax
|
||||||
|
|
||||||
|
for p in plots:
|
||||||
|
self.add_plot(p)
|
||||||
|
p.bind_to_graph(self)
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
hc = HttpClient()
|
||||||
|
d = hc.get(self._dataurl,
|
||||||
|
params=self._params,
|
||||||
|
headers=self._headers)
|
||||||
|
return d
|
||||||
|
|
@ -20,8 +20,10 @@ from .graph import Graph, MeshLinePlot, MeshStemPlot, LinePlot, \
|
|||||||
SmoothLinePlot, ContourPlot, BarPlot, HBar, VBar, ScatterPlot, \
|
SmoothLinePlot, ContourPlot, BarPlot, HBar, VBar, ScatterPlot, \
|
||||||
PointPlot
|
PointPlot
|
||||||
from .mapview import MapView
|
from .mapview import MapView
|
||||||
|
from .chart2d import Chart2d
|
||||||
|
|
||||||
r = Factory.register
|
r = Factory.register
|
||||||
|
r('Chart2d', Chart2d)
|
||||||
r('Popup', Popup)
|
r('Popup', Popup)
|
||||||
r('Graph', Graph)
|
r('Graph', Graph)
|
||||||
r('MeshLinePlot', MeshLinePlot)
|
r('MeshLinePlot', MeshLinePlot)
|
||||||
|
Loading…
Reference in New Issue
Block a user