Seite 1 von 1

eigenen Mauszeiger

Verfasst: Sonntag 29. März 2009, 13:26
von Monty Python
Hallo!
Ich würde bei einem Programm (soll mal in ferner Zukunft ein Spiel werden) gerne einen eigenen Cursor verwenden, genauer: ein selbst gebasteltes Polygon.
Ich glaube, ich habe mal gelesen, dass man ein eigenes Polygon in die Liste mit den verschiedenen Cursorn importieren kann, aber ich weiß nicht mehr, wo ich das gelesen habe.
Thx schon mal im voraus für eure Vorschläge

Verfasst: Sonntag 29. März 2009, 14:39
von numerix
Einfach ist das AFAIK nicht zu machen, aber es scheint einen Weg zu geben. Vielleicht ist das ein Ausgangspunkt: http://mail.python.org/pipermail/python ... 25884.html

Verfasst: Sonntag 29. März 2009, 15:01
von wuf
Hallo Monty Python

Hier etwas zum ausprobieren (unter Linux getestet):

Code: Alles auswählen

# Skriptname: cursor_test_06_01.py (wuf)

import os
import Tkinter as tk

root=tk.Tk()

t=tk.Text(root,bg="white",cursor="@my_personal_cursor red")
t.pack()

root.mainloop()
Hier die Cursodaten-Datei 'my_personal_cursor' erstellt mit dem Linux-Programm 'bitmap':

Code: Alles auswählen

#define my_third_cursor_width 32
#define my_third_cursor_height 32
#define my_third_cursor_x_hot 16
#define my_third_cursor_y_hot 15
static unsigned char my_third_cursor_bits[] = {
   0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x80, 0xfd, 0xff, 0xff, 0xbf,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0,
   0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xa0, 0xfd, 0xff, 0xff, 0xbf,
   0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff};
Unter Windows kannst du eine Windowskonforme Cursordatei verwenden

Gruss wuf :wink:

Verfasst: Sonntag 29. März 2009, 15:39
von Monty Python
ähh, danke erstmal, aber geht das auch einfacher? zum beispiel, dass ich in dem programm sage, die und die punkte sind jetzt ein polygon und das kann man zukünftig als cursor verwenden und dann nehm ich das als cursor; also ohne irgendwelchen zusätzlichen programme oder so

Verfasst: Sonntag 29. März 2009, 17:49
von numerix
Monty Python hat geschrieben:ähh, danke erstmal, aber geht das auch einfacher? zum beispiel, dass ich in dem programm sage, die und die punkte sind jetzt ein polygon und das kann man zukünftig als cursor verwenden und dann nehm ich das als cursor; also ohne irgendwelchen zusätzlichen programme oder so
Nein, EINFACH geht es eben nicht. Aber ich finde, wuf hat es dir schon auf dem Silbertablett präsentiert.

Eine Alternative könnte für den Fall, dass es nur um den Cursor innerhalb eines Canvas geht noch sein, den Cursor ganz unsichtbar zu machen - das sollte mit wufs Ansatz ebenfalls funktionieren (vielleicht gibt es dafür auch eine noch einfachere Lösung), habe ich aber nicht getestet - und dann hinter dem unsichtbaren Cursor via Event-Handling ein Polygon herzuziehen.

Verfasst: Sonntag 29. März 2009, 23:46
von wuf
Hallo Monty Python

Wie schon numerix erwähnte geht es leider nicht einfacher. Wie gesagt erstelle ich meine eigenen Cursor-Symbole mit dem frei verfügbaren Bitmap-Editor-Programm 'bitmap': (unter Linux)

Bild

numerix hat recht innerhalb eines reinen Canvas-Widget könnte der Cursor durch ein vom Programm erzeugetes Grafiksymbol emuliert werden.

Gruss wuf :wink:

Verfasst: Montag 30. März 2009, 16:48
von Monty Python
ok, ich hol mir das mal und probiere es aus, thx

Verfasst: Dienstag 31. März 2009, 13:04
von yipyip
Ich habe nochmal die Demo aus einem uralten Thread
http://www.python-forum.de/topic-6789.h ... or+tkinter
ausgegraben und um den 'unsichtbaren Mauszeiger'
ergänzt.

http://paste.pocoo.org/show/110429

Eine Frage dazu:
Beim xbm-Format (nicht zu verwechseln mit xpm!)
handelt es sich doch um C-Code.
Warum gibt es dann bei

Code: Alles auswählen

static unsigned char nilcurs_bits[] = {0x00};
die Fehlermeldung
Traceback (most recent call last):
File "<stdin>", line 118, in <module>
File "<stdin>", line 106, in show_cursors
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1200, in configure
return self._configure('configure', cnf, kw)
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1191, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: cleanup reading bitmap file "nilcurs.h"
und bei

Code: Alles auswählen

static unsigned char nilcurs_bits[] = { 0x00};
nicht ?
Warum muss also nach '{' ein Whitespace-Zeichen vorhanden sein?

@Monty Python:
Auch Gimp exportiert nach xbm.
Zur Not kann man kleine Pixelbildchen ja auch noch
direkt mit Hexadezimalzahlen in einer xbm-Datei definieren. :)

:wink:
yipyip

Verfasst: Dienstag 31. März 2009, 19:54
von wuf
.... Hier noch ein Beispiel für einen Eigenbau-Cursor. Beim Start dieses Skriptes werden zwei XBM-Dateien erstell die dann für die Cursor-Konfiguration eingelesen werden:

http://paste.pocoo.org/show/110484/

@yipyip: Thanks for the tip about GIMP !

Edit: P.S. Costum == Custom :D

Gruss wuf :wink:

Verfasst: Dienstag 31. März 2009, 20:28
von str1442
Ob mit oder ohne Whitespace dürfte keinen Unterschied machen. Benutz doch mal den Python Debugger, pdb oder die winpdb Version, und schau dir den Schritt genauer an. Wird der Header irgendwie inspiziert und dann ausgewertet? Wenn ja, warum ist es dann überhaupt ein Header? Sofern damit noch kompiliert werden soll, könnte man den Header dann auch aus einem einfacheren Dateiformat zusammenstellen. Und warum ist das Array eigentlich static? Ohne das jetzt ausprobiert zu haben, dürfte das Array dann doch (für C) nur in diesem Header erreichbar sein.

Verfasst: Dienstag 31. März 2009, 23:43
von yipyip
Um Missverständnisse zu vermeiden, hätte ich die
Datei doch lieber 'nilcurs.xbm' nennen sollen, aber
da es sich um gültige C-Syntax handelt und aufgrund
des Wikipedia X Bitmap Artikels, habe ich sie einfach
'nilcurs.h' genannt. Sie ist (in diesem Falle) nicht dazu
gedacht, um mit anderen C-Programmen kompiliert,
sondern von Tcl/Tk ausgewertet zu werden.
Auch ein debuggen mit pydb führt mich nur zu der Stelle des
tk.call() Aufrufes.
Fühle mich jetzt auch nicht in der Lage,
das Tcl/Tk oder das darunterliegende C zu debuggen...

:wink:
yipyip