2015-07-27 1 views
3

Python 2.7.8, Windows 7заполняющей пространство между объектами Tkinter холста с цветом

Я подклассы холста виджета Tkinter и я добавил новый метод, чтобы создать прямоугольник с закругленными краями.

import Tkinter as tk 

class MyCanvas(tk.Canvas): 
    def __init__(self, *args, **kwargs): 
     tk.Canvas.__init__(self, *args, **kwargs) 

    def create_rounded(self, x1, y1, x2, y2, r): 
     self.create_arc(x1, y1, x1+r, y1+r, start=90, extent=90, style=tk.ARC) 
     self.create_arc(x2-r, y1, x2, y1+r, start=0, extent=90, style=tk.ARC) 
     self.create_arc(x1, y2-r, x1+r, y2, start=180, extent=90, style=tk.ARC) 
     self.create_arc(x2-r, y2-r, x2, y2, start=270, extent=90, style=tk.ARC) 
     self.create_line(x1+r/2, y1, x2-r/2, y1) 
     self.create_line(x1, y1+r/2, x1, y2-r/2) 
     self.create_line(x1+r/2, y2, x2-r/2, y2) 
     self.create_line(x2, y1+r/2, x2, y2-r/2) 

Я хочу заполнить закругленный прямоугольник, который я создал одним цветом. Как мне это сделать?

This is what I get when I run with some parameters

This is what I want

+0

@SDilmac Это не только дуги, которые я хочу заполнить. Я хочу заполнить пространство, заключенное дугой и линиями. – Charitoo

+0

@SDilmac Я не создаю объект с пространством имен. Я добавил два изображения для разъяснения того, что я хочу сделать. – Charitoo

ответ

2

Вместо того чтобы рисовать наброски и пытаясь заполнить интерьер с красным, то почему бы не создать скругленный прямоугольник из ранее существовавших объектов холст? Четыре круглых кусочка пирога для углов и два прямоугольника, образующих крест? Что-то вроде этого:

import Tkinter as tk 

class MyCanvas(tk.Canvas): 
    def __init__(self, *args, **kwargs): 
     tk.Canvas.__init__(self, *args, **kwargs) 

    def create_rounded(self, x1, y1, x2, y2, r): 
     self.create_arc(x1, y1, x1+r, y1+r, start=90, extent=90, style=tk.PIESLICE, fill = "red") 
     self.create_arc(x2-r, y1, x2, y1+r, start=0, extent=90, style=tk.PIESLICE, fill = "red") 
     self.create_arc(x1, y2-r, x1+r, y2, start=180, extent=90, style=tk.PIESLICE, fill = "red") 
     self.create_arc(x2-r, y2-r, x2, y2, start=270, extent=90, style=tk.PIESLICE, fill = "red") 
     self.create_rectangle(x1+r/2, y1-r/2, x2-r/2, y2+r/2, fill = "red") 
     self.create_rectangle(x1, y1, x2, y2, fill="red") 

Я не проверял это, так что я, возможно, получили координаты неправильно, или положить в синтаксической ошибки, но я думаю, вы увидите, что я имею в виду.

+0

Прямоугольники должны быть self.create_rectangle (x1 + r/2, y1, x2-r/2, y2, fill = color) self.create_rectangle (x1, y1 + r/2, x2, y2-r/2, fill = color) Но это оставляет черные линии – jimscafe

0

Я изменил предложение от 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, хотя он точно не соответствовал строкам, которые я рисовал.

Простите грубый код, я просто хотел быстро взглянуть на доказательство концепции, прежде чем идти дальше.

Если скорость не важна, то можно рассчитать длину линии. Для стандартных кнопок и меток они могут быть предварительно определены так, чтобы они соответствовали фиксированному радиусу. Я заинтересован в создании кнопок и ярлыков из этих идей.

Смежные вопросы