Anwendung auf Taskleiste zum blinken bringen

Fragen zu Tkinter.
Antworten
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Hallo zusammen,

bin noch absoluter Python-Neuling und habe angefangen auf Grundlage eines Echo-Server<->Client Systems ein Chat-Programm zu schreiben, wobei der Client mit TKinter läuft.

Soweit funktioniert ja auch alles recht gut, nur hätte ich gern die Funktion, dass das Symbol des Clients in der Taskleiste bei eingehenden Nachrichten blinkt wie bei herkömmlichen Instant Messangern.
Hab mich schon halbtot gesucht um eine Funktion dafür zu finden, aber bis jetzt ohne Erfolg.

Falls jemand mir weiterhelfen kann, wäre ich sehr dankbar

MFG, simmal
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Unter Windows XP funktioniert es z.B. so:

Code: Alles auswählen

import Tkinter as tk
def see_you_later(text):
    text.insert(tk.END, 'Hallo, hier bin ich!')
    text.focus_force()
root = tk.Tk()
text = tk.Text(root)
text.pack()
root.after(5000, see_you_later, text)
root.mainloop()
MfG
HWK
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Danke für den Tipp, aber das mit "force_focus()" habe ich bereits ohne erfolg versucht.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Silent_Simmal hat geschrieben:Danke für den Tipp, aber das mit "force_focus()" habe ich bereits ohne erfolg versucht.
Hast du's denn auch mit "focus_force()" versucht?
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

:oops: sry, verschrieben, meinte ich ja^^
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Funktioniert mein Beispiel denn bei Dir?
MfG
HWK
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Also, der Fokus aufs Fenster funktioniert soweit, aber nur wenn das Fenster nicht minimiert ist.
Das habe ich wohl vergessen zu erwähnen :oops:
Da ich den Client meist minimiert in der Taskleiste habe und andere Benutzer wrsl auch, passiert trotz focus_force() nichts.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ach so, Du willst Dein Programm nicht im Systray haben, sondern nur in dem Panel, das die iconifizierten Programme aufnimmt.
Was das 'focus_force()' bewirken soll, verstehe ich nicht.

Reicht vielleicht so etwas?

Code: Alles auswählen

#!/usr/bin/env python

import Tkinter as tk

####

class Gui(object):


  def __init__(self, interval=500):

    self.interval = interval
    self.root = tk.Tk()
    self.texts = 'The Title', ' ', 'Huhu!'
    self.reset()
    self.button = tk.Button(self.root, text='Hide', font=('Arial', 64), command=self.hide)
    self.button.pack()


  def reset(self):
    
    self.state = 0
    self.root.title(self.texts[self.state])

    
  def hide(self):

    self.root.iconify()
    self.blink()


  def blink(self):

    if self.root.state() == 'iconic':
      self.state ^= 1
      self.root.title(self.texts[self.state+1])
      self.id = self.root.after(self.interval, self.blink)
    else:
      self.reset()
      self.root.after_cancel(self.id)
      

  def run(self):

    self.root.mainloop()

####

if __name__ == '__main__':

  Gui().run()
Wenn Du etwas Auffaelligeres haben willst:
http://www.python-forum.de/post-131623.html#131623

:wink:
yipyip
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Genau so etwas in der Art hatt ich mir vorgestellt.
Jetz des Ganze nur noch in meinen Code einbinden, aber des nicht mehr heute^^
Aber vielen Dank:)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

yipyip hat geschrieben:Was das 'focus_force()' bewirken soll, verstehe ich nicht.
Probier doch mal mein Beispiel ohne aus.
Silent_Simmal hat geschrieben:Also, der Fokus aufs Fenster funktioniert soweit, aber nur wenn das Fenster nicht minimiert ist.
Das habe ich wohl vergessen zu erwähnen.
Ja, das hast Du.
MfG
HWK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Nach ein bisschen Probieren hier eine Windows-spezifische Lösung, die auch minimiert funktioniert:

Code: Alles auswählen

import Tkinter as tk
import win32con, win32gui
TITLE = 'Mein Fenster'
def see_you_later(text):
    handle = win32gui.FindWindow(None, TITLE)
    text.insert(tk.END, 'Hallo, hier bin ich!')
    win32gui.FlashWindowEx(handle, win32con.FLASHW_TRAY, 5, 0)
root = tk.Tk()
root.title(TITLE)
text = tk.Text(root)
text.pack()
root.after(5000, see_you_later, text)
root.mainloop()
MfG
HWK
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ach so, das 'focus_force()' bewirkt ein mehrmaliges Blinken, falls das Programm gerade nicht den Focus hat. (Hat man ja unter Ubuntu nicht.)
Bin schon so Windows entwoehnt...

:wink:
yipyip
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Also, Zwischenergebnis:
Das mehrmalige blinken von HWK funktioniert wunderbar, vielen dank dafür.
Probleme habe ich allerdings mit dem "dynamischen" ändern des Titels, was von yipyip vorgeschlagen wurde, da sich beim Versuch das einzubauen mein Fenster aufhängt, und nicht mehr reagiert, wenn es minimiert ist.
Dasselbe passierte auch, als ich versucht habe das minimierte Fenster durch "deiconify" wieder in den Vordergrund zu bringen.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Ohne Minimalbeispiel kann man nicht viel dazu sagen. Eine beliebte Fehlerquelle ist ja immer, von einem anderen Thread auf die GUI zuzugreifen.

:wink:
yipyip
Silent_Simmal
User
Beiträge: 7
Registriert: Donnerstag 15. Oktober 2009, 16:15

Dass ich mit Threads arbeite stimmt. Möglich dass darin der Fehler liegt.
Allerdings bin ich wie gesagt noch ziemlicher Anfänger und kann das (noch) nicht überprüfen, da der Chat auf einem Echo-Server<->Client System aufbaut, welches mit Threads arbeitet und welches ich nur übernommen und um die GUI und diverse Funktionen erweitert habe.
Mit dem Thema Threads und sockets beschäftige ich mich zwar gerade, aber bin noch nicht allzuweit gekommen.
Würde meinen Code ja gerne zur Überprüfung zur Verfügung stellen, allerdings ist der mittlerweile zu lang, um ihn hier zu posten.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dann verwende halt einen Pastebin:
http://paste.pocoo.org/
Antworten