Skip to content

Commit

Permalink
Canvas updates #296
Browse files Browse the repository at this point in the history
Updated scale #323
New features for canvases #296

Snow example, showing canvas in action.
  • Loading branch information
jarvisteach committed Dec 21, 2017
1 parent 6fe3d69 commit cdb2214
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 6 deletions.
61 changes: 55 additions & 6 deletions appJar/appjar.py
Original file line number Diff line number Diff line change
Expand Up @@ -4673,8 +4673,9 @@ def slider(self, title, value=None, *args, **kwargs):
return self.scale(title, value, *args, **kwargs)

def scale(self, title, value=None, *args, **kwargs):
widgKind = self.Widgets.Scale
""" adds, sets & gets scales all in one go """
try: self.widgetManager.verify(self.Widgets.Scale, title)
try: self.widgetManager.verify(widgKind, title)
except:
if value is None: return self.getScale(title)
else: self.setScale(title, value, *args, **kwargs)
Expand All @@ -4683,16 +4684,20 @@ def scale(self, title, value=None, *args, **kwargs):
increment = None if "increment" not in kwargs else kwargs.pop("increment")
interval = None if "interval" not in kwargs else kwargs.pop("interval")
show = False if "show" not in kwargs else kwargs.pop("show")
change = None if "change" not in kwargs else kwargs.pop("change")
r = None if "range" not in kwargs else kwargs.pop("range")

scale = self.addScale(title, *args, **kwargs)
kwargs = self._parsePos(kwargs.pop("pos", []), kwargs)
scale = self._scaleMaker(title, *args, **kwargs)

if value is not None: self.setScale(title, value)
if len(kwargs) > 0:
self._configWidget(title, self.widgetManager.get(widgKind, title), widgKind, **kwargs)

if r is not None: self.setScaleRange(title, r[0], r[1])
if vert: self.setScaleVertical(title)
if increment is not None: self.setScaleIncrement(title, increment)
if interval is not None: self.showScaleIntervals(title, interval)
if show: self.showScaleValue(title)
if change is not None: self.setScaleChangeFunction(title, change)
if value is not None: self.setScale(title, value)
return scale

def __buildScale(self, title, frame):
Expand All @@ -4710,6 +4715,9 @@ def __buildScale(self, title, frame):
self.widgetManager.add(self.Widgets.Scale, title, scale)
return scale

def _scaleMaker(self, title, row=None, column=0, colspan=0, rowspan=0, **kwargs):
return self.addScale(title, row, column, colspan, rowspan)

def addScale(self, title, row=None, column=0, colspan=0, rowspan=0):
scale = self.__buildScale(title, self.getContainer())
self.__positionWidget(scale, row, column, colspan, rowspan)
Expand Down Expand Up @@ -6956,13 +6964,54 @@ def getTurtle(self, title):
def addCanvas(self, title, row=None, column=0, colspan=0, rowspan=0):
self.widgetManager.verify(self.Widgets.Canvas, title)
canvas = Canvas(self.getContainer())
self.__positionWidget(canvas, row, column, colspan, rowspan)
self.__positionWidget(canvas, row, column, colspan, rowspan, "news")
self.widgetManager.add(self.Widgets.Canvas, title, canvas)
return canvas

def getCanvas(self, title):
return self.widgetManager.get(self.Widgets.Canvas, title)

def clearCanvas(self, title):
self.widgetManager.get(self.Widgets.Canvas, title).delete("all")

def addCanvasCircle(self, title, x, y, diameter, **kwargs):
return self.addCanvasOval(title, x, y, diameter, diameter, **kwargs)

def addCanvasOval(self, title, x, y, xDiam, yDiam, **kwargs):
return self.widgetManager.get(self.Widgets.Canvas, title).create_oval(x, y, x+xDiam, y+yDiam, **kwargs)

def addCanvasLine(self, title, x, y, x2, y2, **kwargs):
return self.widgetManager.get(self.Widgets.Canvas, title).create_line(x, y, x2, y2, **kwargs)

def addCanvasRectangle(self, title, x, y, w, h, **kwargs):
return self.widgetManager.get(self.Widgets.Canvas, title).create_rectangle(x, y, x+w, y+w, **kwargs)

def addCanvasText(self, title, x, y, text=None, **kwargs):
return self.widgetManager.get(self.Widgets.Canvas, title).create_text(x, y, text=text, **kwargs)

def setCanvasEvent(self, title, item, event, function, add=None):
canvas = self.widgetManager.get(self.Widgets.Canvas, title)
canvas.tag_bind(item, event, function, add)

def _canvasMaker(self, title, row=None, column=0, colspan=0, rowspan=0, **kwargs):
return self.addCanvas(title, row, column, rowspan)

def canvas(self, title, *args, **kwargs):
""" adds, sets & gets canases all in one go """
widgKind = self.Widgets.Canvas

try: self.widgetManager.verify(widgKind, title)
except: # widget exists
if len(kwargs) > 0:
self._configWidget(title, self.widgetManager.get(widgKind, title), widgKind, **kwargs)
return self.getCanvas(title)
else:
kwargs = self._parsePos(kwargs.pop("pos", []), kwargs)

canvas = self._canvasMaker(title, *args, **kwargs)
self._configWidget(title, canvas, widgKind, **kwargs)
return canvas

#####################################
# FUNCTIONS for Microbits
#####################################
Expand Down
20 changes: 20 additions & 0 deletions docs/mkdocs/docs/pythonDevWidgets.md
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,26 @@ app.go()
* `.getCanvas(title)`
Gets the specified canvas widget.

#### Drawing on a Canvas

* `.addCanvasCircle(title, x, y, diameter, **kwargs)`
Draws a circle on the canvas.

* `.addCanvasOval(title, x, y, xDiam, yDiam, **kwargs)`
Draws an oval on the canvas.

* `.addCanvasRectangle(title, x, y, w, h, **kwargs)`
Draws a rectangle on the canvas.

* `.addCanvasLine(title, x, y, x2, y2, **kwargs)`
Draws a line on the canvas.

* `.addCanvasText(title, x, y, text, **kwargs)`
Draws text on the canvas.

* `.clearCanvas(title)
Removes all drawings from the canavs.

### Turtle
---
This lets you embed a [turtle](https://docs.python.org/3.6/library/turtle.html) widget in appJar.
Expand Down
30 changes: 30 additions & 0 deletions examples/snow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import sys
sys.path.append("../")

import random
from appJar import gui

def press(event):
print("Clicked at: ", event.x, event.y)
widg = event.widget.find_closest(event.x, event.y)
c.itemconfig(widg, fill="blue")

flakes = []

def snow():
newX = random.randrange(c.winfo_width())
flakes.append(app.addCanvasCircle("c", newX, 0, 20, fill="white", tag="flake"))
for f in flakes:
c.move(f, 0, 5)

app.after(100, snow)

with gui("SNOW", "800x800") as app:
c = app.canvas("c", bg="yellow")
# c.bind("<Button-1>", press)
app.setCanvasEvent("c", "flake", "<ButtonPress-1>", press)
app.addCanvasRectangle("c", 50,50,200,100, fill="green")
app.addCanvasOval("c", 100,200,200,100, fill="blue")
app.addCanvasLine("c", 400,300,200,300, width=5, fill="blue")
app.addCanvasText("c", 700,700, "hello", fill="blue")
app.after(0, snow)

0 comments on commit cdb2214

Please sign in to comment.