python - Tkinter 获取坐标的平均值
问题描述
我查找了类似的主题,但找不到我一直在处理的问题的答案。让我彻底解释一下情况。
我用椭圆制作了一个 python GUI,我想得到这些椭圆的坐标。当他们被标记时。
我已经成功获得坐标,但似乎 tkinter 给了我 4 个值(x1,x2,y1,y2)。我更喜欢只有 x 和 y 坐标。
当我咨询了另一个主题来解决这个问题时,我已经明确表示我自己并不清楚。我的问题只是令人困惑。
所以我有 92 个椭圆,我只想使用坐标函数得到 x 和 ys。
这是完整的代码(我删除了不必要的细节。
from tkinter import Tk
import tkinter
top = tkinter.Tk()
canvas = tkinter.Canvas(top, bg="white", height=1000, width=1000)
liste=[]
liste5=[]
liste6=[]
liste7=[]
X=[]
a=0
for i in range(4):
for ii in range(12):
y=canvas.create_oval(10 + ii * 50, 10 + i * 100, 40 + ii * 50, 40 + i * 100, fill="blue", activefill="red")
if ii != 11:
x=canvas.create_oval(25 + ii * 50, 60 + i * 100, 55 + ii * 50, 90 + i * 100, fill="blue", activefill="red")
def groups(glist, numPerGroup=2):
result = []
i = 0
cur = []
for item in glist:
if not i < numPerGroup:
result.append(cur)
cur = []
i = 0
cur.append(item)
i += 1
if cur:
result.append(cur)
return result
def average(points):
aver = [0, 0]
for point in points:
aver[0] += point[0]
aver[1] += point[1]
return aver[0] / len(points), aver[1] / len(points)
class RectTracker:
def __init__(self, canvas):
self.canvas = canvas
self.item = None
def draw(self, start, end, **opts): #seçim için oluşan rectanglei oluşuturuyor..
"""Draw the rectangle"""
return self.canvas.create_rectangle(*(list(start) + list(end)), **opts)#this one makes us draw the rectangle
def autodraw(self, **opts): #classın içindeki çizim fonksiyonu aşağıda autodraw fonksiyonuyla bunun çağrıyor.
"""Setup automatic drawing; supports command option"""
self.start = None
self.canvas.bind("<Button-1>", self.__update, '+')
self.canvas.bind("<B1-Motion>", self.__update, '+')
self.canvas.bind("<ButtonRelease-1>", self.__stop, '+')
# self.canvas.bind("<Button-1>", mm.select)
# self.canvas.bind("<Button-1>",find_enclosed(x1,y1,x2,y2))
self._command = opts.pop('command', lambda *args: None)
self.rectopts = opts
def __update(self, event):
if not self.start:
self.start = [event.x, event.y]
return
if self.item is not None:
self.canvas.delete(self.item)
self.item = self.draw(self.start, (event.x, event.y), **self.rectopts)
self._command(self.start, (event.x, event.y))
def __stop(self, event):
self.start = None
self.canvas.delete(self.item)
self.item = None
def hit_test(self, start, end, tags=None, ignoretags=None, ignore=[]):
"""
Check to see if there are items between the start and end
"""
ignore = set(ignore)
ignore.update([self.item])
# first filter all of the items in the canvas
if isinstance(tags, str):
tags = [tags]
if tags:
tocheck = []
for tag in tags:
tocheck.extend(self.canvas.find_withtag(tag))
else:
tocheck = self.canvas.find_all()
tocheck = [x for x in tocheck if x != self.item]
if ignoretags:
if not hasattr(ignoretags, '__iter__'):
ignoretags = [ignoretags]
tocheck = [x for x in tocheck if x not in self.canvas.find_withtag(it) for it in ignoretags]
self.items = tocheck
# then figure out the box
xlow = min(start[0], end[0])
xhigh = max(start[0], end[0])
ylow = min(start[1], end[1])
yhigh = max(start[1], end[1])
items = []
for item in tocheck:
if item not in ignore:
x, y = average(groups(self.canvas.coords(item)))
if (xlow < x < xhigh) and (ylow < y < yhigh):
items.append(item)
return items
def onDrag(start, end):#ondrag fonksiyonuyla kareyi oluşturduğunu görebiliriz.
canvas.itemconfig('kirmizi',tags=('blue'))
global x, y
items = rect.hit_test(start, end)
for x in rect.items:
if x not in items:
canvas.itemconfig(x, fill='blue')
else:
canvas.itemconfig(x, fill='red')
canvas.itemconfig(x,tags=('kirmizi'))
liste.append(canvas.find_withtag('kirmizi'))
liste7.append(canvas.coords(canvas.find_withtag('kirmizi')))
# liste.append(canv.find_withtag('kirmizi'))
#soneleman=liste[-1]
rect=RectTracker(canvas)
rect.autodraw(fill="", width=2, command=onDrag)
def coordinates():
liste5.clear()
tagliler=canvas.find_withtag('kirmizi')
liste5.extend(tagliler)
liste6.clear()
for i in liste5:
liste6.extend(canvas.coords(i))
output = []
for i in range(len(liste6)-2):
output.append((liste6[i] + liste6[i + 2])/2)
print(output)
b1=tkinter.Button(canvas,text="stop",command=coordinates)
b1.place(x=900,y=200)
canvas.pack()
top.mainloop()
if __name__ == '__main__':
try:
from tkinter import *
except ImportError:
from Tkinter import *
停止按钮运行该功能。让我解释一下数字有什么问题。When object 1 is selected the coordinates are true. 例如,当我只选择对象 1 时,我得到:
[25.0,25.0]
当我只选择对象 2 时,我得到:
[40.0,75.0]
但是当我同时选择这两个对象时,我得到:
[25.0, 25.0, 32.5, 50.0, 40.0, 75.0]
如您所见,存在不必要的值。我想从每个对象中获取 2 个值,任何帮助将不胜感激。
解决方案
您应该为 中的每 4 个项目计算中心 x、y liste6
:
for i in range(0, len(liste6), 4):
output.append((liste6[i] + liste6[i+2])/2) # center x
output.append((liste6[i+1] + liste6[i+3])/2) # center y
推荐阅读
- redis - Redis: Sort keys from lists by number of elements
- ios - 带有“首选大标题”和嵌入式 PageViewController 的导航栏不折叠
- sql-server - Why does Linq To Entities create query that is not optimized
- css - Are there limitations to pseudo-class selector in incognito
- javascript - 使用 jQuery 点击更改当前 URL
- python - 如何将某些行文本、可变位置移动到特定列
- reactjs - 条件检查在反应组件中没有按预期工作
- gitlab - How to setup Gitlab EE with HTTPS on a DirectAdmin Server?
- sql - How to Round Decimal Result of a Calculated Column in Oracle SQL
- msbuild - Msbuild 警告不会破坏构建