eigene Mauszeiger verwenden

Fragen zu Tkinter.
Antworten
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hi leute hab wieder ne neue frage
und zwar möchte ich, dass in dem xturtle fenster der mauszeiger als eine von mir zuvor erstellte gif datei zu sehen ist
ich kenne bisher nur den folgenden befehl:

Code: Alles auswählen

getcanvas().config(cursor="crosshair") 
damit gehen aber nur schon vorhandene mauszeiger
wie geht das mit nem selbst erstellten?

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:hi leute hab wieder ne neue frage
und zwar möchte ich, dass in dem xturtle fenster der mauszeiger als eine von mir zuvor erstellte gif datei zu sehen ist
ich kenne bisher nur den folgenden befehl:

Code: Alles auswählen

getcanvas().config(cursor="crosshair") 
damit gehen aber nur schon vorhandene mauszeiger
wie geht das mit nem selbst erstellten?
Das Forum hat auch eine Suchfunktion ...
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hab gerade mal gesucht aber nix gefunden
wäre super, wenn du mir nen link angeben könntest

mfg
LP640
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hi
also ich hab mir mal ein paar beiträge und beispiele zu dem erstellen eines eigenen maus-cursers durchgelesen, aber nichts hat mich weitergebracht
gibt es denn keine möglichkeit, denn mauszeiger bei xturtle in eine zuvor erstellte gif datei umzuwandeln???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:hi
also ich hab mir mal ein paar beiträge und beispiele zu dem erstellen eines eigenen maus-cursers durchgelesen, aber nichts hat mich weitergebracht
gibt es denn keine möglichkeit, denn mauszeiger bei xturtle in eine zuvor erstellte gif datei umzuwandeln???
Nein. Das kannst du in dem von yipyip verlinkten Thread nachlesen.
Die Lösung könnte aber so aussehen, dass du einen unsichtbaren Cursor erzeugst und dann einen Cursor simulierst, indem du eine gif-Grafik hinter dem unsichtbaren Mauscursor herziehst.
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

danke
das ist glaube ich auch eine gute lösung aber wie kann ich es bei xturtle machen, dass ein objekt oder halt eben die turtle mit der gif datei als shape der maus folgt???
ich kenn bisher nur onclick

mfg
LP640
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo LP640

Hier eine Lösung basierend auf der Idee von numerix. Funktioniert aber nur in einem Canvas-Widget. Vielleich könnte es auch mit xturtle funktionieren. Leider arbeite ich nicht mit 'xturtle':

Code: Alles auswählen

# wuf_ref: canvas_cursor_01.py

import Tkinter as tk

def canvas_enter(event):

    app_win.cursor_store = canvas['cursor']
    canvas.config(cursor="@nil_cursor black")
    app_win.cur_xpos = event.x
    app_win.cur_ypos = event.y
    canvas.itemconfigure('my_cursor', image=my_cursor_image)
    canvas.tag_raise('my_cursor')
    canvas.coords('my_cursor', app_win.cur_xpos, app_win.cur_ypos)

def canvas_leave(event):

    canvas.itemconfigure('my_cursor', image='')
    canvas.config(cursor=app_win.cursor_store)

def move_my_cursor(event):

    app_win.cur_xpos = event.x
    app_win.cur_ypos = event.y

    canvas.tag_raise('my_cursor')
    canvas.coords('my_cursor', app_win.cur_xpos, app_win.cur_ypos)

app_win = tk.Tk()

#~~ Daten fuer mein Cursor-Symbol (Base64-Format)
MY_CANVAS_CURSOR = \
'''
R0lGODlhNQA1AMYoAAAAAAAEAAgECAgICAgMCBAMEBAQEBAUEBgUGBgYGBgc
GCAcICAgICAkICkkKSkoKSksKTEsMTEwMTE0MTk0OTk4OTk8OUE8QUFAQUFE
QUpESkpISkpMSkpQSlJMUlJQUlJVUlpVWlpZWvAgAFpdWmJdYmJhYmJlYvAw
AGplamppamptanNtc3Nxc3N1c3t1e3t5e3t9e4N9g4OBg4OFg4uFi4uJi4uN
i5SNlJyRe5SRlJSVlJyVnJyZnJydnPCQAKSdpKShpKSlpKylrKyqrKyurLSu
tLSytLS2tL22vfDAAMW6nM26i726ve7CIL2+vcW+xcXCxebGWsXGxf/OAPbK
Me7KSv/OCP/KKf/SAM3Gzf/SGM3Kzf/OMd7OlP/WGM3OzdXO1f/WOf/WStXS
1fbaYtXW1d7W3v/eat7a3t7e3v/ie+be5ubi5v/qi+7m7u7q7vbuze7u7v/y
vfby9v/y3vb29v/2///6//////AwAPAwAPAwAPAwAPAwAPAwACH+FUNyZWF0
ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgB/ACwAAAAANQA1AAAH/oB/goOEhYaH
iIYjhIuLiY+QkYySlJWGKH8omJiOlp6PmIKhn6SHmpqZmaOlpaGbf3OssqKq
mG5UYoNKs5avqX9fVF5/SsW8va4oZVlMxMeSHkg2LWhUVFtjY1RXus+PHEl3
dGtUTlJYVV1WS86sNzIyQU1NR0c3IBUnQoInTTZ0dsRQyTHjSaFdpEi0aJMn
jx06cN6oSUMmigkACULokHGhCZ06ce6oEPSj3ScSM+TkwXNHDpw2bMyQ4aLl
SRMWA0h8mAAAwL+HTVzI8tGBYR5xEdlQDKMlSpMkRohYeHBAQE8AEmw0ITGy
FAkcK1u+ZHNmphYo9IwMCdKjxNW3/j0bsCIBxCFEiUunOE1ShEgQIDt02GgA
t+cAViuIiIUpk6bNI0aEsOVxw8YMGRYKAxBKykePuxPJhNH7tO/fwDZqyIDR
okJhA6xAvFTTuGZayT0oW5bxwsUKFRI0c0h4JjQY0nz9AhZcIwZrFidMiEig
GQApFrUfR55c+bKLFipSkBDxYUN1ABA8kYgyeq/p5amdt2CRQnoIDxseWK3u
ycKUx0XgtkN3MnwXXgnkeaABBhUMcB4AGFRyAwtNIGGaD6jRIB909nGwAQYX
TLAAAAEAYFWJbx1GyQwzBMjdbgaKl2AGDFIAAWEP9mTDijIA0YMOOMT3XHQi
hOAhiBNI/vCAAwGUeKKJJL5VCQAkDGhZDDGO94EHNFZg4wMMKIBijgBYQAkA
FNSgIWsrEGnkhyEq6YACCDQJpZNRWrXfA2cO0Bt4Mm7Z5ZcMLHBAAWSaGIBV
fEoSF4dFHhnnkgokUICDeGYK5QADGOBgo5FcxcAHH3DQ5QQQgKnAAQaMeV6T
AxBgwAEIAAAqJClGYIEFST7QAJ0EOPjksHkOUIABCCSwAHW3PqJZrJzamSgA
nBpgQAIJMNDAiGZKQkB1mhKLpwACFFAAAggssIADD0RAXSXmTVudAMYiqywD
7EogQa2WzJvnv04GEOusCSig7QMQUECBBZz2K+9VTRZAAK0L/ijQgAMRQDBB
BRc8AEAFloAAl7h3Utvptdky8MAD+lZgAQYZ1EqDJ/IKLOsBBR8MgQQbW5BB
Bq7J5ckHhRFL77HJLoBvuxJQwDEGG0Tt4AykfHtetSgzoDLLElRQAQZQb/AB
dRmwApeTAhBAALoKrItxBApfcIEGGnjgQQgMAKCALCSMXG/SS0fQ9NMabODB
B3hTe8MsHFyVNsEGN4Awzy7DvAEHH4CQ+ABU8yLCVQUcoIDFDUAA9wQWzJ0B
B3eDoIGDsHnzh4MAFLB1y1+HTaoIHjgQl+yDZNCTAAlE0LPlmHtQgQKGAW8I
BlcZoIADki9Za0+xO39ICxMcoJnQCdqHL/745HsSCAA7
'''

#~~ Daten fuer einen TK Null-Cursor (xbm-Format)
nil_cursor_data = """
#define t_cur_width 1
#define t_cur_height 1
#define t_cur_x_hot 0
#define t_cur_y_hot 0
static unsigned char t_cursor[] = { 0x00};
"""

#~~ Erzeugt eine Datei mit den TK Null-Cursor-Daten
f=open("nil_cursor", "w")
f.write(nil_cursor_data)
f.close()

#~~ Mein eigener Canvas-Cursor (Quelle = Base64-Format)
my_cursor_image = tk.PhotoImage(data=MY_CANVAS_CURSOR)
#~~ Mein eigener Canvas-Cursor (Quelle = .gif-Datei)
# my_cursor_image = tk.PhotoImage(file='my_canvas_cursor.gif')

#~~ Global einsetzbare Variablen
app_win.cursor_store = ''
app_win.cur_xpos = 0
app_win.cur_ypos = 0

#~~ Meine Canvas-Plattform
canvas = tk.Canvas(app_win, bg='red', width=300, height=200)
canvas.pack()
canvas.bind("<Enter>", canvas_enter)
canvas.bind("<Leave>", canvas_leave)
canvas.bind("<Motion>", move_my_cursor)

#~~ Platzhalter fuer mein eigener Canvas-Cursor
canvas.create_image(0, 0, image=None, tag='my_cursor')

#~~ Ein stationaeres Canvas Grafik-Objekt
canvas.create_rectangle(100, 50, 200, 150, fill='yellow', tag='fix_object')

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Sieht man sich die Übersicht der Funktionen an (http://docs.python.org/3.1/library/turtle.html), dann scheint es nicht vorgesehen, dass Schildkröten auf Mausbewegungen reagieren (ich bin aber kein (x)turtle-Experte!).

Mit dem vergleichbaren frog-Modul ist es jedenfalls schnell erledigt:

Code: Alles auswählen

from frog import Pool, Frog

welt = Pool()
figur = Frog(welt)
figur.shape = "mycursor", "mycursor.gif"
welt.listen("<Motion>",lambda e:figur.jumpto(e["pos"]))
welt.ready()
Natürlich ist der normale Cursor hierbei noch sichtbar; wie man den unsichtbar macht, hat yipyip gezeigt - das geht mit dem frog-Modul genauso; Pool-Instanzen haben dafür ein Datenattribut cursor.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@wuf: Nett gemacht!

Den unsichtbaren Cursor vorher in eine Datei schreiben zu müssen, um ihn anschließend wieder abzurufen, ist natürlich eine hässliche Sache.
Ich habe vor einiger Zeit mal mit Tkinter-Bitmaps was probiert, was genauso geendet hätte (wenn ich es dann umgesetzt hätte), weil ich keinen workaround dafür gefunden habe. Wenn sich das noch vermeiden ließe ...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Das mit dem Null-Cursor stimmt natürlich schon. Existiert der Null-Cursor aber einmal als Datei könnten immerhin die Zeilen 69...80 entfernt werden.

Habe hierfür bis jetzt leider auch noch keine einfachere Lösung gefunden.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:Existiert der Null-Cursor aber einmal als Datei könnten immerhin die Zeilen 69...80 entfernt werden.
Sicher kann man das aus der Datei laden, aber es gefällt mir nicht:
Da kann man eine gif-Grafik in den Quelltext integrieren (gut, in der Regel wird man das nicht tun, aber gerade für solche kleinen Sachen finde ich das praktisch - ggf. lagert man diese Teile in ein separates Modul aus), aber die paar Zeilen für einen unsichtbaren Cursor muss man aus einer Datei laden. Grausam!
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

danke für eure antworten,
ich glabue, da muss ich mich etwas länger mit auseinander setzen bis es bei mir hinhaut aber ich habe auch noch kurz ne andre frage:
gibt es bei xturtle die möglichkeit nur den letzten befehl rückgängig zu machen??? also sowas wie clear() oder reset() aber nur für den letzten befehl, den man ausgeführt hat???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:gibt es bei xturtle die möglichkeit nur den letzten befehl rückgängig zu machen??? also sowas wie clear() oder reset() aber nur für den letzten befehl, den man ausgeführt hat???
Soweit ich sehe: Nein. Aber der Frosch kann das ...
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

schade,
eigentlich könnte ich frog auch benutzen, nur xturtle ist mit dem tracer viel schneller; bei forg kann man den frosch soweit ich weiß nur mit speed wie bei xturtle auch und durch unsichtbar noch schneller machen oder???

mfg
LP640
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

LP640 hat geschrieben:eigentlich könnte ich frog auch benutzen, nur xturtle ist mit dem tracer viel schneller; bei forg kann man den frosch soweit ich weiß nur mit speed wie bei xturtle auch und durch unsichtbar noch schneller machen oder???
(x)turtle bietet mittels tracer() die Möglichkeit, eine Zeichnung zunächst komplett zu erstellen und dann erst sichtbar zu machen - das geht "relativ schnell". Das kann der Frosch nicht. Stellt man die Geschwindigkeit bei unsichtbarem Frosch auf "max" ein (Zeichenkette!), dann geht es "relativ flott".

Aber mal im Ernst: Wenn es dir auf Geschwindigkeit ankommt, dann ist weder (x)turtle noch frog geeignet. Die haben mehr oder weniger pädagogischen Nutzen, sind aber nicht auf Performance ausgelegt.
Antworten