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()