Spezielle Funktionen

Fragen zu Tkinter.
Antworten
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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: )
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Last mich raten, ihr habt mal wieder keine Ahnung was ich meine? :roll:
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
problembär

Stimmt.
Py-Prog hat geschrieben:wie man es Schaft
Vielleicht so? :mrgreen:
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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)".
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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()
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Danke. :D :D :D
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.)
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Also mir ist nichts der gleichen für Windows bekannt.
Sieh mal hier http://www.python-forum.de/viewtopic.php?p=185427
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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()
Zuletzt geändert von Xynon1 am Dienstag 15. Februar 2011, 17:16, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

"angle" kann man mittels Modulo natürlich ein wenig schöner berechnen ;-) Oder besser: Man verwendet gleich eine Winkelgeschwindigkeit.
Das Leben ist wie ein Tennisball.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Stimmt, ändere ich gleich.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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()
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

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.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Oh, hatte ich übersehen. :oops: Na ja, so wichtig ist es auch nicht.
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Gibt's auch ne Funktion mit der man die Aktuelle Fenster Position bekommt?
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
BlackJack

@Py-Prog: Ist die gleiche Methode -- wenn man nichts übergibt bekommt man den aktuellen Wert zurück.
Py-Prog
User
Beiträge: 673
Registriert: Dienstag 16. Februar 2010, 17:52
Wohnort: G:\ermany

Ah, Danke!
Technik ist: wenn alles funktioniert und keiner weiß warum.
Wer Rechtschreibfehler findet darf sie behalten.
Antworten