Output text
-
Hello everyone:
I've been trying to find a way to use the output text as drawn text, but I'm not really winning the battle, so I finished copying the text, here is my code:
#Set today's time day = 29 month = 8 year = 2019 date = '%02d/%02d/%04d' % (day, month, year) print("Today is " + str(date)) #Birthday function def birthDay(name, bDay, bMonth, bYear): bDate = '%02d/%02d/%04d' % (bDay, bMonth, bYear) if month >= bMonth and day >= bDay: age = year - bYear print("I am " + name + " and I have " + str(age) + " years." + " My birthday is " + str(bDate)) else: age2 = year - bYear -1 print("I am " + name + " and I have " + str(age2) + " years." + " My birthday is " + str(bDate)) #Examples size(1000, 1000) birthDay("L", 4, 9, 1992) birthDay("P", 21, 1, 1993) birthDay("E", 15, 9, 1971) birthDay("J", 22, 3, 1961) txt = """Today is 29/08/2019 I am L and I have 26 years. My birthday is 04/09/1992 I am P and I have 26 years. My birthday is 21/01/1993 I am E and I have 47 years. My birthday is 15/09/1971 I am J and I have 58 years. My birthday is 22/03/1961""" #Image x, y, w, h = 100, 100, 800, 800 fill(0.5, 1, 1) rect(x, y, w, h) font('.SFNSRounded-Black', 130) fontSize(50) fontVariations(GRAD=500, wght= 1000) stroke(1, 0, 0) strokeWidth(3) overflow = textBox(txt, (x, y, w, h), align="center") print(overflow) saveImage('~/Desktop/ages.png')
Does anyone know how to make it?
Thanks.
-
hello @eduairet,
you can use Python’s string formatting syntax to create strings with variable parts:
name = 'John' age = 17 # old syntax, still works txt1 = "I am %s and I have %s years." % (name, age) # new in py3: f-strings txt2 = f"I am {name} and I have {age} years."
and here’s how you can repeat it for a list of names and collect the output into a single text:
persons = [ ('Michael', 34), ('Maria', 15), ('Daniel', 56), ] txt = '' for name, age in persons: txt += f"I am {name} and I have {age} years.\n" fontSize(56) textBox(txt, (0, 0, width(), height()))
hope this helps!
-
Thanks again @gferreira it worked better that way now I'm trying to make a list of random objects and names, but I don't want them to be repeated, do you know if there's a similar way to match the pairs without repetition ?
Here’s the code:
#Canvas Size w = 1000 h = 1000 def whiteCanvas(): newPage(w, h) fill(1) rect(0, 0, w, h) def blackCanvas(): newPage(w, h) fill(0) rect(0, 0, w, h) def objects(tCol): objLuck = randint(0, 3) objTxt = "My object is: " if objLuck == 1: txt = objTxt + "Fish" elif objLuck == 2: txt = objTxt + "Bullet" else: txt = objTxt + "Glass" fontSize(56) fill(tCol) text(txt, (width()/2, 500), align ='center') def students(tCol): stdLuck = randint(0, 3) stdTxt = "I am " if stdLuck == 1: txt = stdTxt + "Pedro" elif stdLuck == 2: txt = stdTxt + "Caro" else: txt = stdTxt + "Raúl" fontSize(56) fill(tCol) text(txt, (width()/2, 400), align ='center') def pairs(): Luck = randint(0, 1) if Luck == 0: whiteCanvas() students(0) objects(0) else: blackCanvas() students(1) objects(1) for i in range(3): pairs()
Thank you very much
-
hello @eduairet,
you could shuffle each list separately, then combine them using
zip()
:from random import shuffle L1 = ['Michael', 'John', 'Graham'] L2 = ['spam', 'bacon', 'eggs'] shuffle(L1) shuffle(L2) L3 = list(zip(L1, L2)) print(L3)
there are other ways to do it…
-
This is totally better @gferreira you’re really kind, thank you. I’ve tried the following code and it’s exactly what I needed, I was just wondering if there is a way to make it with less code, I’ve noticed that you have better results in less lines and that’s really nice. Thanks again.
#Canvas Size w = 1000 h = 1000 yPos = 500 def whiteCanvas(): newPage(w, h) fill(1) rect(0, 0, w, h) def blackCanvas(): newPage(w, h) fill(0) rect(0, 0, w, h) from random import shuffle L1 = ['Pedro', 'Jonás', 'Raúl', 'Celestina', 'Constanza'] L2 = ['Ojos', 'Latas', 'Lombrices', 'Cigarro', 'Guitarra'] shuffle(L1) shuffle(L2) L3 = list(zip(L1, L2)) print(L3) def bgCol(): Luck = randint(0, 1) if Luck == 0: whiteCanvas() fontSize(56) fill(0) else: blackCanvas() fontSize(56) fill(1) def pairs(): bgCol() txt = "Pair: " + str(L3[0]) text(txt, (width()/2, yPos), align ='center') bgCol() txt = "Pair: " + str(L3[1]) text(txt, (width()/2, yPos), align ='center') bgCol() txt = "Pair: " + str(L3[2]) text(txt, (width()/2, yPos), align ='center') bgCol() txt = "Pair: " + str(L3[3]) text(txt, (width()/2, yPos), align ='center') bgCol() txt = "Pair: " + str(L3[4]) text(txt, (width()/2, yPos), align ='center') for i in range(1): pairs() saveImage('~/Desktop/ruleta.png', multipage=True)
-
@eduairet you’re welcome, happy to help.
here is a more concise and more pythonic version of your code:
from random import shuffle w, h = 1000, 1000 names = ['Pedro', 'Jonás', 'Raúl', 'Celestina', 'Constanza'] things = ['Ojos', 'Latas', 'Lombrices', 'Cigarro', 'Guitarra'] shuffle(names) shuffle(things) pairs = list(zip(names, things)) def makePage(pair): # flip a coin to choose colors coin = randint(0, 1) if coin: color1 = 0, color2 = 1, else: color1 = 1, color2 = 0, # draw page background newPage(w, h) fill(*color1) rect(0, 0, w, h) # draw text name, word = pair fontSize(56) fill(*color2) text(f"Pair: {name} & {word}", (w/2, h/2), align='center') # make all pages for pair in pairs: makePage(pair) # save pdf to disk saveImage('~/Desktop/ruleta.png', multipage=True)
if you don’t understand something, please just ask! cheers
-
@gferreira
probably not pythonic
but i was surprised this works
(if you keep things black and white)coin = randint(0, 1) color1 = coin, color2 = not coin,
-
@jo I thought about that too but then suddenly Yoda appeared:
-
@gferreira thanks, it worked, I'm coming with some new exercises. Cheers.