Tkinter Y Koordinatı

Girilen koordinat değerlerine göre bir şekil oluşturacak, belli bir noktadan şekle gelen ışınları gösterecek ve bu ışınlar arasında şeklin alanını ikiye böleni belirtecek bir program yazıyorum. Fakat Y koordinatını dönüştürürken sorun yaşıyorum çünkü noktalar orjinin üzerindeyken negatif, orjinin altındayken pozitif değer alıyor. Saatlerdir defalarca farklı yerlerde değişiklikler yaptım ama yine de düzeltemedim. Bunu nasıl düzeletebilirim ve nerede hata yapıyorum?

# -*- coding: utf-8 -*-

from tkinter import *
from tkinter import messagebox as msg
import tkinter.ttk as ttk


class AlanKatiliDogrular(Frame):
    ayirici = ","

    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.parent = parent

        self.canvas = Canvas(self, bg="gray")
        self.hud = Frame(self)


        self.kframe = Frame(self.hud)
        self.kgiren = StringVar()
        self.kgiren.trace(W, self.onayla)
        self.kgirdi = ttk.Entry(self.kframe, textvariable=self.kgiren)
        self.keklebuton = ttk.Button(self.kframe, text="EKLE", command=self.kekle)
        self.kscroll = ttk.Scrollbar(self.kframe)
        self.kliste = Listbox(
            self.kframe,
            height=5,
            state=DISABLED,
            font="Calibri 12 bold",
            yscrollcommand=self.kscroll.set)

        self.kscroll.config(command=self.kliste.yview)
        self.ksilbuton = ttk.Button(self.kframe, text="KALDIR", command=self.kkaldir)
        self.ktumsilbuton = ttk.Button(
            self.kframe,
            text="TÜM NOKTALARI KALDIR",
            command=self.ktumkaldir)

        self.cizbuton = ttk.Button(self.kframe, text="ÇİZ", command=self.ciz)


        self.kgirdi.bind("<Return>", self.kekle)
        self.canvas.bind("<Button-1>", self.click_action)

        self.pack_widgets()
        self.repack_canvas()


    def koor_donustur(self, x=None, y=None): # VARSAYILANA ÇEVİRİRKEN
        if x == None and y == None:
            raise ValueError("En az bir girdi girmelisiniz!")
        elif x == None:
            y += int(self.parent.winfo_screenheight() / 2)
            return y
        elif y == None:
            x += int((self.parent.winfo_screenwidth() - 245) / 2)
            return x
        else:
            x += int((self.parent.winfo_screenwidth() - 245) / 2)
            y += int(self.parent.winfo_screenheight() / 2)
            return (x, y)


    def koor_geri_cevir(self, x=None, y=None): # ÖZEL KOORDİNAT SİSTEMİ
        if x == None and y == None:
            raise ValueError("En az bir girdi girmelisiniz!")
        elif x == None:
            y -= int(self.parent.winfo_screenheight() / 2)
            return y
        elif y == None:
            x -= int((self.parent.winfo_screenwidth() - 245) / 2)
            return x
        else:
            x -= int((self.parent.winfo_screenwidth() - 245) / 2)
            y -= int(self.parent.winfo_screenheight() / 2)
            return (x, y)


    def click_action(self, event):
        if not self.siniri_gecti_mi():
            self.kliste.config(state=NORMAL)
            self.kliste.insert(END, f"{self.koor_geri_cevir(x=event.x)}"
                                    f"{AlanKatiliDogrular.ayirici}"
                                    f"{self.koor_geri_cevir(y=event.y)}")
            self.kliste.config(state=DISABLED)
            self.repack_canvas()


    def repack_canvas(self):
        self.canvas.delete(ALL)
        for i in self.kliste.get(0, END):
            self.canvas.create_oval(
                self.koor_donustur(x=int(i.split(AlanKatiliDogrular.ayirici)[0])) - 3,
                self.koor_donustur(y=int(i.split(AlanKatiliDogrular.ayirici)[1])) - 3,
                self.koor_donustur(x=int(i.split(AlanKatiliDogrular.ayirici)[0])) + 3,
                self.koor_donustur(y=int(i.split(AlanKatiliDogrular.ayirici)[1])) + 3,
                fill="yellow")

        self.canvas.create_line(
            self.koor_donustur(x=0),
            self.koor_donustur(y=self.parent.winfo_screenwidth()) * -1,
            self.koor_donustur(x=0),
            self.koor_donustur(y=self.parent.winfo_screenwidth()),
            fill="dark gray"
        )

        self.canvas.create_line(
            self.koor_donustur(x=self.parent.winfo_screenheight()) * -1,
            self.koor_donustur(y=0),
            self.koor_donustur(x=self.parent.winfo_screenheight()),
            self.koor_donustur(y=0),
            fill="dark gray"
        )


    def ciz(self):
        for i in self.koor_eslesmeler():
            self.canvas.create_line(i[0][0], i[0][1], i[1][0], i[1][1])


    def onayla(self, *args):
        gecerliler = "1234567890-" + AlanKatiliDogrular.ayirici
        veri = self.kgirdi.get()
        gecerli_mi = all(True if i in gecerliler else False for i in veri)
        if not gecerli_mi:
            self.kgiren.set("".join(x for x in veri if x in gecerliler))


    def kekle(self, *args):
        veri = self.kgiren.get().split(AlanKatiliDogrular.ayirici)
        en = self.parent.winfo_screenwidth()
        boy = self.parent.winfo_screenheight()
        if self.giris_gecerli_mi():
            if not self.siniri_gecti_mi():
                self.kliste.config(state=NORMAL)
                self.kliste.insert(END, self.kgirdi.get())
                self.kliste.config(state=DISABLED)
                self.kgirdi.delete(0, END)
                self.repack_canvas()
        else:
            msg.showwarning(
                ">- UYARI -<", "HATALI GİRİŞ YAPTINIZ !\nÖRNEK GİRİŞ: 300{}467".format(AlanKatiliDogrular.ayirici))


    def koor_eslesmeler(self):
        yalinveri = self.kliste.get(0, END)
        ktumliste = list()
        for i in yalinveri:
            anlikveri = i.split(AlanKatiliDogrular.ayirici)
            ktumliste.append(self.koor_donustur(x=int(anlikveri[0]), y=int(anlikveri[1])))

        eslesmeler = list()

        try:
            for i in range(0, len(ktumliste)):
                eslesmeler.append((ktumliste[i], ktumliste[i+1]))
        except IndexError:
            pass
        finally:
            try:
                eslesmeler.append((ktumliste[-1], ktumliste[0]))
            except IndexError:
                pass

        return eslesmeler


    def siniri_gecti_mi(self):
        if len(self.kliste.get(0, END)) < 4:
            return False
        else:
            msg.showwarning(
                ">- UYARI -<",
                "'ŞİMDİLİK' YALNIZCA ÜÇGEN VE\nKARE GİRİŞLERİ YAPABİLİRSİNİZ!")
            return True


    def giris_gecerli_mi(self):
        demo_canvas = Canvas(self)
        try:
            demo_canvas.create_line(self.kgiren.get().split(",")[0],
                                    self.kgiren.get().split(",")[1],
                                    0, 0)
            del demo_canvas
            return True
        except (TclError, IndexError):
            del demo_canvas
            return False


    def kkaldir(self):
        self.kliste.config(state=NORMAL)
        self.kliste.delete(END)
        self.kliste.config(state=DISABLED)
        self.canvas.delete(LAST)
        self.repack_canvas()


    def ktumkaldir(self):
        self.kliste.config(state=NORMAL)
        for i in self.kliste.get(0, END):
            self.kliste.delete(END)
        self.kliste.config(state=DISABLED)
        self.repack_canvas()


    def pack_widgets(self):
        self.canvas.pack(fill=BOTH, expand=TRUE, side=LEFT)
        self.hud.pack(fill=Y, side=RIGHT)


        self.kgirdi.grid(row=0, column=0, columnspan=2, sticky=E+W, pady=1)
        self.keklebuton.grid(row=1, column=0, columnspan=2, sticky=E+W, pady=1)
        self.kliste.grid(row=2, column=0, sticky=E+W, pady=1)
        self.kscroll.grid(row=2, column=1, sticky=N+S, pady=1)
        self.ksilbuton.grid(row=3, column=0, columnspan=2, sticky=E+W, pady=1)
        self.ktumsilbuton.grid(row=4, column=0, columnspan=2, sticky=E+W, pady=1)
        self.kframe.pack(side=RIGHT)

        ttk.Separator(self.kframe, orient=HORIZONTAL).grid(row=5, columnspan=2, pady=40)

        self.cizbuton.grid(row=6, column=0, columnspan=2, sticky=E+W)


def main():
    root = Tk()
    root.title("PENCERE"*30)
    root.minsize(650, 400)

    g1 = AlanKatiliDogrular(root)
    g1.pack(fill=BOTH, expand=TRUE)


    root.mainloop()


if __name__ == '__main__':
    main()

Amacınız tam olarak anlayamadım. Kodunuzu çalıştırıp bir kare oluşturdum. Şimdi ne yapmak istiyorsunuz?

1 Beğeni

Şimdilik bir işlevi yok işlevleri sonra ekleyeceğim. Şuan tek sorunum Y koordinatlarındaki hata.

Sanırım çizilen şekli ikiye böleceksiniz, ancak bu bölme işlemi sonrasında oluşan iki parçanın da alanı eşit olacak. Siz de bu çizgiyi bulmaya çalışıyorsunuz, doğru mu?

1 Beğeni

Evet öyle yapacağım fakat şuan o sorun değil. Sorun Y koordinatı

Noktaların koordinatlarını analitik düzlemdeki haline dönüştürmeye mi çalışıyorsunuz?

1 Beğeni

Yapmaya çalıştım :smiley:

Kodunuz biraz uzun, bu işlemi hangi fonksiyon içerisinde yapmaya çalıştığınızı öğrenebilir miyim? koor_donustur mü bu fonksiyon?

1 Beğeni

Şu iki metod ile yapmaya çalıştım.

NOT: 245 sağ taraftaki giriş alanının X doğrultusunda kapladığı yer.

EKLE butonu kullanılarak eklenen noktalar çizilmiyor sanki?

1 Beğeni

Bende öyle bir sıkıntı yok.

Ben pozitif sayılar seçtiğim için olmuş , kusura bakmayın. Şuan ekranda gözüken koordinatlar yanlış değil mi?

1 Beğeni

Evet Y koordinatları ters. Ve evet return ederken -1 ile çarpmayı denedim :smiley: .

winfo_screenheight() ve winfo_screenwidth() fonksiyonlarının monitor çözünülürlüğünü verdiğinin farkında mısınız? Galiba onların canvasın büyüklüğünü döndürdüğünü düşünerek yazmışsınız kodunuzu.

1 Beğeni

Aslında farkında olarak yazdım çünkü canvas’ın büyüklüğünün değişken olabilceğini düşündüm. Tabi daha güzel bir öneride bulunursanız tekliflere açığım :smiley:

Bence kodunuzun yanlış değer döndürmesinin sebeblerinden biri bu, çünkü canvas monitör çözünülürlüğü ile doğru oğrantılı değil. Burada canvasın uzunluk ve yüksekliğini kullanmamız lazım, çünkü canvasın orta noktasını 0,0 olarak alacağız. Monitörün büyüklüğü bir değişime sebep olmuyor. Bu arada pencereyi yeni büyüttüm, canvasın büyüklüğünü şimdi fark ettim :smiley: . Ama yine de canvasın sabit bir büyüklükte olması lazım.

1 Beğeni

Canvas büyüklüğünü almayı denedim ve biraz absürt bir sonuç aldım.

Hatanın canvas büyüklüğünden kaynaklanmadığına eminim ve pencerenin yeniden boyutlanabilir olmasını istiyorum.

Bence hata ya işlemlerimde ya da bir yerde bir şeyi yanlış yazdım.

Evet, kodunuzu yeni anlamaya başladım, biraz yavaş oldu :slightly_smiling_face: . Şimdi düzelteceğim, matematiksel bir hata yapmışsınız. Doğrusu bu

f-stringler kodun okunurluğunu azaltmış, yeni anladım.

1 Beğeni

Bir değişiklik göremiyorum.

Aslında algoritmanızı çok daha kolay yapabilecek iken işleri zorlaştırmışsınız. Ben de nasıl düzelteceğim üzerine düşünüyorum.

1 Beğeni