Seite 1 von 1

Anwendung auf Taskleiste zum blinken bringen

Verfasst: Donnerstag 15. Oktober 2009, 17:10
von Silent_Simmal
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

Verfasst: Sonntag 18. Oktober 2009, 10:50
von HWK
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

Verfasst: Montag 19. Oktober 2009, 17:04
von Silent_Simmal
Danke für den Tipp, aber das mit "force_focus()" habe ich bereits ohne erfolg versucht.

Verfasst: Montag 19. Oktober 2009, 17:09
von numerix
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?

Verfasst: Montag 19. Oktober 2009, 17:26
von Silent_Simmal
:oops: sry, verschrieben, meinte ich ja^^

Verfasst: Montag 19. Oktober 2009, 17:38
von HWK
Funktioniert mein Beispiel denn bei Dir?
MfG
HWK

Verfasst: Montag 19. Oktober 2009, 18:00
von Silent_Simmal
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.

Verfasst: Montag 19. Oktober 2009, 18:25
von yipyip
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

Verfasst: Montag 19. Oktober 2009, 18:42
von Silent_Simmal
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:)

Verfasst: Dienstag 20. Oktober 2009, 09:00
von HWK
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

Verfasst: Dienstag 20. Oktober 2009, 11:10
von HWK
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

Verfasst: Dienstag 20. Oktober 2009, 12:26
von yipyip
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

Verfasst: Donnerstag 22. Oktober 2009, 17:53
von Silent_Simmal
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.

Verfasst: Samstag 24. Oktober 2009, 19:47
von yipyip
Ohne Minimalbeispiel kann man nicht viel dazu sagen. Eine beliebte Fehlerquelle ist ja immer, von einem anderen Thread auf die GUI zuzugreifen.

:wink:
yipyip

Verfasst: Sonntag 25. Oktober 2009, 18:41
von Silent_Simmal
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.

Verfasst: Sonntag 25. Oktober 2009, 19:27
von ms4py
Dann verwende halt einen Pastebin:
http://paste.pocoo.org/