eigenen Mauszeiger

Fragen zu Tkinter.
Antworten
Monty Python
User
Beiträge: 29
Registriert: Mittwoch 29. Oktober 2008, 21:29
Wohnort: Chemnitz
Kontaktdaten:

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
mind like a sieve
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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

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:
Take it easy Mates!
Monty Python
User
Beiträge: 29
Registriert: Mittwoch 29. Oktober 2008, 21:29
Wohnort: Chemnitz
Kontaktdaten:

ä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
mind like a sieve
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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

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:
Take it easy Mates!
Monty Python
User
Beiträge: 29
Registriert: Mittwoch 29. Oktober 2008, 21:29
Wohnort: Chemnitz
Kontaktdaten:

ok, ich hol mir das mal und probiere es aus, thx
mind like a sieve
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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

.... 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:
Zuletzt geändert von wuf am Dienstag 31. März 2009, 21:27, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Antworten