I’m wondering if it is possible to use something like console.alert() to show the user some text rendered in different colors. Would someone have an idea as to how to achieve this as simply and easily as possible? I would really appreciate it. Thanks so much for taking the time to answer.
Forum Archive
Is it possible to present an alert with multicolored text in a Pythonista script?
I believe the dialogs module (or easy mod to dialogs) would allow changing tint color. It would also be possible to show formatted text, though that is a little more complex.
@JonB yes, but dialogs presents a modal view and if you tap outside, you close it.
Console.alert is not closed if you tap outside, why?
@JonB Thanks for the reply. Would changing the tint color make it possible to display multicolored text? I would prefer something like an alert, but I would use a dialog if it allows displaying the text in a mixture of various colors.
@jaalburquerque tint_color seems to work only for switch and check fields types. Sorry for you
@jaalburquerque a Quick and dirty script as starting point for you.
import ui
def myalert(title, message, button1, button2=None, button3=None, hide_cancel_button=False):
v = ui.View()
v.background_color = 'white'
w = 270
y = 10
lt = ui.Label()
lt.font = ('Menlo',16)
lt.text_color = 'red'
lt.text = title
lt.alignment = ui.ALIGN_CENTER
lt.number_of_lines = 0
y += 10
lt.frame = (10,y,w-2*10,lt.font[1])
lt.size_to_fit()
ht = lt.height
lt.frame = (10,y,w-2*10,ht)
v.add_subview(lt)
y += ht
lm = ui.Label()
lm.font = ('Menlo',16)
lm.text_color = 'green'
lm.text = message
lm.alignment = ui.ALIGN_CENTER
lm.number_of_lines = 0
y += 10
lm.frame = (10,y,w-2*10,lt.font[1])
lm.size_to_fit()
hm = lm.height
lm.frame = (10,y,w-2*10,hm)
v.add_subview(lm)
y += hm
li = ui.Label()
y += 10
li.frame = (0,y,w,1)
li.border_width = 1
li.border_color = 'lightgray'
v.add_subview(li)
b = ui.SegmentedControl()
segments = []
if not hide_cancel_button:
segments.append('cancel')
if button1:
segments.append(button1)
if button2:
segments.append(button2)
if button3:
segments.append(button3)
x = 10
y += 10
wb = (w - 10*(len(segments)+1))/len(segments)
v.ret = None
def b_action(sender):
v.ret = sender.ret
v.close()
for i in range(len(segments)):
b = ui.Button()
b.font = ('<System-Bold>', 20)
b.title = segments[i]
b.ret = i
b.action = b_action
b.frame = (x,y,wb,24)
v.add_subview(b)
if i < (len(segments)-1):
lv = ui.Label()
lv.border_width = 1
lv.border_color = 'lightgray'
lv.frame = (x+wb+5,li.y,1,y+b.height+10-li.y)
v.add_subview(lv)
x += wb + 10
y += b.height + 10
v.frame = (0,0,w,y)
v.present('sheet', hide_title_bar=True)
v.wait_modal()
return v.ret
b = myalert('title, up to you to add color and even font parameters','message, supports long texts', button1='yes', button2='no')
print(b)

@jaalburquerque as adviced by @JonB , you can use ObjectiveC text attributes
import random
from objc_util import *
.
.
.
lt.text = title
# set color attributes
attrtext = ObjCClass('NSMutableAttributedString').alloc().initWithString_(title)
for i in range(len(title)):
color = ObjCClass('UIColor').colorWithRed_green_blue_alpha_(random.random(), random.random(), random.random(), 1.0)
attrtext.addAttribute_value_range_('NSColor',color,NSRange(i, 1))
ObjCInstance(lt).setAttributedText_(attrtext)

@cvp Okay. I believe that you have both given me enough information and exemplification to achieve what I am trying to do. I believe that the code particularly will be very useful to me. Thank you both very much.
@JonB Thankyou for Providing Useful Information. 9apps cartoon hd