Das ganze spielt sich der Canvas ab, wo man über einen Klick auf einen Butten ein Eingabefeld erzeugen kann, den man dann per drag&drop organisieren kann.
Dazu hab ich folgendes Objekt mit den Methoden geschrieben:
(Ich hab die Canvas hier Fenster genannt.)
Code: Alles auswählen
from tkinter import *
##Grafik Oberfläche
MainWindow=Tk()
Fenster=Canvas(width=1000, height=600, bg="lightgray")
Fenster.pack(expand=YES, fill=BOTH)
##Hinzufügen-Fenster##
class HinzufügenFenster:
def start(self,x,y):
self.x=x
self.y=y
self.ID=GrafikHinzufügen=Fenster.create_rectangle(0,0,40,20,fill="blue")
##Verbindungen-Hinzufügen##
class HinzufügenVerbindung:
def start(self,x,y):
self.x=x
self.y=y
self.ID=GrafikVerbindung=Fenster.create_rectangle(40,0,80,20,fill="lightblue")
##Positionen##
class Position:
def neu(self,x,y): ##Eingabefeld erzeugen##
self.x=x
self.y=y
GrafikFeld=Fenster.create_rectangle(x,y,x+60,y+20,fill="white", width=2)
self.markiert=False
Fenster.update()
return GrafikFeld ##zum späteren abspeichern in einer Liste##
def schieben(self,x,y): ##verschieben##
self.x=x
self.y=y
Fenster.coords(self.ID,x,y,x+60,y+20)
Fenster.update()
def prüfe(self,x,y): ##Rahmen bei Cursorkontakt hervorheben##
if 0<=x-self.x<=60 and 0<=y-self.y<=20:
Fenster.itemconfig(self.ID, outline="red")
self.markiert=True
else:
Fenster.itemconfig(self.ID, outline="black")
self.markiert=False
Fenster.update()
##Erzeugen der ersten Position##
Feld=Position()
GrafikFeld=Feld.neu(100,100)
Abschnitt=1
Name="Name"
Dauer="Dauer"
Einheit="Einheit"
Feld=[GrafikFeld, Abschnitt, Name, Dauer, Einheit] ##zum Abspeichern der Eigenschaften einer Position##
Felder=[Feld] ##Alle Positionen gemeinsam abgespeichert##
##Funktionen für Keybindings##
def Ziehe(event):
for Feld in Felder:
if Position.markiert:
Position.schieben(event.x, event.y)
def Bewege(event):
for Feld in Felder:
Position.prüfe(event.x,event.y)
xPosition=event.x
yPosition=event.y
def LinksKlick(event):
if 0<=event.x<=40 and 0<=event.y<20: ##Hinzufügen von Feldern##
Position.neu(100,100)
Felder.append(Feld) ##Objekt Feld and Liste Felder anhängen##
Felder[len(Felder)]="Feld"
print(len(Felder)) ##test auf Listenlänge##
print(Felder) ##test auf Listeninhalt##
Fenster.update()
elif 40<=event.x<=80 and 0<=event.y<20: ##Hinzufügen von Verbindungen##
Fenster.update()
##Button zum Hinzufügen##
HinzufügenFenster=HinzufügenFenster()
HinzufügenFenster.start(0,0)
HinzufügenVerbindung=HinzufügenVerbindung()
HinzufügenVerbindung.start(0,40)
##Keybindings##
Fenster.bind("<B1-Motion>", Ziehe)
Fenster.bind("<Motion>", Bewege)
Fenster.bind("<Button-1>",LinksKlick)
MainWindow.update()
MainWindow.mainloop()
"Traceback (most recent call last):
File "C:/..., line 55, in <module>
GrafikFeld=Position.neu(100,100)
TypeError: neu() missing 1 required positional argument: 'y'"
und ich weiß nicht, wie dieser entsteht. Denn wenn ich bei Position.neu einen dritten eintrag mache erhalte ich entweder:"AttributeError: 'int' object has no attribute 'x'" bei Zahlen oder: "NameError: name 'self' is not defined" wenn ich (self,100,100) abfrage.
Wie am Anfang erwähnt, reicht mir vermutlich schon zu wissen wie dieser Fehler entsteht bzw ich erkenne ihn vermutlich einfach nicht, weil ich den Wald vor lauter Bäumen nicht sehe.