使用颜色填充Tkinter画布对象之间的空白。

5

Python 2.7.8,Windows 7

我已经创建了一个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

@SDilmac,我想要填充的不仅仅是弧线。我想要填充由弧线和直线所包围的空间。 - Charitoo
@SDilmac 我没有使用命名空间创建任何对象。我添加了两张图片以澄清我想要做什么。 - Charitoo
2个回答

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")

我没有测试过这个,所以可能会出现坐标错误或语法错误,但我认为你会明白我的意思。


矩形应该是这样的: 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的代码,尽管它并没有完全匹配我绘制的线条。

请原谅我的粗糙代码,我只是想在进一步之前快速查看概念证明。

如果速度不重要,则可以计算线条长度。对于标准按钮和标签,它们可以预定义为匹配固定半径。我对使用这些想法制作按钮和标签感兴趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接