Frage zu Speicherung von erzeugten Objekten

Fragen zu Tkinter.
Antworten
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Hallo zusammen,
ich steige gerade in die Tkinter Programmierung ein und habe ein Programm geschrieben, welches auf einer erzeugten Leinwand, sobald man die linke Maustaste betätigt ein Rechteck an dieser Stelle erzeugt. Das habe ich nun auch alles erfolgreich geschafft. Das einzige was zurzeit noch fehlt, ist das die erzeugten Rechtecke bei erneutem drücken der Maustaste nicht wieder verschwinden.
Wie muss ich das machen, das die Objekte stehen bleiben?

Im folgenden mein Quelltext:

Code: Alles auswählen

from tkinter import *

root = Tk()
Rahmen = Frame(root)
Rahmen.pack()

ZF = Canvas(Rahmen, width = 500, height = 500, bg = 'lightblue')
ZF.pack(side=TOP)

infobox = Label(Rahmen, text = 'Rechtecke auf der Leinwand mit Mausklick links erzeugen.', font = 'Courier')
infobox.pack()
def MausPos(event):
    global Pos
    Pos = event.x, event.y
    print(Pos)
ZF.bind('<Motion>', MausPos)

def Rechtecke(event):
    MausPos(event)
    groesse = 0, 0, 500, 500
    Leinwand = ZF.create_rectangle(groesse, fill = 'lightblue')
    ZF.create_rectangle(Pos[0], Pos[1], Pos[0]+20, Pos[1]+20, fill = 'orange')

ZF.bind('<Button-1>', Rechtecke)


root.mainloop()

Danke für Eure Hilfe!
BlackJack

@duodiscus: Die bleiben ja stehen, Du siehst sie nur nicht weil Du bei jedem Mausklick über alles wieder ein neues hellblaues Rechteck legst.

Das Programm sieht übrigens furchtbar aus! Vergiss das es ``global`` und Sternchenimporte gibt. Das mit der Position in `Pos` sollte auch überflüssig sein, weil das `event`-Objekt das beim Klick-Handler übergeben wird, auch die Position kennen sollte an der gedrückt wurde.
BlackJack

Code: Alles auswählen

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk
from functools import partial


def do_click(canvas, event):
    canvas.create_rectangle(
        event.x, event.y, event.x + 20, event.y + 20, fill='orange'
    )


def main():
    root = tk.Tk()
    frame = tk.Frame(root)
    frame.pack()

    canvas = tk.Canvas(frame, width=500, height=500, bg='lightblue')
    canvas.pack()
    canvas.bind('<Button-1>', partial(do_click, canvas))

    tk.Label(
        frame, text='Rechtecke auf der Leinwand mit Mausklick links erzeugen.'
    ).pack()

    root.mainloop()


if __name__ == '__main__':
    main()
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

@BlackJack: Danke für deinen Kommentar und deinen Hinweis woran es liegt.
Da wir es aber so lernen, kann ich nichts dafür das das Programm so furchtbar aussieht.

z.B.: die Funktion functools(partial) kenne ich gar nicht
BlackJack

@duodiscus: Natürlich kannst Du etwas dafür. Ich bin mir ziemlich sicher das auf den Sternchenimport schon einmal hingewiesen wurde, sowie auf die Wichtigkeit von vernünftigen Namen die nicht kryptische Kürzel sind, sondern dem Leser ohne rätselraten vermitteln was der dahinter stehende Wert im Kontext des Programms bedeutet.

Die Funktion `functools.partial()` kann man kennenlernen, wenn man sie noch nicht kennt. Das `functools`-Modul gehört zur Standardbibliothek und ist auch dokumentiert.
Antworten