Seite 1 von 2
setPixel
Verfasst: Samstag 12. Oktober 2013, 18:16
von nitram0598
Hallo, ich habe mit pywin32 und SetPixel auf dem desktop pixel gezeichnet, nun möchte ich aber, dass diese, wenn ich mein naderes fenster darüberschiebe, nicht verschwinden, sondern solange da bvleiben, bis das programm beendet wird, wie geht das? hier mein bisherieger code:
Code: Alles auswählen
hdc = win32gui.GetDC(win32gui.GetDesktopWindow())
for x in range(25):
for y in range(25):
win32gui.SetPixel(hdc, x, y, 0x0000FF)
Re: setPixel
Verfasst: Samstag 12. Oktober 2013, 18:52
von Sirius3
@nitram0598: das geht gar nicht. Das Zeichnen mit setpixel ist nichts beständiges. Sobald irgendjemand anderes (z.B. ein anderes Fenster) darüber zeichnet, sind die Pixel weg.
Re: setPixel
Verfasst: Samstag 12. Oktober 2013, 19:06
von nitram0598
wie geht es dann mein vorhaben zu realisieren?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 08:57
von Sirius3
was hast Du eigentlich vor?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 09:37
von nitram0598
oben links soll eine "markierung" sein, rot, wenn eine funktion im programm läuft und grün wenn alles rdy ist
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 09:52
von BlackJack
@nitram0598: Und warum kannst Du für solche Informationen nicht den offiziell vorgesehenen Weg nehmen? Dein Weg versperrt ein Icon auf den Desktop mindestens teilweise, und das würde ganz schnell Probleme geben wenn noch ein anderes Programm auf die gleiche Idee käme. Für solche Informationen gibt es Tray-Icons.
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 10:47
von nitram0598
nein, weil ich ja das immer oben links sehen muss, auch wenn etwas im vollbildmodus ist
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 11:18
von BlackJack
@nitram0598: Wenn eine Anwendung Vollbild anfordert hast Du sowieso verloren denn Vollbild heisst ja per Definition der jeweiligen Anwendung gehört dann der *gesamte* Bildschirm. Da kannst Du dann nicht noch etwas drauf malen.
Bleibt also die Frage warum Du das unbedingt oben links sehen musst, und warum es unten rechts nicht auch geht. (Wobei ich jetzt nicht weiss wie konfigurierbar die Taskleiste und damit der Bereich für die Tray-Icons ist — unter Linux würde ich das jedenfalls auch oben links angezeigt bekommen wenn ich es so konfiguriere.)
Wenn die Anzeige wirklich superwichtig wäre, würde ich dafür extra Hardware basteln die „extern” eine Anzeige bietet. Zwei verschiedenfarbige LEDs oder eine zweifarbige LED an einem Arduino oder so.

Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 11:22
von nitram0598
danke, mit arduino tüftel ich selber auch rum, darauf war ich aber gar nicht gekommen, thx dude <3
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 13:24
von nitram0598
ich komme jetzt grade aber nicht weitet, irgendwie nen blackout ..
http://forum.arduino.cc//index.php?topic=193089.0
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 14:07
von nitram0598
kann mir da wer helfen?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 15:59
von nitram0598
EDIT:: ICh habe es jetzt geschafft, nur funktionier in python das serial.write nicht, heir mein code:
Code: Alles auswählen
import pyHook, pythoncom, serial
ser = serial.Serial('COM3', 9600)
def OnKeyboardEvent(event):
if event.Key == 'Numpad1':
ser.write('g1')
elif event.Key == 'Numpad2':
ser.write('g0')
elif event.Key == 'Numpad4':
ser.write('r1')
elif event.Key == 'Numpad5':
ser.write('r0')
elif event.Key == 'Escape':
ser.close()
exit()
return True
hooks_manager = pyHook.HookManager()
hooks_manager.KeyDown = OnKeyboardEvent
hooks_manager.HookKeyboard()
pythoncom.PumpMessages()
der fehler:
data = bytes(data)
TypeEror: string argument without encoding
was muss ich tun?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 16:35
von Sirius3
@nitram0598: Bitte poste immer den gesamten Stacktrace, »data« kommt in Deinem Code gar nicht vor.
»write« erwartet Bytes, Du übergibst aber einen String. Lies bitte in der Python-Dokumentation nach, was der Unterschied ist.
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 16:46
von nitram0598
danke, habe es mit bytes('g1', 'utf-8) gelöst ^^
nur noch eine frage, wie kann ich es machen, dass:
wenn einmalgedrückt dann g1, wenn nochmal dann g0, wennwieder g1
also so toggeln?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 17:14
von BlackJack
@nitram0598: Der Quelltext ginge kürzer und IMHO auch übersichtlicher wenn man die ``if``/``elif``/``else``-Konstruktion durch ein Wörterbuch ersetzt was Tastennamen auf Bytes abbildet die gesendet werden sollen.
Für die Toggle-Anforderung müsstest Du Dir den Zustand merken. Am besten schreibst Du Dir dafür eine Klasse.
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 17:28
von nitram0598
wie genau meinst du das mit dem wörterbuch?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 17:35
von wuf
Hi nitram0598
Eventuell brauchts du noch eine Funktion:
Da normalerweise bei einer gedrücken Keyboardtaste eine automatische Wiederholung eintritt und das Toggle wie ein Maschinengewehr losrattern würde. Ausser du möchtest dies so.
Gruss wuf

Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 17:37
von nitram0598
wie genau baut man die keyrelease ein, denn ich kenne mich mit pyhook net so aus ^^ und ich würde gerne nur die release nutzen
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 18:16
von nitram0598
#edit schon erledigt, war supa ide, aber jetzt nochmal zurück zum wörterbuch, wie genau meintest du das und wie kann man das dafür nutzen?
Re: setPixel
Verfasst: Sonntag 13. Oktober 2013, 18:33
von Sirius3
Code: Alles auswählen
KEY2CMD={'Numpad1':'g1', 'Numpad2':'g0', 'Numpad4': 'r1', 'Numpad5': 'r0'}
def OnKeyboardEvent(event):
if event.Key in KEY2CMD
ser.write(KEY2CMD[event.Key])
elif event.Key == 'Escape':
ser.close()
exit()
return True