【问题标题】:Translating from Turtle to Tkinter, drawing Moroccan Mosaic's从 Turtle 翻译成 Tkinter,绘制摩洛哥马赛克
【发布时间】:2019-11-09 03:25:33
【问题描述】:

我想重现here 所见的美丽摩洛哥马赛克。代码使用的是 Turtle。我想把它翻译成 Tkinter。我很幸运地修改了答案here 中的代码以绘制到画布上。当然有很多缺失,因为没有从原点绘制线。我不知道该怎么做。一个想法是我可能会覆盖 n 个多边形,每个多边形虽然旋转了一些 2 * pi/n 度。这仍然留下了将线从原点获取到每个多边形的初始点和最终点的问题。我认为这并不能完全解决所有问题,但这是一个很好的开始。

或者以某种方式让多边形围绕中心旋转可能更简单?

from tkinter import *
import math
canvas_width = 400
canvas_height =400
python_green = "#476042"

def polygon(canvas,sides=10, radius=100, rotation=0, translation=None, outline=python_green, fill='White', width = 1):
   one_segment = math.pi * 2 / sides
   points = [
       (math.sin(one_segment * i + rotation) * radius + canvas_width/2,
        math.cos(one_segment * i + rotation) * radius + canvas_height/2)
       for i in range(sides)]

   if translation:
       points = [[sum(pair) for pair in zip(point, translation)]
                 for point in points]


   canvas.create_polygon(points, outline=outline, fill='', width=width)

master = Tk()
w = Canvas(master, width=canvas_width, height=canvas_height)
w.pack()
polygon(w,outline='green', width=2)

mainloop()

【问题讨论】:

    标签: tkinter drawing tkinter-canvas


    【解决方案1】:

    您可以使用相同的代码,而无需将其“翻译”为 tkinter - 您只需创建一个 canvas,然后使用 RawTurtle 直接在 canvas 上绘图。

    import turtle
    import tkinter as tk
    
    root = tk.Tk()
    canvas = tk.Canvas(root,width=600,height=600)
    canvas.pack()
    
    #below code same from the linked source
    myPen = turtle.RawTurtle(canvas) #changed from turtle.Turtle()
    myPen.shape("arrow")
    myPen.speed(1000)
    
    def drawMosaic(color1, numberOfSides1, size1, color2, numberOfSides2, size2, numberOfIterations):
        for i in range(0, numberOfIterations):
            myPen.color(color1)
            for j in range(0, numberOfSides1):
                myPen.forward(size1)
                myPen.left(360 / numberOfSides1)
            myPen.color(color2)
            for k in range(0, numberOfSides2):
                myPen.forward(size2)
                myPen.left(360 / numberOfSides2)
    
            myPen.left(360 / numberOfIterations)
    
    drawMosaic("#980C6B", 8, 80, "#DD6BB8", 5, 70, 20)
    
    root.mainloop()
    

    【讨论】:

    • 这行得通,但我相信 OP 的愿望是从旋转和平移的多边形构建他的马赛克,而不是通过海龟微分几何。
    • 可能 - 我将保留答案以供参考。
    • 当然,这是一个很好的方法。
    • 当我包含关闭跟踪器并使笔不可见的代码时,我得到了一个额外的 tk 窗口,即 screen = turtle.Screen() myPen = turtle.Turtle(visible=False) 屏幕。 tracer(False) 你知道怎么解决吗?
    • 我尝试使用多边形的原因是我很难将 Turtle 放入具有透明背景的图像(后记除外)中。然后我可以将它导入 PIL。似乎有一些解决方法,但我都无法开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2019-03-30
    • 2020-09-26
    • 2011-07-30
    相关资源
    最近更新 更多