Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2011 10:57:31

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Тк довольно мощный и в тоже время простой инструмент, но у него не хватает одной фичи - значка в трее. Переходить на другие гуи желания нет, так что хочу найти обходной путь решения этой проблемы.
Нагуглил почти то что мне нужно http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html
Если запускать с Тк в отдельных нитях(threading.Thread) , работает, но есть ряд проблем:
- из меню SysTrayIcon немогу поменять параметр виджета Тк - Тк виснет
- как спрятать окна Тк ?

   window.iconify()
window.overrideredirect(1)
скрывает но остается синяя полоска с именем окна над кнопкой пуск виндовс



Офлайн

#2 Май 24, 2011 00:37:40

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Окошки прятать оказывается легко:

window.state('withdrawn') # спрятать
window.state('normal') #показать
window.state('iconic') #свернуть
С зависанием так и не смог справиться


from Tkinter import *
import threading
import Queue
from random import random

root = Tk()
root.geometry("%dx%d%+d%+d" % (200, 200, 5, 5))

Button(root, text = 'hide /threading',command = lambda *e:getcomandque.put('hidewindow')).pack()
Button(root, text = 'show /threading',command = lambda *e:getcomandque.put('showwindow')).pack()

Button(root, text = 'hide /root',command = lambda *e: tpl.event_generate('<<hideme>>')).pack()
Button(root, text = 'show /root',command = lambda *e: tpl.event_generate('<<showme>>')).pack()

tpl = Toplevel(root)
tpl.geometry("%dx%d%+d%+d" % (200, 200, 250, 5))
tpl.event_add ( '<<hideme>>','<F9>',)
tpl.event_add ( '<<showme>>','<F12>')
tpl.bind_all( '<<hideme>>', lambda *e: tpl.state('withdrawn'))
tpl.bind_all( '<<showme>>', lambda *e: tpl.state('normal'))

x = Button(tpl, text = 'rtololo',command = lambda *e:x.config(text=random()))
x.pack()


class MyThreadComand(threading.Thread):
def run(self):
while True:
command = getcomandque.get()
if command != None:
print 'command',command
if command == 'hidewindow':
tpl.state('withdrawn')
if command == 'showwindow':
tpl.state('normal')
print 'ok'

getcomandque = Queue.Queue()
MyThreadComand().start()
root.mainloop()
Велосипед у меня получился с квадратными колесами, никуда ни едет :)
Подскажите как сделать правильно.



Офлайн

#3 Май 24, 2011 09:25:44

rip86oz
От:
Зарегистрирован: 2011-03-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Насколько знаю - TK будет зависать, когда в разных потоках с ним работаешь. У меня по крайней мере зависал.



Офлайн

#4 Май 24, 2011 09:33:57

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Все, решил проблему :)
данные между потоками передаю списком.
В основном потоке в цикле c помощью window.after(1,foo) проверяю этот список, если там есть команды, выполняю и очищаю его.
Теперь и в Тк можно сворачивать окно в трей :)



Офлайн

#5 Май 24, 2011 10:00:43

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

рано радуюсь :(

при загрузке скрипта через python.exe все норм
при загрузке без консоли через pythonw.exe значок в трее не появляется.



Офлайн

#6 Май 24, 2011 13:42:51

rip86oz
От:
Зарегистрирован: 2011-03-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Все нормально. pythonw.exe - он-же IDLE, он с многопоточностью плохо дружит.
Просто попробуй любой пример с 2-мя потоками где в каждом будет задержка time.sleep(x) например - в IDLE будет полная фигня.



Отредактировано (Май 24, 2011 13:44:05)

Офлайн

#7 Май 24, 2011 20:13:54

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Tkinter + значок в трее windows

Все. Разобрался. Файлы иконок я указал с относительными путями, а запуск python и pythonw у меня по разному происходит, текущая директория не меняется и питон просто не видел эти файлы.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version