英文:
How do I compress repeating tkinter code into a loop so it displays rectangles without having to write out each individual rectangle's coordinates?
问题
from tkinter import *
c = Canvas(width=800, height=600, bg="White")
rectangles = []
for x in range(50, 500, 40):
rectangles.append(c.create_rectangle(x, 50, x + 20, 150, outline="Blue",
width=2, fill="Gray", activefill="Red"))
for rect in rectangles:
c.tag_bind(rect, "<Enter>", lambda event, rect=rect: c.itemconfig(rect, fill="Red"))
c.tag_bind(rect, "<Leave>", lambda event, rect=rect: c.itemconfig(rect, fill="Gray"))
c.pack()
mainloop()
这段代码将原来重复的矩形绘制过程用循环简化了,同时添加了鼠标悬停事件,以改变矩形的颜色。
英文:
I have some code that repeats that I would like to compress into a loop somehow. The code is meant to show a series of rectangles that change color when your mouse hovers over them, and because I have numerous rectangles, all of the code repeating is the same except for 2 coordinates for the location of my rectangles. Therefore, I want to somehow compress the following code into a loop:
from tkinter import *
c=Canvas(width=800, height=600, bg="White")
c.create_rectangle(50,50,70,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(90,50,110,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(130,50,150,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(170,50,190,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(210,50,230,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(250,50,270,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(290,50,310,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(330,50,350,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(370,50,390,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(410,50,430,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(450,50,470,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.create_rectangle(490,50,510,150,outline="Blue",
width=2,fill="Gray",activefill="Red")
c.pack()
mainloop()
My first idea to approaching this was setting the original rectangle dimensions to (x, 50, y, 150), setting x=50 and y=70, and then somehow incorporating that while x<=490 and y<=510, x=x+40. However, I don't know how to incorporate all of this into a loop.
答案1
得分: 3
这是您要使用while
循环进行的更改:
from tkinter import *
c = Canvas(width=800, height=600, bg="White")
cords = [50, 50, 70, 150]
while cords[0] <= 490 and cords[2] <= 510:
c.create_rectangle(cords, outline="Blue", width=2, fill="Gray", activefill="Red")
cords[0] += 40
cords[2] += 40
c.pack()
mainloop()
英文:
This is the alteration you are looking for using a while
loop:
from tkinter import *
c = Canvas(width=800, height=600, bg="White")
cords = [50, 50, 70, 150]
while cords[0] <= 490 and cords[2] <= 510:
c.create_rectangle(cords, outline="Blue", width=2, fill="Gray", activefill="Red")
cords[0] += 40
cords[2] += 40
c.pack()
mainloop()
答案2
得分: 1
你可以使用for
循环来完成这个操作,使用一些数学来更新每次迭代的偏移量,因为它们总是以相同的数量更改。
c = Canvas(width=800, height=600, bg="White")
# 'range(12)'返回一个包含12个数字的序列,从0到11
# 你可以使用for循环迭代这个序列
for i in range(12):
# 计算偏移量
x1 = (40 * (i + 1) + 10)
x2 = (40 * (i + 1) + 30)
# 创建坐标元组
coords = (x1, 50, x2, 150)
# 使用适当的坐标创建一个矩形
c.create_rectangle(coords, outline="Blue", width=2, fill="Gray", activefill="Red")
注意,我在i
的值上加了1,因为range
可迭代对象从0开始。
英文:
You can do this with a for
loop, using some math to update the offsets each iteration since they always change by the same amount
c = Canvas(width=800, height=600, bg="White")
# 'range(12)' returns a sequence of 12 numbers, from 0 to 11
# you can iterate over that sequence with a for loop
for i in range(12):
# calculate offsets
x1 = (40 * (i + 1) + 10)
x2 = (40 * (i + 1) + 30)
# create a tuple of coordinates
coords = (x1, 50, x2, 150)
# create a rectangle with the appropriate coordinates
c.create_rectangle(coords, outline="Blue", width=2, fill="Gray", activefill="Red")
Note that I'm adding 1 to the value of i
because range
iterables start at 0
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论