def findDefaultFontFamily(): for generic in generics: if len(generic) > 0: fontFamily = generic[0] kaplot.debug("default font family %r, font %r will be used" % (generic.name, fontFamily.name), printonce=True) return fontFamily raise Exception, "no font found"
def _checkProductions(self, *args, **kwargs): """Bind the custom gui-event to this function, all arguments will be ignored""" if not self.producerQueue.empty(): callable, args, kwargs = self.producerQueue.get() product = callable(*args, **kwargs) self.productQueue.put(product) kaplot.debug("product is produced")
def _handleDeleteWindow(self): #self.root.quit() kaplot.debug("closing window") self.root.withdraw() if self.threaded: self.closelock.set() else: self.keeprunning = False
def run(self): self.testMutex = threading.Semaphore(1) self.root = Tkinter.Tk() self.root.withdraw() self.root.bind('<<Other-Thread-Event>>', self._checkProductions) self.startEvent.set() kaplot.debug("running tk mainloop") self.root.mainloop() kaplot.debug("end of tk mainloop")
def close(self): if self.threaded: kaplot.debug("waiting for deleteEvent") self.deleteEvent.wait() else: try: while True: self.update() self.parent.state() # this might throw an exception if app is destoyed.. which is what we want time.sleep(0.02) except _tkinter.TclError: pass
def draw(self, device): device.preDraw(self) self.layout() #device.pushContext(self.context) for page in self.pages: device.preDrawPage(self, page) start = time() page.draw(device) kaplot.debug("time to draw page:", time() - start) device.postDrawPage(self, page) #device.popContext() device.postDraw(self)
def findMatchingFontFamilies(fontname): firstGenericFontFamily = findGenericFontFamily(fontname) fontnameList = [] if firstGenericFontFamily: kaplot.debug("font %r is part of generic family %r" % (fontname, firstGenericFontFamily.name), printonce=True) fontnameList.extend(list(firstGenericFontFamily)) for generic in generics: if generic != firstGenericFontFamily: fontnameList.extend(list(generic)) else: for generic in generics: fontnameList.extend(list(generic)) return fontnameList
def plot(self, device): device.pushContext(self.context) begin = time() cinterface = device.getCInterface() if cinterface: polylines, labels = _contour.contour(self.data2d, self.level, cinterface) else: polylines, labels = _contour.contour(self.data2d, self.level) for x, y in polylines: device.plotPolyline(x, y) kaplot.debug("time for contour:", time() - begin) device.popContext()
def _updateImage(): kaplot.debug("updating image") self.pageImages[self.currentPage] = \ PIL.Image.fromstring("RGB", (self.image.width, self.image.height), self.image.get_rgb_string(), "raw", "RGB", 0, 0) current = self.pageImages[self.currentDisplayPage] #self.overlay = current.copy() self.canvas.delete(Tkinter.ALL) self.tkimage = PIL.ImageTk.PhotoImage(current) width, height = self.image.width, self.image.height self.canvas.create_image(width/2., height/2., image=self.tkimage) self.canvas["width"] = self.image.width self.canvas["height"] = self.image.height self.canvas.update() #self.label["image"] = self.tkimage self._refreshDocument() self.root.deiconify()
def findFontFamily(fontFamilyName): fontFamily = None # a case sensitive lookup if fontFamilyName in fontFamilies.keys(): fontFamily = fontFamilies[fontFamilyName] # generic searching if fontFamily == None: for generic in generics: if generic.name == fontFamilyName.lower(): if len(generic) > 0: fontFamily = generic[0] kaplot.debug("generic font family %r is found, font %r will be used" %\ (generic.name, fontFamily.name), printonce=True) else: kaplot.debug("no font present for generic font family %r" % (fontFamilyName.lower())) break # a case insensitive sensitive lookup with substrings matching if fontFamily == None: for someFontFamily in fontFamilies.values(): if someFontFamily.fuzzyMatch(fontFamilyName=fontFamilyName): fontFamily = someFontFamily kaplot.debug("font family %r not found, but %r matches it name" %\ (fontFamilyName, fontFamily.name), printonce=True) break # find a font with a similar generic family if fontFamily == None: generic = findGenericFontFamily(fontFamilyName) if generic: # now take the first font in this family that is present if len(generic) > 0: fontFamily = generic[0] kaplot.debug("font family %r not found, but %r is part of the same font family(%r)" % \ (fontFamilyName, fontFamily.name, generic.name), printonce=True) if fontFamily == None: kaplot.debug("can't recognise or find font %r, using a default font" % fontFamilyName, printonce=True) fontFamily = findDefaultFontFamily() return fontFamily
def mainloop(self): self.root.deiconify() if not self.threaded: self.keeprunning = True # #clear(self.root.mainloop() #return False #self.root.iconify() try: while self.keeprunning: self.update() self.parent.state() # this might throw an exception if app is destoyed.. which is what we want time.sleep(0.02) except _tkinter.TclError: kaplot.debug("exit mainloop") #tkMaster.mainloop() #self.root.mainloop() else: kaplot.debug("waiting for window to close") self.closelock.clear() self.closelock.wait()
def createImageWindow(threaded=False): kaplot.debug("creating window, threaded=%r" % threaded) if threaded: def createPlotWindow(root): frame = createFrame(root) window = TkWindow(frame, 500, 400, 1, threaded=True) window.grid(row=0, column=0, sticky="NWSE") frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) return window windowThread = getGuiThread() window = windowThread.executeFromThread(createPlotWindow, windowThread.root) return window else: tkMaster = getTkMaster() frame = createFrame(tkMaster) window = TkWindow(frame, 500, 400, 1, threaded=False) window.grid(row=0, column=0, sticky="NWSE") frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) return window
def executeFromThread(self, callable, *args, **kwargs): #self.createMutex.acquire() if threading.currentThread() == self: # these can be executed directly kaplot.debug("calling executeFromThread from gui thread, returning directly") return callable(*args, **kwargs) else: self.producerQueue.put((callable, args, kwargs)) kaplot.debug("generating event to execute a function in the gui thread") self._generateGuiEvent() kaplot.debug("waiting for reply from the gui thread") result = self.productQueue.get() kaplot.debug("got return value from gui thread") #self.createMutex.release() return result
def handleMouseEvent(self, x, y, options, window): if self.onmouse and self.onmouse(x, y, options, window): return text = self.getMouseMoveText(x, y) window.setInfoText(text) if options["leftdouble"]: #print "double click, select container" vx, vy = self.getDocument().windowToViewport(x, y, viewport=((0, 0), (1, 1))) container = self.page.findContainer(vx, vy, previous=self) kaplot.debug("found container", container) if container: container.flashViewport(window) window.select(container) if options["rightup"]: self.flashViewport(window) menu = window.createMenu() clipboardMenu = window.createMenu() clipboardMenu.addCommand("viewport", self.testClipboard) menu.addSubMenu("zoom", self.getZoomMenu(window, x, y, menu)) menu.addSubMenu("grow", self.getGrowMenu(window, menu)) menu.addSubMenu("flip", self.getFlipMenu(window, menu)) menu.addSeparator() wx, wy = self.windowToWorld(x, y) def center(window, x, y): self.center(x, y) window.refreshDocument() def centerx(window, x): self.centerx(x) window.refreshDocument() def centery(window, y): self.centery(y) window.refreshDocument() menu.addCommand("center", center, args=[wx, wy]) menu.addCommand("center x", centerx, args=[wx]) menu.addCommand("center y", centery, args=[wy]) def fitChildren(window): self.fitChildren() window.refreshDocument() menu.addCommand("fit", fitChildren) menu.addSeparator() #menuOptions.append(("select", self.getSelectionMenu())) menu.addSubMenu("context", self.getContextMenu(window, self.context, menu)) #childMenu = window.createMenu(menu) #for i, child in enumerate(self.objects): # name = "object [%d] = %s" % (i, str(child.__class__)) # childMenu.addSubMenu(name, self.getContextMenu(window, child.context, childMenu)) #menu.addSubMenu("children", childMenu) #print "showing popup menu" window.showPopupMenu(menu) #print "showed it" if options["dragging"] and options["leftisdown"]: x1, y1 = options["dragposition"] x2, y2 = x, y xlist = [x1, x2, x2, x1] ylist = [y1, y1, y2, y2] #winx1, winy1 = self.getDocument().viewportToWindow(0, 0, self.innerViewport) #winx2, winy2 = self.getDocument().viewportToWindow(1, 1, self.innerViewport) #print winx1, winy1 extraText = self.getMouseDragText(x1, y1, x2, y2) #if self.fitmode == "xy": # xlist = [x1, x2, x2, x1] # ylist = [y1, y1, y2, y2] #elif self.fitmode == "x": # xlist = [x1, x2, x2, x1] # ylist = [winy1, winy1, winy2, winy2] #elif self.fitmode == "y": # xlist = [winx1, winx2, winx2, winx1] # ylist = [y1, y1, y2, y2] window.setRubberBand(xlist, ylist, close=True) window.setInfoExtraText(extraText) window.refreshWindow() elif options["wasdragging"] and options["leftup"]: x1, y1 = options["dragposition"] x2, y2 = x, y w1 = self.windowToWorld(x1, y1) w2 = self.windowToWorld(x2, y2) v1 = self.getDocument().windowToViewport(x1, y1) v2 = self.getDocument().windowToViewport(x2, y2) #if self.fitmode == "x": # def zoomtobox(window, p1, p2): self.world = p1, p2 window.refreshDocument() def changeviewport(window, v1, v2): self.viewport = v1, v2 window.refreshDocument() menu = window.createMenu() menu.addCommand("zoom", zoomtobox, args=[w1, w2]) menu.addCommand("change viewport", changeviewport, args=[v1, v2]) window.showPopupMenu(menu) window.removeRubberBand() window.refreshWindow() if options["dragging"] and options["middleisdown"]: x1, y1 = options["dragposition"] x2, y2 = x, y extraText = self.getMouseDragText(x1, y1, x2, y2) xlist = [x1, x2] ylist = [y1, y2] window.setRubberBand(xlist, ylist, close=False) window.setInfoExtraText(extraText) window.refreshWindow() elif options["wasdragging"] and options["middleup"]: x1, y1 = options["dragposition"] x2, y2 = x, y (wx1, wy1) = self.windowToWorld(x1, y1) (wx2, wy2) = self.windowToWorld(x2, y2) dx = wx2 - wx1 dy = wy2 - wy1 def pan(window, dx, dy): (x1, y1), (x2, y2) = self.getWorld() self.world = (x1 + dx, y1 + dy), (x2 + dx, y2 + dy) window.refreshDocument() menu = window.createMenu() menu.addCommand("pan", pan, args=[dx, dy]) menu.addCommand("pan (x only)", pan, args=[dx, 0]) menu.addCommand("pan (y only)", pan, args=[0, dy]) window.showPopupMenu(menu) window.removeRubberBand() window.refreshWindow()
def __init__(self, parent, width, height, pageCount, threaded=False, **kw): Tkinter.Frame.__init__(self, parent, **kw) Window.__init__(self) self.parent = parent self.root = parent self.width = width self.height = height self.pageCount = pageCount self.threaded = threaded kaplot.debug("treaded = %s" % threaded) root = parent self.currentDisplayPage = 0 self.currentPage = 0 def image(): return PIL.Image.fromstring("RGB", (self.width, self.height), "\x00\x00\x00" * width * height) self.pageImages = [image() for k in range(self.pageCount)] self.tkimage = PIL.ImageTk.PhotoImage(self.pageImages[self.currentPage]) #self.label = Tkinter.Label(self, image=self.tkimage, relief=Tkinter.SUNKEN, bd=2) #self.label.grid(row=1, column=0, columnspan=4, rowspan=2, sticky="NE")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.canvas = Tkinter.Canvas(self, relief=Tkinter.SUNKEN, bd=0, takefocus=True) self.canvas.grid(row=10, column=0, columnspan=4, rowspan=2, sticky="NW") self.zoomwidth, self.zoomheight = 128, 128 self.zoomimage = PIL.Image.fromstring("RGB", (self.zoomwidth, self.zoomheight), "\x00\x00\x00" * self.zoomwidth * self.zoomheight)#, "raw", "RGB", gs.width*3, 1) self.zoomtkimage = PIL.ImageTk.PhotoImage(self.zoomimage) self.zoomlabel = Tkinter.Label(self, image=self.zoomtkimage, relief=Tkinter.SUNKEN, bd=2) self.zoomlabel.grid(row=0, column=0, columnspan=1, rowspan=2,sticky="W")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.infoText = Tkinter.Text(self, width=30, height=7, wrap=Tkinter.NONE, takefocus=False) self.infoText.grid(row=0, column=1) self.infoTextCopy = Tkinter.Text(self, width=30, height=7, wrap=Tkinter.NONE, takefocus=False) self.infoTextCopy.grid(row=0, column=2) self.infoTextExtra = Tkinter.Text(self, width=30, height=7, wrap=Tkinter.NONE, takefocus=False) self.infoTextExtra.grid(row=0, column=3) if 0: self.button1 = Tkinter.Button(self, text="Test", bd=2) self.button1.grid(row=1, column=1, columnspan=1, sticky="W")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.scale1label = Tkinter.Label(self, text="E:", bd=2) self.scale1label.grid(row=2, column=0, columnspan=1, sticky="E")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) def test(*args, **kwargs): print args, kwargs self.scale1 = Tkinter.Scale(self, from_=0, to=100, bd=2, orient=Tkinter.HORIZONTAL, length=500, command=test) self.scale1.grid(row=2, column=1, columnspan=3, sticky="W")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.scale2label = Tkinter.Label(self, text="L:", bd=2) self.scale2label.grid(row=3, column=0, columnspan=1, sticky="E")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.scale2 = Tkinter.Scale(self, from_=0, to=1000, bd=2, orient=Tkinter.HORIZONTAL, length=500) self.scale2.grid(row=3, column=1, columnspan=3, sticky="W")#Tkinter.W+Tkinter.E+Tkinter.N+Tkinter.S) self.frameCount = 0 #self.label.bind("<Button-1>", self._onMouseClick) self.bind('<<refresh>>', self._refresh) #self.bind('<Destroy>', self._handleDeleteWindow) self.root.protocol("WM_DELETE_WINDOW", self._handleDeleteWindow) self.bind("<Key>", self.keyEvent) self.canvas.bind("<Key>", self.keyEvent) self.canvas.bind("<Motion>", self.mouseEvent) self.canvas.bind("<Enter>", self.mouseEventEnter) self.canvas.bind("<Button-1>", self.mouseEvent) self.canvas.bind("<Button-2>", self.mouseEvent) self.canvas.bind("<Button-3>", self.mouseEvent) self.canvas.bind("<ButtonRelease-1>", self.mouseEvent) self.canvas.bind("<ButtonRelease-2>", self.mouseEvent) self.canvas.bind("<ButtonRelease-3>", self.mouseEvent) self.canvas.bind("<Double-Button-1>", self.mouseEventDouble) self.canvas.bind("<Double-Button-2>", self.mouseEventDouble) self.canvas.bind("<Double-Button-3>", self.mouseEventDouble) self.mouseOptions = {} self.mouseOptions["dragposition"] = (0, 0) self.mouseOptions["moving"] = False self.mouseOptions["dragging"] = False self.mouseOptions["wasdragging"] = False self.mouseOptions["leftdouble"] = False self.mouseOptions["leftup"] = False self.mouseOptions["leftdown"] = False self.mouseOptions["leftisdown"] = False self.mouseOptions["middledouble"] = False self.mouseOptions["middleup"] = False self.mouseOptions["middledown"] = False self.mouseOptions["middleisdown"] = False self.mouseOptions["rightdouble"] = False self.mouseOptions["rightup"] = False self.mouseOptions["rightdown"] = False self.mouseOptions["rightisdown"] = False self.mouseOptions["shift"] = False self.mouseOptions["control"] = False self.mouseOptions["alt"] = False self.lastMousePos = (0, 0) self._canvasItems = [] self.keeprunning = True self.defaultCursor = self.getMouseCursor() self.menus = [] if threaded: self.closelock = threading.Event(0) #self.mainMenu = Tkinter.Menu(self. self.canvas.focus_set()
def refreshDocument(self): kaplot.debug("refresh document requested") def _refreshDocument(): kaplot.debug("refreshing document") self.document.draw(self.device) self.root.after_idle(_refreshDocument)
def layout(self): for page in self.pages: start = time() page.layout() kaplot.debug("time to layout page:", time() - start)
def postDraw(self, document): super(AggDeviceWindow, self).postDraw(document) kaplot.debug("agg post draw") self.window.updateImage()
def refreshWindow(self): kaplot.debug("refresh window requested") self.root.after_idle(self._refreshDocument)
def _refreshDocument(): kaplot.debug("refreshing document") self.document.draw(self.device)
def _setImage(): kaplot.debug("setting image") self.image = image
def select(self, object): kaplot.debug("selected", object) self.selectedObject = object