Seite 1 von 1

Erweitert!

Verfasst: Donnerstag 11. Juni 2009, 14:15
von meister56
ich habe ja schon mal um Hilfe gebeten, weil ich nicht hinbekommen habe einen Punkt mit der Maus zu erstellen und dann auch noch mit der selben Maustaste verschieben zu können!
Das vertige programm das ich mit eurer hilfe und mit der meines Freundes geschaft habe sieht jetzt so aus:

Code: Alles auswählen

from Tkinter import *

item_liste=[]
overlap_objekt=None
dragged=False

# x und y koordinaten
start_x=0
start_y=0

def klick(event):
    global overlap_objekt
   
    mouse_x, mouse_y=event.x, event.y
    overlap_objekt=canvas.find_overlapping(mouse_x-5, mouse_y-5, mouse_x+5, mouse_y+5)

    if overlap_objekt==():
        objekt=canvas.create_oval(mouse_x-4, mouse_y-4, mouse_x+4, mouse_y+4, fill='black')
        canvas.tag_bind(objekt, '<Button-1>', drag)
        canvas.tag_bind(objekt, '<ButtonRelease-1>', drop)
        canvas.tag_bind(objekt, '<Enter>', enter)
        canvas.tag_bind(objekt, '<Leave>', leave)
        canvas.tag_bind(objekt, '<Motion>', move)
        return
       

def drag(event):
    global dragged, start_x, start_y
    start_x, start_y=event.x, event.y
    dragged=True
    canvas.config(cursor='fleur')

def drop(event):
    global dragged
    dragged=False
    canvas.config(cursor='')
    print event.x, event.y

def move(event):
    global overlap_objekt, start_x, start_y, dragged
    if dragged:
        vektor=(event.x-start_x, event.y-start_y)
        canvas.move(overlap_objekt, vektor[0], vektor[1])
        start_x, start_y=event.x, event.y
       
def enter(event):
    canvas.config(cursor='hand2')

def leave(event):
    canvas.config(cursor='')


# Tk objekte
fenster=Tk()
canvas=Canvas(fenster, width=400, height=400)
canvas.pack()

# binds
canvas.bind('<Button-1>', klick) 
Jetzt habe ich lange probiert eine Erweiterung hierzu zu schreiben!
Es sollte einen Button geben welcher dann eine Funktion auslöst!(Das war ja kein Problem!) In dieser Funktion sollte das Programm warten bis ich zuerst einen und dann einen anderen Punkt den ich erstellt habe ausgewählt habe und diese zwei dann verbinden!
->Daran bin ich gescheitert! Kann mir da jemand helfen?

gruß meister56

Verfasst: Donnerstag 11. Juni 2009, 20:24
von problembär
Hi,

schreib' das mal lieber so:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import Tkinter

class TkWin:

    def __init__(self):

        self.item_liste=[]
        self.overlap_objekt = None
        self.dragged = False
        self.lineMode = False
        self.lineVals = []

        self.start_x = 0
        self.start_y = 0

        self.pointsize = 5

        self.fenster = Tkinter.Tk()
        self.fenster.title("Graphics")
        self.fenster.geometry("+324+173")
        self.fenster.bind('<Control-q>', self.quit)

        self.canvas = Tkinter.Canvas(self.fenster,
                                     width = 400,
                                     height = 400)

        self.canvas.bind('<Button-1>', self.klick)

        self.canvas.pack()
        self.button = Tkinter.Button(self.fenster,
                                     text = "DrawLine",
                                     command = self.drawLine)
        self.button.pack(side = Tkinter.RIGHT)
        self.fenster.mainloop()

    def klick(self, event):
    
        mouse_x = event.x
        mouse_y = event.y

        self.overlap_objekt = self.canvas.find_overlapping(mouse_x - self.pointsize,
                                                           mouse_y - self.pointsize,
                                                           mouse_x + self.pointsize,
                                                           mouse_y + self.pointsize)

        if not self.overlap_objekt:

            objekt = self.canvas.create_oval(mouse_x - self.pointsize + 1,
                                             mouse_y - self.pointsize + 1,
                                             mouse_x + self.pointsize - 1,
                                             mouse_y + self.pointsize - 1,
                                             fill = 'black')

            self.canvas.tag_bind(objekt, '<Button-1>', self.drag)
            self.canvas.tag_bind(objekt, '<ButtonRelease-1>', self.drop)
            self.canvas.tag_bind(objekt, '<Enter>', self.enter)
            self.canvas.tag_bind(objekt, '<Leave>', self.leave)
            self.canvas.tag_bind(objekt, '<Motion>', self.move)

        if self.lineMode:

            self.lineVals.append((mouse_x, mouse_y))

            if len(self.lineVals) >= 2:

                self.canvas.create_line(self.lineVals[0][0], 
                                        self.lineVals[0][1], 
                                        self.lineVals[1][0], 
                                        self.lineVals[1][1],
                                        width = self.pointsize) 
                self.lineMode = False
                self.lineVals = []
                self.button.configure(state = Tkinter.NORMAL)

    def drag(self, event):
        self.start_x = event.x
        self.start_y = event.y
        self.dragged = True
        self.canvas.config(cursor = 'fleur')

    def drop(self, event):
        self.dragged = False
        self.canvas.config(cursor = '')

    def move(self, event):

        if self.dragged:
            vektor = (event.x - self.start_x, event.y - self.start_y)
            self.canvas.move(self.overlap_objekt, vektor[0], vektor[1])
            self.start_x = event.x
            self.start_y = event.y
       
    def enter(self, event):

        self.canvas.config(cursor = 'hand2')

    def leave(self, event):
        self.canvas.config(cursor = '')

    def drawLine(self):
        self.button.configure(state = Tkinter.DISABLED)
        self.lineMode = True

    def quit(self, event):
        self.fenster.destroy()

if __name__ == "__main__":
    app = TkWin()
Gruß

Verfasst: Donnerstag 11. Juni 2009, 21:32
von wuf
Hallo meister56

Hier noch ein schneller Wurf zum herumexperimentieren. Ich würde 'global' als verbotene Anweisung betrachten:
http://paste.pocoo.org/show/122549/

Gruss wuf :wink:

Verfasst: Freitag 12. Juni 2009, 13:14
von meister56
@ problembär
bei dir kann man leider nach dem verbinden die punkte nicht mehr verschieben(habe ich vergessen zu erwähnen!) !


@ wuf
ähnliches Problem tritt auf! zwar kann man die verbundenen punkte verschieben, jedoch bleibt die Linie an der selben Stelle!

sonst danke ich euch beiden für die schnelle Hilfe und versuche es mal jetzt hinzubekommen!

gruß meister56