Pipeline( ConsoleReader(), InterpreterTransformer(), ConsoleEchoer(), ).run() #FILE: Server Embeddable if 0: from Kamaelia.Chassis.ConnectedServer import ServerCore from Kamaelia.Util.PureTransformer import PureTransformer def NetInterpreter(*args, **argv): return Pipeline( PureTransformer(lambda x: str(x).rstrip()), InterpreterTransformer(), PureTransformer(lambda x: str(x)+"\r\n>>> "), ) ServerCore(protocol=NetInterpreter, port=1236).run() #FILE: Pygame Embeddable if 1: from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer Pipeline( Textbox(size = (800, 300), position = (100,380)), InterpreterTransformer(), TextDisplayer(size = (800, 300), position = (100,40)), ).run()
class TimedLineSender(Axon.ThreadedComponent.threadedcomponent): text = """\ To be, or not to be: that is the question: Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them? To die: to sleep; No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep; To sleep: perchance to dream: ay, there's the rub; For in that sleep of death what dreams may come When we have shuffled off this mortal coil, Must give us pause: there's the respect That makes calamity of so long life; """ strip_leading = True debug = True delay = 0.5 def main(self): lines = self.text.split('\n') for line in lines: if self.strip_leading: line = line.lstrip() time.sleep(self.delay) self.send(line) # remove preding spaces self.send(producerFinished(), 'signal') Pipeline(TimedLineSender(), TextDisplayer()).run()
def main(self): """Main event loop, also handles input from other components""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.disprequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size=(20, 20), position=(520, 10)).activate() self.link((self, "laynum"), (layerDisp, "inbox")) self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") self.send({ "ADDLISTENEVENT": pygame.KEYDOWN, "surface": self.display }, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send(self.activeLayIn, "laynum") image = pygame.Surface((20, 20)) pygame.draw.circle(image, (1, 1, 1), (10, 10), self.toolSize, 0) # pygame.draw.circle(image, self.selectedColour, (10, 10), 8, 2) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) self.drawBG(True) self.blitToSurface() FPS = 1 clock = Clock(float(1) / FPS).activate() clock.link((clock, "outbox"), (self, "newframe")) done = False while not done: dirtyrects = [] dirtyrects.extend([cursor.hide()]) if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance( cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("newframe") and self.playing: self.recv("newframe") if self.currentFrame != 0: self.layers[self.currentFrame].set_alpha(0) self.currentFrame = self.currentFrame + 1 if self.currentFrame == len(self.layers) - 1: self.playing = False self.layers[self.currentFrame].set_alpha(255) self.blitToSurface() while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): self.send((event, ), "outbox") if event[0] == "Layer": if event[1] == "Add": yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] self.drawBG() if self.animator and len(self.layers) - 2 >= 1: for x in self.layers: s.set_alpha = 0 self.activeLayer.blit( self.layers[len(self.layers) - 2], (0, 0)) self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer), "display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] # print (self.layers) if event[1] == "Next": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == len(self.layers) - 1: self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[ self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) elif event[1] == "Prev": if self.animator and self.activeLayIn != 0: self.activeLayer.set_alpha(0) if self.activeLayIn == 0: self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[ self.activeLayIn] if self.animator: self.activeLayer.set_alpha(255) self.send(self.activeLayIn, "laynum") elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1] / 3 pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize / 3, 0) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print (self.activeLayer.get_alpha()) elif event[0] == 'Colour': self.selectedColour = event[1] pygame.draw.circle(image, self.selectedColour, (10, 10), self.toolSize / 3, 0) image.set_at((9, 9), (255, 255, 255)) image.set_colorkey(0, pygame.RLEACCEL) cursor = GfxCursor(self.display, image, (10, 10)) elif event[0] == 'Save': self.save(event[1]) break if event.type == pygame.MOUSEBUTTONDOWN: cursor.disable() if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0], event.pos[1], self.selectedColour, self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at( event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load( os.path.join('', 'pennyarcade.gif')) yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit(image, (10, 10)) self.blitToSurface() self.send(self.activeLayIn, "laynum") elif event.key == pygame.K_s: """Testing a different brushing technique, bliting a brush""" print(self.size, self.toolSize) yield WaitComplete(self.addBrush()) self.activeBrush = self.brushes[len(self.brushes) - 1] self.activeBrush.fill(self.backgroundColour) pygame.draw.circle( self.activeBrush, self.selectedColour, (self.toolSize / 2, self.toolSize / 2), self.toolSize, 0) elif event.key == pygame.K_a: self.animator = True elif event.key == pygame.K_l: self.layers[1].blit(self.layers[1], (100, 100)) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: for x in self.layers: x.set_alpha(0) self.layers[0].set_alpha(255) self.currentFrame = 0 while self.dataReady( "newframe" ): # empty if there's anything there self.recv("newframe") self.playing = True self.blitToSurface() elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: cursor.enable() if self.tool == "Circle": rad = int( math.sqrt(( (event.pos[0] - self.oldpos[0])**2) + ( (event.pos[1] - self.oldpos[1])**2))) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) # self.send((circle,), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: cursor.update(event) if self.tool == "Line": if self.drawing and self.innerRect.collidepoint( *event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) r = pygame.draw.line( self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) dirtyrects.append(r) # self.activeLayer.blit(self.activeBrush, event.pos) FAILED TECHNIQUE line = ("line", self.oldpos, event.pos) self.send((line, ), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() pygame.time.delay(5) dirtyrects.extend([cursor.show()]) pygame.display.update(dirtyrects) yield 1
testing = False if testing: Pipeline( SubscribeTo("DEBUGIN"), PublishTo("USERRESPONSE"), ).activate() Pipeline( Textbox(position=(250,48), size=(500,150)), PublishTo("DEBUGIN"), ).activate() Pipeline( SubscribeTo("OUIJAOUT"), PureTransformer(lambda x: str(x)+"\n"), TextDisplayer(position=(250,220), size=(500,150)), ).activate() Pipeline( ConsoleReader(">> "), PureTransformer(lambda x: x[:-1]), PublishTo("PROGRAMME"), ).activate() else: Pipeline( SubscribeTo("OUIJAOUT"), TextDisplayer(position=(250,48), size=(500,322), text_height=25), ).activate()
if __name__ == "__main__": from Kamaelia.UI.Pygame.Text import TextDisplayer, Textbox if 0: from Kamaelia.Chassis.Pipeline import Pipeline ProcessGraphline( component_one=Textbox(position=(20, 340), text_height=36, screen_width=900, screen_height=200, background_color=(130, 0, 70), text_color=(255, 255, 255)), component_two=Pipeline( TextDisplayer(position=(20, 90), text_height=36, screen_width=900, screen_height=200, background_color=(130, 0, 70), text_color=(255, 255, 255)), Textbox(position=(20, 340), text_height=36, screen_width=900, screen_height=200, background_color=(130, 0, 70), text_color=(255, 255, 255)), ), linkages={ ("component_one", "outbox"): ("component_two", "inbox"), ("component_one", "signal"): ("component_two", "control"), }, __debug=True, )
DrawingCanvas( background=0xD0D0D0, # Grey! surfacesize=(570, 650), surfaceposition=(430, 90)), ).activate() Pipeline( SubscribeTo("PARSEDINPUT"), Turtle(), PublishTo("PARSEDINPUT"), ).activate() Pipeline( Textbox(position=(20, 640), text_height=36, screen_width=400, screen_height=100, background_color=(130, 0, 70), text_color=(255, 255, 255)), PublishTo("RAWINPUT"), ).activate() Pipeline( SubscribeTo("DISPLAYCONSOLE"), TextDisplayer(position=(20, 90), text_height=36, screen_width=400, screen_height=540, background_color=(130, 0, 70), text_color=(255, 255, 255))).run()
from Kamaelia.UI.PygameDisplay import PygameDisplay from Kamaelia.UI.Pygame.Button import Button from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer from Kamaelia.UI.Pygame.VideoSurface import VideoSurface from Kamaelia.Codec.Dirac import DiracDecoder from Kamaelia.Util.RateFilter import MessageRateLimit from Kamaelia.File.ReadFileAdaptor import ReadFileAdaptor from Kamaelia.Video.PixFormatConversion import ToRGB_interleaved # override pygame display service ogl_display = OpenGLDisplay.getDisplayService(fullscreen=True) PygameDisplay.setDisplayService(ogl_display[0]) READER = Textbox(size=(400, 300), text_height=30).activate() WRITER = TextDisplayer(size=(400, 300), text_height=30).activate() SCREEN = VideoSurface().activate() Pipeline( ReadFileAdaptor("TestMaterial/TrainWindow.drc", readmode="bitrate", bitrate=1000000), DiracDecoder(), MessageRateLimit(10), ToRGB_interleaved(), SCREEN, ).activate() R_ = PygameWrapper(wrap=READER, position=(-2, -2, -10), rotation=(20, 10, 0)).activate()
def main(self): """Main loop.""" displayservice = PygameDisplay.getDisplayService() self.link((self, "display_signal"), displayservice) self.send(self.disprequest, "display_signal") for _ in self.waitBox("callback"): yield 1 self.display = self.recv("callback") self.layers.append(self.display) # f = os.path.join('', "pennyarcade.gif") # x = pygame.image.load(f) # colorkey = x.get_at((0, 0)) # if colorkey is True: # x.set_colorkey(colorkey, pygame.RLEACCEL) # self.layers.append(x) # self.display = x # self.activeLayIn = len(self.layers)-1 # self.activeLayer = self.layers[self.activeLayIn] # self.display.blit( x, (0,0) ) layerDisp = TextDisplayer(size=(20, 20), position=(520, 10)).activate() self.link((self, "laynum"), (layerDisp, "inbox")) self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONDOWN, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEBUTTONUP, "surface": self.display }, "display_signal") self.send( { "ADDLISTENEVENT": pygame.MOUSEMOTION, "surface": self.display }, "display_signal") self.send({ "ADDLISTENEVENT": pygame.KEYDOWN, "surface": self.display }, "display_signal") self.activeLayer = self.layers[self.activeLayIn] self.send(self.activeLayIn, "laynum") self.drawBG(True) self.blitToSurface() done = False while not done: if not self.anyReady(): self.pause() yield 1 while self.dataReady("control"): cmsg = self.recv("control") if isinstance(cmsg, producerFinished) or isinstance( cmsg, shutdownMicroprocess): self.send(cmsg, "signal") done = True while self.dataReady("inbox"): for event in self.recv("inbox"): if isinstance(event, tuple): if event[0] == "Layer": if event[1] == "Add": yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] # self.send( self.activeLayIn, "laynum" ) self.drawBG() self.blitToSurface() elif event[1] == "Delete": self.send( producerFinished(message=self.activeLayer), "display_signal") self.layers.remove(self.activeLayer) self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] # print self.layers if event[1] == "Next": if self.activeLayIn == len(self.layers) - 1: self.activeLayIn = 0 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn += 1 self.activeLayer = self.layers[ self.activeLayIn] elif event[1] == "Prev": if self.activeLayIn == 0: self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[ self.activeLayIn] else: self.activeLayIn -= 1 self.activeLayer = self.layers[ self.activeLayIn] self.send(self.activeLayIn, "laynum") elif event[0] == "Tool": self.tool = event[1] elif event[0] == "Size": self.toolSize = event[1] / 3 elif event[0] == "Alpha": self.layers[self.activeLayIn].set_alpha(event[1]) self.blitToSurface() # print self.activeLayer.get_alpha() elif event[0] == 'Colour': self.selectedColour = event[1] break if event.type == pygame.MOUSEBUTTONDOWN: if self.tool == "Circle": if event.button == 1: self.oldpos = event.pos self.drawing = True if self.tool == "Eraser": self.selectedColour = self.backgroundColour self.tool = "Line" if self.tool == "Line": if event.button == 1: self.drawing = True if self.tool == "Bucket": self.floodFill(event.pos[0], event.pos[1], self.selectedColour, self.activeLayer.get_at(event.pos)) if self.tool == "Eyedropper": self.selectedColour = self.activeLayer.get_at( event.pos) if event.button == 3: self.addLayer() #self.oldpos = None #self.drawBG() #self.blitToSurface() #self.send(("clear",), "outbox") elif event.type == (pygame.KEYDOWN): if event.key == pygame.K_c: image = pygame.image.load( os.path.join('', 'pennyarcade.gif')) yield WaitComplete(self.addLayer()) self.activeLayIn = len(self.layers) - 1 self.activeLayer = self.layers[self.activeLayIn] self.drawBG() self.activeLayer.blit(image, (10, 10)) self.blitToSurface() self.send(self.activeLayIn, "laynum") elif event.key == pygame.K_s: # temp = self.layers[0] self.save("tgfdg") # self.layers.insert(0,temp) # self.drawBG() elif event.key == pygame.K_l: self.layers[1].blit(self.layers[1], (100, 100)) # temp = self.layers[1] # self.layers[1].fill(self.backgroundColour) # self.layers[1].blit( temp, (100,100) ) elif event.key == pygame.K_o: move = { "CHANGEDISPLAYGEO": True, "surface": self.layers[1], "position": (100, 100) } self.send(move, "display_signal") elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: if self.tool == "Circle": rad = math.sqrt(( (event.pos[0] - self.oldpos[0])**2) + ( (event.pos[1] - self.oldpos[1])**2)) pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, rad, 0) circle = ("circle", self.oldpos, rad) self.send((circle, ), "outbox") self.blitToSurface() self.drawing = False self.oldpos = None elif event.type == pygame.MOUSEMOTION: if self.tool == "Line": if self.drawing and self.innerRect.collidepoint( *event.pos): if self.oldpos == None: self.oldpos = event.pos else: # pygame.draw.circle(self.activeLayer, self.selectedColour, self.oldpos, self.toolSize, 0) pygame.draw.line(self.activeLayer, self.selectedColour, self.oldpos, event.pos, self.toolSize) line = ("line", self.oldpos, event.pos) self.send((line, ), "outbox") self.oldpos = event.pos self.blitToSurface() self.pause() yield 1
Repeater(), Reorderer(), ConsoleEchoer(1), UnixProcess("while read word; do echo $word | espeak -w foo.wav --stdin ; aplay foo.wav ; done"), ).activate() bgcolour = (255,255,180) CANVAS = Canvas( position=(0,40), size=(800,320), bgcolour = bgcolour, ).activate() CHALLENGE = TextDisplayer(size = (390, 200), position = (0,40), bgcolour = bgcolour, text_height=48, transparent =1, ).activate() TEXT = Textbox(size = (800, 100), position = (0,260), bgcolour = (255,180,255), text_height=48, transparent =1, ).activate() Image("/usr/local/share/kamaelia/kamaelia_logo_whitebg.png", position=(600,40)).activate() Graphline( CHALLENGER = Challenger(), CHALLENGE_SPLITTER = TwoWaySplitter(), CHALLENGE_CHECKER = Challenger_Checker(), SPEAKER = PublishTo("SPEECH"),
import time from Axon.background import background from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer from Axon.Handle import Handle background().start() try: import Queue queue = Queue # Python 3 compatibility change except ImportError: # Python 3 compatibility change import queue TD = Handle( TextDisplayer(position=(20, 90), text_height=36, screen_width=900, screen_height=200, background_color=(130, 0, 70), text_color=(255, 255, 255))).activate() TB = Handle( Textbox(position=(20, 340), text_height=36, screen_width=900, screen_height=400, background_color=(130, 0, 70), text_color=(255, 255, 255))).activate() message = "hello\n" while 1: time.sleep(1) try:
## Copyright (C) 2007 British Broadcasting Corporation and Kamaelia Contributors(1) ## All Rights Reserved. ## from Kamaelia.Chassis.Carousel import Carousel from Kamaelia.Chassis.Graphline import Graphline from Kamaelia.Util.Chooser import Chooser from Kamaelia.UI.Pygame.Button import Button from Kamaelia.UI.Pygame.Text import TextDisplayer from Kamaelia.File.ReadFileAdaptor import ReadFileAdaptor files = ["1.txt", "2.txt", "3.txt", "4.txt"] def makeFileReader(filename): return ReadFileAdaptor(filename=filename) Graphline(NEXT=Button(caption="Next", msg="NEXT", position=(72, 8)), PREVIOUS=Button(caption="Previous", msg="PREV", position=(8, 8)), CHOOSER=Chooser(items=files), READER=Carousel(componentFactory=makeFileReader), DISPLAY=TextDisplayer(position=(20, 90), screen_width=800, screen_height=600), linkages={ ("NEXT", "outbox"): ("CHOOSER", "inbox"), ("PREVIOUS", "outbox"): ("CHOOSER", "inbox"), ("CHOOSER", "outbox"): ("READER", "next"), ("READER", "outbox"): ("DISPLAY", "inbox"), }).run()
#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2010 British Broadcasting Corporation and Kamaelia Contributors(1) # # (1) Kamaelia Contributors are listed in the AUTHORS file and at # http://www.kamaelia.org/AUTHORS - please extend this file, # not this notice. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ------------------------------------------------------------------------- # from Kamaelia.Chassis.Pipeline import Pipeline from Kamaelia.Util.Console import ConsoleReader from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer Pipeline(ConsoleReader(), TextDisplayer()).run()
#!/usr/bin/python from Kamaelia.Chassis.Pipeline import Pipeline from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer from Kamaelia.Internet.TCPClient import TCPClient Pipeline(Textbox(size=(800, 300), position=(100, 380), text_height=32), TCPClient("127.0.0.1", 1501), TextDisplayer(size=(800, 300), position=(100, 40), text_height=32)).run()
Pipeline( ReadFileAdaptor(file, readmode="bitrate", bitrate=300000 * 8 / 5), DiracDecoder(), MessageRateLimit(framerate), VideoOverlay(position=(260, 48), size=(200, 300)), ), Pipeline( ReadFileAdaptor(file, readmode="bitrate", bitrate=2280960 * 8), DiracDecoder(), # MessageRateLimit(framerate), ToRGB_interleaved(), VideoSurface(size=(200, 300), position=(600, 48)), ), Pipeline( PAR( Button(caption="Next", msg="NEXT", position=(72, 8)), Button(caption="Previous", msg="PREV", position=(8, 8)), Button(caption="First", msg="FIRST", position=(256, 8)), Button(caption="Last", msg="LAST", position=(320, 8)), ), Chooser(items=files), Image(size=(200, 300), position=(8, 48), maxpect=(200, 300)), ), Pipeline( Textbox(size=(200, 300), position=(8, 360)), TextDisplayer(size=(200, 300), position=(228, 360)), ), Ticker(size=(200, 300), position=(450, 360)), ), ).run()
#!/usr/bin/python from Kamaelia.UI.Pygame.Display import PygameDisplay from Kamaelia.Chassis.Pipeline import Pipeline from Kamaelia.Util.Console import ConsoleEchoer from Kamaelia.UI.Pygame.Text import Textbox, TextDisplayer X = PygameDisplay(background_colour=(224, 224, 255), width=1000, height=400).activate() PygameDisplay.setDisplayService(X) Pipeline( Textbox(size=(800, 150), position=(100, 230), font_file="/home/michaels/.fonts/MichaelHW.ttf", padding=20, border_size=10, border_colour=(128, 0, 0)), TextDisplayer(size=(800, 150), position=(100, 40), font_file="/home/michaels/.fonts/GillSans.ttf", padding=20, border_size=10, border_colour=(0, 0, 128))).run()