Python中的椭圆工具第2部分

时间:2014-01-05 22:31:50

标签: python pygame paint draw ellipse

我目前正在更改我的椭圆工具的工作方式,因为之前的工作方式不正确。我正在使用python 2.7.5和pygame为我的绘图程序创建它。我最近遇到了这个错误:

Traceback (most recent call last):
File "C:\Users\Wisdom1\Desktop\Comp Science Files\Canvas.py", line 164, in <module>
draw.ellipse(screen,(c),(x,y,radx,rady),sz2)
ValueError: width greater than ellipse radius

当我尝试在每个方向上创建一个椭圆,除了从一个点向右下方之外,就会发生这种情况。我理解错误,我不知道如何解决它。这是我的椭圆工具:

if mb[0] == 1 and canvas.collidepoint(mx,my):
        screen.set_clip(canvas)
        if tool == "ellipse":
            screen.blit(copy,(0,0))
            radx = max(mx-x,1)
            rady = max(my-y,1)
            draw.ellipse(screen,(c),(x,y,radx,rady),sz2)
        screen.set_clip(None)

Sz2是一个大小变量,从10开始,每次向下或向上移动鼠标滚轮时减少或增加3。任何帮助表示赞赏。谢谢

2 个答案:

答案 0 :(得分:1)

您还可以使用以下形式的三元语句:

draw.ellipse(screen,(c),(x,y,radx,rady), sz2 if sz2 < max(radx, raxy) else 0)

此致

另一位梅西学生在周日晚上工作;)

答案 1 :(得分:0)

如果sz2(曲线的粗细)大于椭圆的小半径,则pygame会引发ValueError。因此,您可以使用if-statement

来防止这种情况发生
if sz2 < min(radx, rady)//2:
    pygame.draw.ellipse(self.screen, green, box, sz2)
else:
    # sz2=0 fills the ellipse
    pygame.draw.ellipse(self.screen, green, box, 0)

radxrady是限定椭圆的Rect的宽度和高度。因此,小半径是radxrady的一半。


以下是一些可运行的代码,显示if-statement有效:

"""Based on http://www.pygame.org/docs/tut/intro/intro.html"""
import sys
import pygame

pygame.init()
size = (width, height) = (320, 240)
screen = pygame.display.set_mode(size)
black = (0,0,0)
green = [0, 255, 0]
radx, rady = 50, 70
box = [160-radx//2, 120-rady//2, radx, rady]
width = 1
delta = 2
while True:
    for event in pygame.event.get():
        if ((event.type == pygame.QUIT) or 
            (event.type == pygame.KEYDOWN and 
             event.key == pygame.K_ESCAPE)): 
            sys.exit()
    screen.fill(black)
    if 0 < width < min(radx, rady)//2:
        pygame.draw.ellipse(screen, green, box, width)
    else:
        if width > 0:
            pygame.draw.ellipse(screen, green, box, 0)
        delta *= -1
    width += delta
    pygame.display.flip()
    pygame.time.delay(100)