首页 > 解决方案 > 使用 Tkinter 创建重复行

问题描述

我正在尝试创建一个类似于绘画的程序,该程序允许您绘制一条线,从而创建一个重复线网格,形成一个基本的镶嵌结构作为最终结果。我已经使用 Tkinter 编写了一个基本程序,但是,我没有太多使用 Tkinter 甚至 python 的经验。目前,我可以画两条并排的线,但也可以在每个新点处连接。我知道我的代码可能不那么出色(事实上,它可能很糟糕)。

编辑:它不会让我在我的帖子中嵌入图像,所以这里是一个通用的链接,如果草率,我希望程序生成的示例。

第二次编辑:我在我的代码上做了更多工作并稍微改进了它,但是我的第二行和第三行实例连接到原始行时仍然存在问题:

from tkinter import *
from tkinter import ttk

lastx, lasty = 0, 0
points = [(100,100),(300,100),(300,300),(100,300)]
c=1

def xy(event):
    global lastx, lasty
    lastx, lasty = event.x, event.y

def xy(event):
    global lastx2, lasty2
    lastx2, lasty2 = event.x+200, event.y+200


def addLine(event):
    global lastx, lasty
    canvas.create_line((lastx, lasty, event.x, event.y))
    lastx, lasty = event.x, event.y

def newLine1(event):
    global lastx2, lasty2
    canvas.create_line((lastx2, lasty2, event.x-200, event.y))
    lastx2, lasty2 = event.x, event.y

def newLine2(event):
    global lastx2, lasty2
    canvas.create_line((lastx2, lasty2, event.x, event.y-200))
    lastx2, lasty2 = event.x, event.y

def LineCreate(event):
    addLine(event)
    newLine1(event)
    newLine2(event)

root = Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

canvas = Canvas(root)
canvas.grid(column=0, row=0, sticky=(N, W, E, S))
canvas.bind("<Button-1>", xy)
canvas.bind("<B1-Motion>", LineCreate)
canvas.create_polygon(points, outline='#f11',
            fill='#1f1', width=2)


root.mainloop()

来自 tkinter 的旧代码导入 * 从 tkinter 导入 ttk

lastx, lasty = 0, 0
points = [(100,100),(300,100),(300,300),(100,300)]
c=1

def xy(event):
    global lastx, lasty
    lastx, lasty = event.x, event.y

def xy(event):
    global lastx2, lasty2
    lastx2, lasty2 = event.x+50, event.y+50


def addLine(event):
    global lastx, lasty
    canvas.create_line((lastx, lasty, event.x, event.y))
    lastx, lasty = event.x, event.y

def addLine(event):
    global lastx2, lasty2
    canvas.create_line((lastx2, lasty2, event.x+50*c, event.y))
    lastx2, lasty2 = event.x+5, event.y+5

root = Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

canvas = Canvas(root)
canvas.grid(column=0, row=0, sticky=(N, W, E, S))
canvas.bind("<Button-1>", xy)
canvas.bind("<B1-Motion>", addLine)


root.mainloop()

标签: pythontkinter

解决方案


据我了解,您想重复在polygon区域内绘制的图案(实际上您可以使用rectangle代替polygon),下面是一个示例:

def xy(event):
    global lastx, lasty
    lastx, lasty = event.x, event.y

def LineCreate(event):
    global lastx, lasty
    # draw the base pattern
    canvas.create_line((lastx, lasty, event.x, event.y))
    # duplicate the pattern
    repeat = 5
    for row in range(repeat):
        for col in range(repeat):
            if row or col: # don't draw on the original again
                canvas.create_line((lastx+col*200, lasty+row*200, event.x+col*200, event.y+row*200))
    lastx, lasty = event.x, event.y # save the last point

推荐阅读