Я изменил предложение от saulspatz, чтобы исправить координаты следующим образом. К сожалению, он рисует линии для дуг и прямоугольников. Я добавил width = 0, но по какой-то причине все еще вижу некоторые строки. Один из вариантов может заключаться в том, чтобы нарисовать эти строки с линией цвета заливки. Кажется немного утомительным.
class Rounded():
def __init__(self, canvas, x1, y1, x2, y2, r, color='red'):
self.canvas = canvas
self.canvas.create_arc(x1, y1, x1+r, y1+r, start=90, extent=90, style=TK.PIESLICE, fill = color, width=0)
self.canvas.create_arc(x2-r, y1, x2, y1+r, start=0, extent=90, style=TK.PIESLICE, fill = color, width=0)
self.canvas.create_arc(x1, y2-r, x1+r, y2, start=180, extent=90, style=TK.PIESLICE, fill = color, width=0)
self.canvas.create_arc(x2-r, y2-r, x2, y2, start=270, extent=90, style=TK.PIESLICE, fill = color, width=0)
self.canvas.create_rectangle(x1+r/2, y1, x2-r/2, y2, fill=color, width=0)
self.canvas.create_rectangle(x1, y1+r/2, x2, y2-r/2, fill=color, width=0)
Я тогда подумал о чертеже горизонтальных линий. Преимущество здесь в том, что вы можете реализовать градиент для объекта. Код здесь: -
def using_lines(self):
# Try to draw rounded rectangle using lines!
xx = [3,5,6,7,8,8,9,9,9,10]
zz = [10,9,9,9,8,8,7,6,5,3]
x = 10
y = 150
width = 100
height = 30
radius = 10
#self.canvas.create_rectangle(x,y,x+width, y+height)
r_width = width - 2*radius
left = x + radius
right = x + width - radius
for r in range(radius):
self.canvas.create_line(left, y+r, right, y+r, fill='green')
left = x + radius - xx[r]
right = x + width - radius + xx[r]
for r in range(height - 2 * r):
self.canvas.create_line(x, y+radius+r, x + width, y+radius+r, fill='green')
left = x
right = x + width
top = y + height - radius
for r in range(radius):
self.canvas.create_line(left, top+r, right, top+r, fill='green')
left = x + (radius - zz[r])
right = x + width - radius + zz[r]
Я догадывался цифры, чтобы рисовать линии разной длины, чтобы соответствовать дуге, но я уверен, что расчет может быть разработан.
Линии могут иметь одинаковый тег, поэтому изменение всего цвета легко. Чтобы добавить границу, я также добавил код из Charlito, хотя он точно не соответствовал строкам, которые я рисовал.
Простите грубый код, я просто хотел быстро взглянуть на доказательство концепции, прежде чем идти дальше.
Если скорость не важна, то можно рассчитать длину линии. Для стандартных кнопок и меток они могут быть предварительно определены так, чтобы они соответствовали фиксированному радиусу. Я заинтересован в создании кнопок и ярлыков из этих идей.
@SDilmac Это не только дуги, которые я хочу заполнить. Я хочу заполнить пространство, заключенное дугой и линиями. – Charitoo
@SDilmac Я не создаю объект с пространством имен. Я добавил два изображения для разъяснения того, что я хочу сделать. – Charitoo