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. :wink: )

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? :roll:

Re: Spezielle Funktionen

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

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
Danke. :D :D :D

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 :mrgreen:

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 ? :mrgreen:

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:
Xynon hat geschrieben: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: Mittwoch 16. Februar 2011, 21:07
von Py-Prog
Oh, hatte ich übersehen. :oops: 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!