Is it possible to enter a number, and that a UI loads with the amount of circle that you entered equally spaced vertically? And if yes, how?
Forum Archive
Equally spaced circle in UI
@AZOM, here is one way. Requires that you get the anchor.py from here.
import ui
import dialogs
from anchor import GridView
class CircleView(ui.View):
def layout(self):
self.corner_radius = self.width/2
number_of_cicles = int(dialogs.input_alert('Number of circles'))
g = GridView(count_x=1)
for _ in range(number_of_cicles):
g.add_subview(
CircleView(background_color='green'))
g.present()
@mikael
Well thanks a lot for that but since I’m not so good, how do I get anchor.py ? I saw what is in the link, but what do I do with it?
Download it in your Pythonista working folder.
@AZOM, copy the contents of the file into a file called anchor.py in your site-packages directory or the same directory as your script.
@pavlinb
It is a long 1000+ code, but thanks
@mikael
Ok, thank you
@AZOM if you go here, you can download the zip in your iCloud Drive, unzip it and copy the py to Pythonista
Via split view

@cvp
Thank you a lot, it’s working :)
@AZOM, also, if you install stash, you can just wget a file from a url.
@cvp Is it possible on iPhone (split view)?
@pavlinb Sorry but I don't know. I have a very old iPhone 5s not allowed for iOS 13 nor iPadOS
@pavlinb it seems that does it exist on iPhone but hoped on iOS 14.
It is ok on my iPad mini 4 and it is not very bigger than the biggest iPhone
@cvp, you can open and unzip a zip in Pythonista.
@mikael sure. It was only to show that you can download a file (zip or not) from GitHub without needing a Pythonista script to import it, via iCloud then split view.
I know there are several ways.
We are not yet using a lot download to Files, then drag and drop to another app, like Pythonista
Personally, I use my script
@mikael
How do I change the circle’s position (horizontally) with your code that you first gave me?
@AZOM, GridView has a pack_x argument:
g = GridView(
count_x=1,
pack_x=GridView.START)
Using END instead would move them to the right edge.
You can also control the placement down to the pixel by providing an additional gap argument, which in this case is essentially the distance to the edge.
See the end of this page for the documentation.
@mikael
Yeah, thanks for all.
@adomanim, here you go. You need the vector.py from here.
import ui
import vector
chars = 'ABCDEFGH'
start_angle = 0 # First character on the right
circle_color = 'red'
char_color = 'white'
char_font = ('Apple SD Gothic Neo', 32)
diameter = min(ui.get_screen_size())/2
root = ui.View()
root.present()
pointer = vector.Vector()
pointer.magnitude = diameter/2
pointer.degrees = start_angle
for c in chars:
label = ui.Label(
text=c,
text_color=char_color,
alignment=ui.ALIGN_CENTER,
font=char_font)
label.center = root.bounds.center() + tuple(pointer)
pointer.degrees += 360/len(chars)
root.add_subview(label)
class CircleView(ui.View):
def layout(self):
self.corner_radius = self.width/2
circle = CircleView(
width=diameter, height=diameter,
border_width=1, border_color=circle_color,
center = root.bounds.center()
)
root.add_subview(circle)
circle.send_to_back()
This is for my friend: can someone make a 3 points generator on the circumference of a circle that has a diameter of 2 units. And with these three x, y coordinates, look if the point (0,5:0) is in the triangle made with the three points?
@AZOM, sounds like a school exercise. Wouldn’t it be more useful for your friend to spend the time on cracking it?
@mikael
No, we are in high school, and this is not a homework or something like that, he just like maths and wants help to “verify” his answer to a question he gets somewhere on the web.
@mikael
The only thing I am doing wrong is with rounding up numbers (I think it is my only problem) beau a se if 2 values that I compare are like at 0,000001 appart, they are not equal. Also, I am using cos and sin to try to find the three points. And my friend doesn’t program btw.
@AZOM, try
0.1 + 0.2 == 0.3
If you are not satisfied with the result, you might try to use the Decimal class, where you can also
getcontext().prec == 6
@AZOM, meanwhile, for your problem, I would use ui.Path with the three points, then hit_test with the given point. I do not know whether this would be any more accurate than the method you are using, though.
@mikael
Right, now, I don’t have my program, but I’m going to send it at ~5h pm.
@AZOM, going to get my beauty sleep now, but here’s what I meant by the hit test:
import random
import ui
import vector
random_angle = lambda: random.random() * 360
p = ui.Path()
point = vector.Vector(0, 1)
point.degrees = random_angle()
p.move_to(*point)
print(point)
for _ in range(2):
point.degrees = random_angle()
p.line_to(*point)
print(point)
p.close()
print('IN' if p.hit_test(0.5,0) else 'OUT')
So, are you trying to input 3 points (not all colinear) and find the circle (radius and x,y). Then want to determine if a fourth point is on the edge of the circle?
A simple method is to just subtract the center, then compute the length, then compare to the circle radius. But, as you found, you want to use abs(point_to_center_dist-circle_radius)< threshold, where you'll have to decide what is an acceptable threshold.