Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
似乎无法在作为贝塞尔曲线的像素之间绘制一条线。Python/Tkinter画布_Python_Tkinter - Fatal编程技术网

似乎无法在作为贝塞尔曲线的像素之间绘制一条线。Python/Tkinter画布

似乎无法在作为贝塞尔曲线的像素之间绘制一条线。Python/Tkinter画布,python,tkinter,Python,Tkinter,我似乎无法在旧像素和新像素之间画出平滑的贝塞尔曲线。我有贝塞尔曲线,但它仅仅由像素组成。此外,当我点击画布更新贝塞尔曲线时,我无法删除旧的曲线。我尝试了canvas.deleteline和canvas.deletetetk.ALL,但这会消除一切,我需要能够保留我的单击点或绘制椭圆的位置。任何帮助都将不胜感激 import tkinter as tk #Screen creation. SCREEN_WIDTH = 800 SCREEN_HEIGHT

我似乎无法在旧像素和新像素之间画出平滑的贝塞尔曲线。我有贝塞尔曲线,但它仅仅由像素组成。此外,当我点击画布更新贝塞尔曲线时,我无法删除旧的曲线。我尝试了canvas.deleteline和canvas.deletetetk.ALL,但这会消除一切,我需要能够保留我的单击点或绘制椭圆的位置。任何帮助都将不胜感激

    import tkinter as tk


#Screen creation.
        SCREEN_WIDTH = 800
        SCREEN_HEIGHT = 800
        SIZE = 4


**# Creates the canvas.**
        root_window = tk.Tk()
        canvas = tk.Canvas(root_window, width = SCREEN_WIDTH, height = SCREEN_HEIGHT)

        canvas.pack()

**#Plots each pixel**
        def plot_pixel(x0, y0):
                line = canvas.create_line(x0, y0, x0 + 1, y0)

**#Pre: Takes a list of points.
#Post: Recursively iterates through the list to find the 
#      linear interpolation (x, y)**           
        def draw_curve(points, t):
            if len(points) == 1:
                plot_pixel(points[0][0], points[0][1])
            else:
                newpoints = []
                for i in range(0, len(points) - 1):
                    # old_point_x = (1 - t) * points[i - 1][0] + t * points[i][0]
                    # old_point_y = (1 - t) * points[i - 1][1] + t * points[i][1]
                    x = (1 - t) * points[i][0] + t * points[i + 1][0]
                    y = (1 - t) * points[i][1] + t * points[i + 1][1]
                    newpoints.append((x, y))
                draw_curve(newpoints, t)

递归调用来绘制_曲线,而你知道Tkinter可以自然地绘制bezier曲线吗?或者这是学习如何手动绘制曲线的练习?当您说我尝试了canvas.deleteline时,尝试的结果是什么?假设该行确实包含项目的id,这将删除该行。是的,我知道Tkinter可以绘制它们。这是我正在学习如何手动完成的作业。现在,线性插值的x,y只是像素。当我运行程序时,就像一条虚线,而不是一条连续的整条线,在画布上单击两次后,算法将绘制一条虚线,b/w两个点。如果我第三次单击,我会得到一条Bezier曲线,但是需要删除原始的线b/w点1和点2,只在屏幕上留下Bezier曲线。我从canvas.deleteline获得的结果为零。在绘制新行后,我无法删除上一行。
    #Mouse B-1 bound, for every click draw an oval and append to
        #list -- click_points.
        click_points = []
        def click(event):
            click_points.append((event.x, event.y))
            oval = canvas.create_oval(event.x - SIZE,
                                      event.y - SIZE,
                                      event.x + SIZE,
                                      event.y + SIZE,
                                      fill = "red")
            draw(click_points)


        canvas.bind("<Button-1>", click)   

        root_window.mainloop()