Wie man anzeigen von text auf dem Bildschirm ohne ein Fenster mit Python
Das Problem:
Muss ich schreiben, text direkt auf dem Bildschirm ohne ein Fenster. Der text, der angezeigt werden muss über allen anderen Fenstern und Vollbild-Anwendungen und sollten nicht angeklickt werden oder interactable in keiner Weise.
Beispiel:
Der text muss nicht einen transparenten hintergrund haben wie im Beispiel. Ich kann entweder Python 2 oder 3 auf Windows 7.
Mein Versuch einer Lösung:
Ich habe versucht, ein eigenständiges label mit Tkinter:
Edit: Verbessert mit der Hilfe von Christian Rapp
import Tkinter
label = Tkinter.Label(text='Text on the screen', font=('Times','30'), fg='black', bg='white')
label.master.overrideredirect(True)
label.master.geometry("+250+250")
label.master.lift()
label.master.wm_attributes("-topmost", True)
label.master.wm_attributes("-disabled", True)
label.master.wm_attributes("-transparentcolor", "white")
label.pack()
label.mainloop()
Was funktioniert:
- Der text angezeigt wird ohne ein Fenster
- Der text bleibt über allen anderen Fenstern
- Der hintergrund kann transparent sein
Was nicht:
- Der text nicht über Vollbild-Anwendungen
- Der Textbausteine klicken Sie auf Ereignisse, die auftreten, die über es
- Hintergrund Transparenz ist nicht alpha, so gibt es harte Kanten
- Fragen und bitten uns, Sie zu empfehlen, oder ein tool finden, in der Bibliothek oder Lieblings-off-site-resource-off-topic für Stack-Überlauf, da Sie dazu neigen zu locken, rechthaberisch Antworten und spam. Stattdessen beschreiben Sie das problem, und was wurde bisher getan, um es zu lösen.
- Ich bemerkte, dass die von Ihnen zitierten Punkt 5 aus dieser Seite, enthält einen link mit mehr Informationen. Ich habe bearbeitet Sie meine Frage, und das Gefühl, dass es jetzt trifft sich die stackoverflow-Kriterien für eine on-topic-Frage.
- Versucht haben Sie, label.master.wm_attributes ("alpha", 1.0) für einen transparenten hintergrund?
- Das macht das ganze label transparent, und es scheint, wie es sein kann unmöglich zu machen, nur den hintergrund transparent. Da für die Herstellung es zu zeigen, über fullscreen, ich bin derzeit auf der Suche nach hardware-overlay "Optionen".
- Oh sorry, ich dachte, es könnte verwendet werden, für einen transparenten hintergrund. Aber man kann den Missbrauch der Leinwand-widget --> stackoverflow.com/questions/17039481/...
- Canvas ermöglicht für text mit einem transparenten hintergrund gezeichnet werden, sondern die Leinwand selbst kann nicht einen transparenten hintergrund haben. Oder so dachte ich, bis ich
label.master.wm_attributes("-transparentcolor", "white")
, die überraschenderweise arbeiten auf Leinwand und Etiketten! Ich habe aktualisiert das Beispiel in der Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, es sind zwei völlig verschiedene Probleme hier. Zum anzeigen von text über den Fenstern, Sie müssen, um eine undekorierte oberste Fenster und die chroma-key-hintergrund. Jedoch, dies wird nicht funktionieren, wenn es eine Vollbild-Anwendung ausgeführt wird (wie ein Spiel). Die einzig zuverlässige Möglichkeit zum anzeigen von text über eine Vollbild-Anwendung ist die Verwendung eines Direct3D-hook.
Ich habe nicht geschrieben, bis eine Direct3D-hook-Beispiel, aber ich gebe zwei verschiedene Lösungen für das erste problem.
Lösung 1: Tkinter + pywin32
In diesem Beispiel habe ich den Großteil der Arbeit mit Tkinter und win32api verwenden, um zu verhindern, dass der text von der Sperrung Mausklicks. Wenn win32api nicht zur Verfügung, dann können Sie einfach entfernen Sie den Teil des Codes.
Lösung 2: pywin32
In diesem Beispiel wird alles durch pywin32. Das macht es komplizierter und weniger tragbar, aber deutlich leistungsfähiger sind. Ich habe enthalten links auf die entsprechenden Teile des Windows-API in dem gesamten code.
LWA_COLORKEY
mit einem Fenster, das bereits existiert? Ich schaffte es, volle Transparenz der Arbeit mitLWA_ALPHA
, aber so weitLWA_COLORKEY | LWA_ALPHA
wurde mit Wirkung für teilweise Transparenz.Hatte ich ein ähnliches Bedürfnis und entdeckt, dass die pygame Bibliothek hat einen WIRKLICH guten job für das, was ich suchte. Ich war in der Lage, erzeugen sehr große text, das würde das update sehr schnell und ohne flimmern. Sehen Sie, dieses Thema weiter unten (im ersten code 'Lösung' ist es):
Einfache Möglichkeit zum anzeigen von text auf dem Bildschirm in Python?
Ich beschleunigt es sich und es ist schnell. Auch die Schrift viel größer ist, und dass nicht die Aufprallgeschwindigkeit viel. Alles läuft auf ein wenig Orange Pi board Lite (< $20). Sie können starten Sie es von der Befehlszeile aus w/o GUI (oder aus einem Fenster desktop) und es ist in jedem Fall full-screen und erscheint nicht als "windowed" - app.
Meine Annahme, als ich bin neu in Python und Pygame, ist, dass man das laden einer image-Datei als hintergrund und dann einen text auf, der.
Oh, und ich versuchte, das gleiche mit dem Tkinter-Beispiel, und es war langsamer, blinkte, und die Schrift einfach nicht sehen "Recht". Pygame war eindeutig der Sieger. Es ist entworfen, um blit Dinge auf dem Bildschirm, ohne zu "reißen" als Spiele brauchen, um nicht zu flimmern, wenn die Bilder aktualisieren. Ich war überrascht, dass es war nicht angewiesen auf OpenGL, weil es schnell war. Ich glaube nicht, dass OpenGL wird unterstützt auf der Orange Pi (kann nicht herausfinden, eine klare Antwort auf die dass). Also für den 2D-Kram, wow, pygame ist beeindruckend.!