Найти - Пользователи
Полная версия: Tkinter + значок в трее windows
Начало » GUI » Tkinter + значок в трее windows
1
sp3
Тк довольно мощный и в тоже время простой инструмент, но у него не хватает одной фичи - значка в трее. Переходить на другие гуи желания нет, так что хочу найти обходной путь решения этой проблемы.
Нагуглил почти то что мне нужно http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html
Если запускать с Тк в отдельных нитях(threading.Thread) , работает, но есть ряд проблем:
- из меню SysTrayIcon немогу поменять параметр виджета Тк - Тк виснет
- как спрятать окна Тк ?
   window.iconify()
window.overrideredirect(1)
скрывает но остается синяя полоска с именем окна над кнопкой пуск виндовс
sp3
Окошки прятать оказывается легко:
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()
Велосипед у меня получился с квадратными колесами, никуда ни едет :)
Подскажите как сделать правильно.
rip86oz
Насколько знаю - TK будет зависать, когда в разных потоках с ним работаешь. У меня по крайней мере зависал.
sp3
Все, решил проблему :)
данные между потоками передаю списком.
В основном потоке в цикле c помощью window.after(1,foo) проверяю этот список, если там есть команды, выполняю и очищаю его.
Теперь и в Тк можно сворачивать окно в трей :)
sp3
рано радуюсь :(

при загрузке скрипта через python.exe все норм
при загрузке без консоли через pythonw.exe значок в трее не появляется.
rip86oz
Все нормально. pythonw.exe - он-же IDLE, он с многопоточностью плохо дружит.
Просто попробуй любой пример с 2-мя потоками где в каждом будет задержка time.sleep(x) например - в IDLE будет полная фигня.
sp3
Все. Разобрался. Файлы иконок я указал с относительными путями, а запуск python и pythonw у меня по разному происходит, текущая директория не меняется и питон просто не видел эти файлы.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB