python - 使用 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()
解决方案
据我了解,您想重复在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
推荐阅读
- node.js - 如何将日志从 Vercel 无服务器函数 (Next.js) 发送到 Google 云日志
- azure-ad-b2c - 通过分离电子邮件输入和登录注册步骤实施 AD B2C 自定义策略
- continuous-integration - 查找在提交到 Github 时发生了哪些文件夹更改
- javascript - 角度路由变量类型
- angular - 模板内的功能不起作用,但是在模板内设置逻辑时起作用?
- node.js - 未能在 NestJS 中及早加载 env 变量
- azure-api-management - 如何使用基本身份验证保护 Azure Api 网关
- android - 如何在 Jetpack compose 中制作可重用的组件?
- flutter - Flutter POST Http,其中包含命令
- java - 我不断收到错误找不到工件 sun.jdk:jconsole:jar:jdk at specified path /usr/lib/jvm/java-8-openjdk-amd64/jre/../lib/jconsole.jar"