Seite 1 von 1
Spezielle Funktionen
Verfasst: Sonntag 13. Februar 2011, 14:15
von Py-Prog
Wie der Betreff schon sagt suche ich ein Paar spezielle Funktionen:
- ich möchte ein Fenster verschieben (nicht mit der Maus)
wenn das Fenster im Focus ist eine Funktion ausgeführt wird und umgekehrt
und ich würde gerne wissen wie man es Schaft dass ein Fenster immer im Vordergrund bleibt
ich hoffe das überschreitet nicht die Grenzen von Tkinter.
Danke hin voraus. (Da ich später dazu keine Zeit mehr haben werde.

)
Re: Spezielle Funktionen
Verfasst: Sonntag 13. Februar 2011, 16:03
von Py-Prog
Last mich raten, ihr habt mal wieder keine Ahnung was ich meine?

Re: Spezielle Funktionen
Verfasst: Sonntag 13. Februar 2011, 20:34
von problembär
Stimmt.
Py-Prog hat geschrieben:wie man es Schaft
Vielleicht
so?

Re: Spezielle Funktionen
Verfasst: Montag 14. Februar 2011, 08:28
von Xynon1
Es gibt das Event "<FocusIn>", bei dem du deine Funktion aufrufen kannst, dann könnte man diese zB mit der "after()"-Methode in einer Schleife halten und bei "<FocusOut>" diese unterbrechen.
Das verschieben selbst wird etwas schwieriger, da fällt mir auf anhieb nur die "geometry()"-Methode ein, welche einen String mit der Syntax "WidthxHeight+x+y" erwartet. So kann man das Fenster zumindest absolut positionieren.
Ein Fenster im Vordergrund halten geht einfach über das WM-Attribute "topmost" zB. "root.wm_attributes('-topmost', True)".
Re: Spezielle Funktionen
Verfasst: Montag 14. Februar 2011, 16:04
von Py-Prog
Xynon1 hat geschrieben:Es gibt das Event "<FocusIn>", bei dem du deine Funktion aufrufen kannst, dann könnte man diese zB mit der "after()"-Methode in einer Schleife halten und bei "<FocusOut>" diese unterbrechen.
Danke, mal für die Erstem beiden Lösungen, ab geht das noch genauer?
Re: Spezielle Funktionen
Verfasst: Montag 14. Februar 2011, 16:40
von Xynon1
Hier mal ein kleines Beispiel wie man mit dem Focus arbeiten kann (in dem Fall Tab-Taste drücken)
Code: Alles auswählen
import Tkinter as tkinter
def activate(event):
event.widget.__color = event.widget["bg"]
event.widget.config(bg="green")
def deactivate(event):
event.widget.config(bg=event.widget.__color)
if __name__ == "__main__":
root = tkinter.Tk()
frame1 = tkinter.Frame(root, bg="blue")
frame1.pack(side="left")
frame2 = tkinter.Frame(root, bg="red")
frame2.pack(side="left")
frame3 = tkinter.Frame(root, bg="yellow")
frame3.pack(side="left")
for widget in (frame1, frame2, frame3):
widget.config(width=50, height=100, takefocus=True)
widget.bind("<FocusIn>", activate)
widget.bind("<FocusOut>", deactivate)
root.mainloop()
Re: Spezielle Funktionen
Verfasst: Montag 14. Februar 2011, 16:58
von Py-Prog
Re: Spezielle Funktionen
Verfasst: Montag 14. Februar 2011, 17:03
von Xynon1
Falls du noch mehr Spielereien willst, ...
Code: Alles auswählen
import Tkinter as tkinter
def move(master, add_x, add_y):
size, x, y = master.geometry().split("+")
x = str(int(x) + add_x)
y = str(int(y) + add_y)
master.geometry("+".join((size, x, y)))
def activate(event):
move(event.widget, 300, 0)
def deactivate(event):
move(event.widget, -300, 0)
if __name__ == "__main__":
root = tkinter.Tk()
root.geometry("100x100+400+300")
side = tkinter.Toplevel(root)
side.geometry("200x200+650+300")
for window in (root, side):
window.bind("<FocusIn>", activate)
window.bind("<FocusOut>", deactivate)
root.mainloop()
Hier aber aufpassen, da der Focus auf ein nicht vom Programm gesteuertes Fenster gehen kann, was natürlich die Reihenfolge ändert, aber eine lustige Spielerei ist es schon

Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 15:16
von Py-Prog
Ich weiß da was viel lustigeres:
Das Fenster 4 mal kleiner als den Bildschirm machen, und dann es im "Kreis" herum wandern lassen.
Aber ich will mich damit eigentlich nicht spielen. Geht das eigentlich auch ein Symbol rechts unten in die Task leiste setzten? (Und beim Anklicken eine Funktion ausführen.)
Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 16:08
von Xynon1
Also mir ist nichts der gleichen für Windows bekannt.
Sieh mal hier
http://www.python-forum.de/viewtopic.php?p=185427
Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 17:03
von Xynon1
Achso, schwebte dir da sowas vor ?
Code: Alles auswählen
import Tkinter as tkinter
import math
def rotate(master, size, center, radius, angle):
x = int(radius * math.cos(math.radians(angle)) + center[0])
y = int(radius * math.sin(math.radians(angle)) + center[1])
master.geometry("+".join((size, str(x), str(y))))
angle = angle + 10 % 360
master.after(100, rotate, master, size, center, radius, angle)
if __name__ == "__main__":
radius = 250
size_x = 100
size_y = 100
root = tkinter.Tk()
center_x = (root.winfo_screenwidth() / 2) - (size_x / 2)
center_y = (root.winfo_screenheight() / 2) - (size_y / 2)
size = "{0}x{1}".format(size_x, size_y)
center = center_x, center_y
root.geometry("{0}+{1}+{2}".format(size, center_x, center_y))
for angle in xrange(4):
tp = tkinter.Toplevel(root)
tp.geometry("{0}+{1}+{2}".format(size, center_x, center_y))
rotate(tp, size, center, radius, 90*angle)
root.mainloop()
Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 17:10
von EyDu
"angle" kann man mittels Modulo natürlich ein wenig schöner berechnen

Oder besser: Man verwendet gleich eine Winkelgeschwindigkeit.
Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 17:12
von Xynon1
Stimmt, ändere ich gleich.
Re: Spezielle Funktionen
Verfasst: Dienstag 15. Februar 2011, 17:42
von Xynon1
So besser ?
Code: Alles auswählen
import Tkinter as tkinter
import math
def rotate(master, size, center, radius, velocity):
x = int(radius * math.cos(velocity) + center[0])
y = int(radius * math.sin(velocity) + center[1])
master.geometry("+".join((size, str(x), str(y))))
master.after(100, rotate, master, size, center, radius, velocity + 1)
if __name__ == "__main__":
radius = 250
size_x = 100
size_y = 100
root = tkinter.Tk()
center_x = (root.winfo_screenwidth() / 2) - (size_x / 2)
center_y = (root.winfo_screenheight() / 2) - (size_y / 2)
size = "{0}x{1}".format(size_x, size_y)
root.geometry("{0}+{1}+{2}".format(size, center_x, center_y))
for angle in xrange(4):
tp = tkinter.Toplevel(root)
tp.geometry("{0}+{1}+{2}".format(size, center_x, center_y))
rotate(tp, size, (center_x, center_y), radius, angle * (math.pi / 2))
root.mainloop()
Re: Spezielle Funktionen
Verfasst: Mittwoch 16. Februar 2011, 19:27
von Py-Prog
Das ist aber nicht das warum ich das oben gefragt habe! Und ich habe noch gefragt wie man ein kleines icon rechts unten in die Taskleiste bekommt, und beim Anklicken eine Funktion ausführt.
Re: Spezielle Funktionen
Verfasst: Mittwoch 16. Februar 2011, 19:56
von Xynon1
Ich zitiere mich mal selbst:
Re: Spezielle Funktionen
Verfasst: Mittwoch 16. Februar 2011, 21:07
von Py-Prog
Oh, hatte ich übersehen.

Na ja, so wichtig ist es auch nicht.
Re: Spezielle Funktionen
Verfasst: Sonntag 20. Februar 2011, 20:21
von Py-Prog
Gibt's auch ne Funktion mit der man die Aktuelle Fenster Position bekommt?
Re: Spezielle Funktionen
Verfasst: Sonntag 20. Februar 2011, 22:01
von BlackJack
@Py-Prog: Ist die gleiche Methode -- wenn man nichts übergibt bekommt man den aktuellen Wert zurück.
Re: Spezielle Funktionen
Verfasst: Montag 21. Februar 2011, 14:54
von Py-Prog
Ah, Danke!