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:

Code: Alles auswählen

OnKeyboardReleaseEvent(event)
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 :wink:

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