Seite 1 von 1
Zeichnen ueber grosse Pixel
Verfasst: Donnerstag 23. August 2007, 21:13
von ichagx03
Hallo, ich habe ein Gitter mit Quadraten. nun möchte ich das wenn ich die maus gedrückt halte und über dieses Gitter fahre das sich dann die Hintergrundfarbe der Quader ändert (über die man gerade fährt.)
ich bin schon so weit gekommen, habe aber das problem das es nur mit klicken geht, nicht aber mit fahren und drücken:
Code: Alles auswählen
from Tkinter import *
class Raster(object):
def __init__(self):
self.press1 = 0
liste = [(x,y) for x in range(18) for y in range(9)]
self.fenster = Tk()
for (i,j) in liste:
l= Canvas(self.fenster,width=20, height=20, bg="white",relief = "ridge",bd =1)
l.grid(column=i, row=j)
l.bind(sequence='<Button-1>',
func=self.linksklickAb)
l.bind(sequence='<ButtonRelease-1>',
func=self.linksklickAuf)
l.bind(sequence='<Motion>',
func=self.malen)
self.fenster.mainloop()
def linksklickAuf(self, event):
self.press1 = 0
def linksklickAb(self, event):
self.press1 = 1
def malen(self,event):
if self.press1:
event.widget.config(bg='red')
else:
event.widget.config(bg='white')
r = Raster()
Weiss jemand wie ich das angehen könnte?
Vielen dank schonmal.
Verfasst: Donnerstag 23. August 2007, 21:34
von Mawilo
Hallo ichagx03,
binde mal Enter (für den Eintritt in das Widget) und Leave (Verlassen des Widgets) an das Objekt und rufe so die Funktionen auf.
Code: Alles auswählen
l.bind('<Enter>', self.enter)
l.bind('<Leave>', self.leave)
Mawilo
Verfasst: Donnerstag 23. August 2007, 21:55
von ichagx03
geht auch nicht.
Das problem ist das er gar nichts meh macht wenn ich die Mausgedrückt halte.
Auch wenn ich nur <Enter> benutze geht es solange ich die Maustastegedrückt halte,
Evtl. würde es mit einem Thread gehen. ich weiss da aber nicht recht wie umsetzen.
Verfasst: Donnerstag 23. August 2007, 23:13
von pyStyler
Hallo,
eventuell so?
Code: Alles auswählen
from Tkinter import *
class Raster(object):
def __init__(self):
self.press1 = 0
liste = [(x,y) for x in range(18) for y in range(9)]
self.fenster = Tk()
for (i,j) in liste:
l= Canvas(self.fenster,width=20, height=20, bg="white",relief = "ridge",bd =1)
l.grid(column=i, row=j)
#~ l.bind(sequence='<Button-1>',
#~ func=self.linksklickAb)
#~ l.bind(sequence='<ButtonRelease-1>',
#~ func=self.linksklickAuf)
#~ l.bind(sequence='<Motion>',
#~ func=self.malen)
l.bind('<Enter>', self.onEnter)
l.bind('<Leave>', self.onLeave)
self.fenster.mainloop()
def linksklickAuf(self, event):
self.press1 = 0
def linksklickAb(self, event):
self.press1 = 1
def malen(self,event):
if self.press1:
event.widget.config(bg='red')
else:
event.widget.config(bg='white')
def onEnter(self, event):
event.widget['bg'] = 'blue'
def onLeave(self, event):
event.widget['bg'] = 'red'
r = Raster()
Gruss
pyStyler
Verfasst: Freitag 24. August 2007, 16:53
von ichagx03
die gehts schon aber nicht so wie ich es möchte
ich will das es nur mahlt wenn die maus gedrückt ist.
deins mahlt immer, ausser die maus ist gedrückt, es müsste gerade umgekehrt sein.
Verfasst: Samstag 25. August 2007, 16:41
von schlangenbeschwörer
Ich habs auch mal versucht, hat aber nix gebracht.
Es gibt wohl wirklich eine Blockierung oder so. Ich hab selbst grad ein ähnliches Problem, das ich mir nicht ganz erklären kann...
Verfasst: Sonntag 26. August 2007, 12:46
von HWK
Es scheint so zu sein, dass die Events <Enter>, <Leave> und <Motion> nicht mit gedrückter Maustaste funktionieren. Man müsste anderes Events wie für Drag-and-Drop haben. Dazu gibt es scheinbar eine Erweiterung: TkDND (
http://sourceforge.net/projects/tkdnd/). Hier gibt es z.B. die Events <DropEnter> und <DropLeave>, die wohl genau das gewünschte bieten. Ob und wie Du das in Deine Anwendung einbauen kannst, musst du selbst mal probieren.
MfG
HWK
Verfasst: Sonntag 26. August 2007, 18:37
von ichagx03
ich hab dieses modul mal angeschaut. wenn mich aber nicht alles täuscht ist dieses Modul dazu da etwas von einem Fenster ins andere zu ziehen (drag and drop). dies löst aber leider nicht mein Problem. weil drag and drop kan ich schon machen. nicht aber das er reagiert wenn ich schon mit gedrückter maustaste komme (und das müsste er ja in meinem Fall).
Verfasst: Sonntag 26. August 2007, 19:08
von BlackJack
Bei "D'n'D" gibt es doch aber Events die beim "Drag"en, also ziehen mit gedrückter Maustaste über ein Widget erzeugt werden. Das ist doch was Du brauchst.
Verfasst: Sonntag 26. August 2007, 20:23
von ichagx03
Ist möglich ich hab es aber nicht geschafft.
Hier ist das Beispiel script:
Code: Alles auswählen
# ----------------------------------------------------------------------
# The rest is here for testing and demonstration purposes only!
import Tkinter
from Tkdnd import *
class Icon:
def __init__(self, name):
self.name = name
self.canvas = self.label = self.id = None
def attach(self, canvas, x=10, y=10):
if canvas is self.canvas:
self.canvas.coords(self.id, x, y)
return
if self.canvas:
self.detach()
if not canvas:
return
label = Tkinter.Label(canvas, text=self.name,
borderwidth=2, relief="raised")
id = canvas.create_window(x, y, window=label, anchor="nw")
self.canvas = canvas
self.label = label
self.id = id
label.bind("<ButtonPress>", self.press)
def detach(self):
canvas = self.canvas
if not canvas:
return
id = self.id
label = self.label
self.canvas = self.label = self.id = None
canvas.delete(id)
label.destroy()
def press(self, event):
if dnd_start(self, event):
# where the pointer is relative to the label widget:
self.x_off = event.x
self.y_off = event.y
# where the widget is relative to the canvas:
self.x_orig, self.y_orig = self.canvas.coords(self.id)
def move(self, event):
x, y = self.where(self.canvas, event)
self.canvas.coords(self.id, x, y)
def putback(self):
self.canvas.coords(self.id, self.x_orig, self.y_orig)
def where(self, canvas, event):
# where the corner of the canvas is relative to the screen:
x_org = canvas.winfo_rootx()
y_org = canvas.winfo_rooty()
# where the pointer is relative to the canvas widget:
x = event.x_root - x_org
y = event.y_root - y_org
# compensate for initial pointer offset
return x - self.x_off, y - self.y_off
def dnd_end(self, target, event):
pass
class Tester:
def __init__(self, root):
self.top = Tkinter.Toplevel(root)
self.canvas = Tkinter.Canvas(self.top, width=100, height=100)
self.canvas.pack(fill="both", expand=1)
self.canvas.dnd_accept = self.dnd_accept
def dnd_accept(self, source, event):
return self
def dnd_enter(self, source, event):
self.canvas.focus_set() # Show highlight border
x, y = source.where(self.canvas, event)
x1, y1, x2, y2 = source.canvas.bbox(source.id)
dx, dy = x2-x1, y2-y1
self.dndid = self.canvas.create_rectangle(x, y, x+dx, y+dy)
self.dnd_motion(source, event)
def dnd_motion(self, source, event):
x, y = source.where(self.canvas, event)
x1, y1, x2, y2 = self.canvas.bbox(self.dndid)
self.canvas.move(self.dndid, x-x1, y-y1)
def dnd_leave(self, source, event):
self.top.focus_set() # Hide highlight border
self.canvas.delete(self.dndid)
self.dndid = None
def dnd_commit(self, source, event):
self.dnd_leave(source, event)
x, y = source.where(self.canvas, event)
source.attach(self.canvas, x, y)
def test():
root = Tkinter.Tk()
root.geometry("+1+1")
Tkinter.Button(command=root.quit, text="Quit").pack()
t1 = Tester(root)
t1.top.geometry("+1+60")
t2 = Tester(root)
t2.top.geometry("+120+60")
t3 = Tester(root)
t3.top.geometry("+240+60")
i1 = Icon("ICON1")
i2 = Icon("ICON2")
i3 = Icon("ICON3")
i1.attach(t1.canvas)
i2.attach(t2.canvas)
i3.attach(t3.canvas)
root.mainloop()
if __name__ == '__main__':
test()
Kann mir jemand sagen wie ich dieses abändern müsste damit es geht?