setPixel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

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)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

wie geht es dann mein vorhaben zu realisieren?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

was hast Du eigentlich vor?
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

oben links soll eine "markierung" sein, rot, wenn eine funktion im programm läuft und grün wenn alles rdy ist
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.
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

nein, weil ich ja das immer oben links sehen muss, auch wenn etwas im vollbildmodus ist
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. :-)
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

danke, mit arduino tüftel ich selber auch rum, darauf war ich aber gar nicht gekommen, thx dude <3
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

ich komme jetzt grade aber nicht weitet, irgendwie nen blackout .. http://forum.arduino.cc//index.php?topic=193089.0
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

kann mir da wer helfen?
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

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?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

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?
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.
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

wie genau meinst du das mit dem wörterbuch?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

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
nitram0598
User
Beiträge: 41
Registriert: Dienstag 24. September 2013, 14:53

#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?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

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
Antworten