Python (Tk?) und Overlay

Fragen zu Tkinter.
Antworten
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Hi,

ich suche eine Möglichkeit wie ich einen simplen Text, am liebsten ohne außen rum, über alle Fenster schreiben kann... Und natürlich wieder "löschen"... Habs mal im Tk Forum gepostet, vllt. ist es mit Tkinter möglich, ich glaube aber nicht..

Jemand ne Idee wie das gehen könnte?

MfG
Iopodx
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

Das wäre, wenn überhaupt, nur mit sehr speziell und mühsam darauf vorbereiteten Anwendungen möglich. Widgets schützen normalerweise ihren Inhalt - das ist wesentlicher Bestandteil ihrer Funktionalität. Man kann auf kein normales Widget zeichnen - sie rendern und versiegeln das Gerenderte auf expose-events.

Darum sind eben Canvas in TK oder DrawingArea (allerdings was ganz anderes) in gtk beondere Widgets, wäre das nicht so, täte es ja auch ein Frame.

Und selbst wenn, man müsste bei nicht absolut eingefrorenen Größen für jedes Widget den zu rendernden Teil des darüber zu legenden Textes ständig neu berechnen. Denn selbst wenn man die Versiegelung irgendwie aufbrechen könnte (für einen Teil, etwa die Hälfte, der gtk-Widgets kommt man an etwas heran, das sich Widget<object>.window nennt), wird man ja visuelle Attribute nur des jeweiligen Widgets manipulieren können - halt für jedes Widget einzeln.

Was ist mit 'von außen' gemeint ? Wenn man so etwas machen will, sollte es unter Windows mit BitBlit im GDI gehen - dagegen kann sich nichts auf dem Bildschirm schützen, soweit ich mich erinnere (hab sowas mal mit einer Anwendung im Visual Studio gemacht). Das ist gar nicht so schwer, mit allem Drum und Dran wohl in unter 100 Zeilen zu schaffen, vielleicht auch unter 50. Mit Xlib wohl auch, man hat ja ein Xwindow für die gesamte Anwendung dort, hätte sich wegen der Widgets darin noch um die stacking order zu kümmern. Und müßte in beiden Fällen mit Transparenz arbeiten.

Das ist machbar, das oben Beschriebene an unmöglich grenzend schwierig.
[color=green][size=75]Never use idle.pyw, if you need sys.stdin[/size][/color]
BlackJack

Für mich klingt die Frage eher nach einem "on screen display", also nicht direkt auf "fremde" Fenster zeichnen, sondern einen Text vor transparentem Hintergrund über allen anderen Fenstern anzeigen. Für Linux gibt's die XOSD-Bibliothek und eine Python-Anbindung: http://repose.cx/pyosd/
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Hallo,
wenn die Annahme von BlackJack richtig sein sollte, ist dein Vorhaben auch mit Tkinter unter Win möglich.

Code: Alles auswählen

import Tkinter
FONT = "{Verdana} 10 bold"
txt = """
    root = Tkinter.Tk()
    text = Tkinter.Text(root, 
    highlightbackground='#0099e0'
    highlightthickness=1,
    relief=FLAT,).pack(expand=YES, fill=BOTH)
"""
root = Tkinter.Tk()

text = Tkinter.Text(root,relief=Tkinter.FLAT, 
            font=FONT, height=10, bg='grey70', fg='blue')
text.pack(expand=Tkinter.YES, fill=Tkinter.BOTH)

button = Tkinter.Button(root, text='Quit', bd=1, command=quit)
button.pack(side=Tkinter.BOTTOM, fill=Tkinter.X)

text.insert(Tkinter.END, txt)

root.geometry('450x250+250+250')
root.overrideredirect(1) # fenster ohne aussen rum :-)

root.attributes('-alpha', 0.7) # fenster transparent
root.attributes('-topmost', 1) # fenster immer im vordergrund
root.mainloop()
Gruss
pyStyler
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

@Half_Off_Topic:

eine Frage nebenbei:
Ist TKinter für Python "dasgleiche" wie für Perl?
bezüglich Transparenz... bzw Alphablending.
Antworten