Erweitert!

Fragen zu Tkinter.
Antworten
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

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
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ß
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
meister56
User
Beiträge: 57
Registriert: Dienstag 23. Dezember 2008, 22:54

@ 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
Antworten