This commit is contained in:
yumoqing 2021-01-20 14:10:00 +08:00
parent 888461b834
commit 4c75d9f6a6
4 changed files with 136 additions and 48 deletions

View File

@ -545,13 +545,14 @@ class Blocks(EventDispatcher):
if not isinstance(desc,dict):
Logger.info('Block: desc must be a dict object',
desc,type(desc))
raise Exception('desc must be a dict')
return None
desc = self.valueExpr(desc)
widget = self.w_build(desc)
self.dispatch('on_built',widget)
if hasattr(widget,'ready'):
widget.ready()
return widget
if not (isinstance(desc, DictObject) or isinstance(desc, dict)):
print('Block: desc must be a dict object',
@ -582,7 +583,7 @@ class Blocks(EventDispatcher):
if addon:
desc = dictExtend(desc,addon)
doit(desc)
return doit(desc)
@classmethod
def getWidgetById(self,id,from_widget=None):

View File

@ -21,6 +21,7 @@ Config.set('kivy', 'default_font', [
'DroidSansFallback.ttf'])
from kivy.app import App
from kivy.utils import platform
from .threadcall import HttpClient,Workers
from .utils import *
from .pagescontainer import PageContainer
@ -61,20 +62,6 @@ def signal_handler(signal, frame):
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():
app = App.get_running_app()
if not hasattr(app,'serverinfo'):
@ -88,39 +75,35 @@ def getAuthHeader():
print('serverinfo authCode not found')
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):
def build(self):
appBlocksHack(self)
root = PageContainer()
x = None
config = getConfig()
blocks = Factory.Blocks()
blocks.bind(on_built=self.addTopWidget)
blocks.bind(on_error=self.showError)
blocks.widgetBuild(config.root)
return root
self.public_headers = {}
Window.bind(on_request_close=self.on_close)
Window.bind(size=self.device_info)
self.workers = Workers(maxworkers=config.maxworkers or 80)
self.workers.start()
self.running = True
blocks = Blocks()
print(config.root)
x = blocks.widgetBuild(config.root)
if x is None:
alert('buildError,Exit', title='Error')
self.on_close()
return x
def addTopWidget(self,o,w):
self.root.add_widget(w)
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 showError(self,o,e):
alert(str(self.config.root)+': cannt build widget')
def on_close(self, *args):
self.workers.running = False
return False

102
kivyblocks/chart2d.py Normal file
View 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

View File

@ -20,8 +20,10 @@ from .graph import Graph, MeshLinePlot, MeshStemPlot, LinePlot, \
SmoothLinePlot, ContourPlot, BarPlot, HBar, VBar, ScatterPlot, \
PointPlot
from .mapview import MapView
from .chart2d import Chart2d
r = Factory.register
r('Chart2d', Chart2d)
r('Popup', Popup)
r('Graph', Graph)
r('MeshLinePlot', MeshLinePlot)