簡體   English   中英

Tkinter 獲取坐標的平均值

[英]Tkinter getting the average of coordinates

我查找了類似的主題,但找不到我一直在處理的問題的答案。 讓我完整地解釋一下情況。

我用橢圓制作了一個 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 *

停止按鈕運行該功能。 讓我解釋一下數字有什么問題。 選擇對象1時,坐標是真的。 例如,當我只選擇對象 1 時,我得到:

[25.0,25.0]

當我只選擇對象 2 時,我得到:

[40.0,75.0]

但是當我同時選擇這兩個對象時,我得到:

[25.0, 25.0, 32.5, 50.0, 40.0, 75.0]

如您所見,存在不必要的值。 我想從每個對象中獲取 2 個值,任何幫助將不勝感激。

您應該為liste6每 4 個項目liste6 x, y :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM