Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2009 16:31:03

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

Всем привет! Такой глюк только у меня или нет: иконка у приложения после компиляции есть, но при нажатии ALT+TAB иконка в списке выбора окон не отображается. В версии птона 2.5 все было ок. Сейчас стоит Питон 2.6 и py2exe-0.6.9.win32-py2.6.
Вот скрипт который в exe загоняет:

from distutils.core import setup
import glob
import py2exe
import sys

inclArr = ['sip',
]

data_files = [(".", glob.glob ("C:/windows/system32/msvcr71.dll")),
(".", glob.glob ("C:/windows/system32/msvcr90.dll")),
("img", glob.glob ("img/*"))]

if len(sys.argv) == 1:
sys.argv.append("py2exe")
sys.argv.append("-q")

setup(windows=[{"script": "script.py",
"icon_resources": [(1, "img/icon.ico")]}],
options={'py2exe': {'includes': inclArr}},
data_files=data_files
)



Офлайн

#2 Фев. 23, 2009 18:26:44

SAnty
От:
Зарегистрирован: 2006-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

приложение запущено, через алт+таб иконка не видна, или видно но стандартная для Фрейма?



Офлайн

#3 Фев. 25, 2009 17:07:26

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

SAnty
приложение запущено, через алт+таб иконка не видна, или видно но стандартная для Фрейма?
Видна стандартная для фрейма. Но если “откмпилить” как консольное приложение, то при запуске появляется консоль и само приложение. Так вот по альтабу у консоли моя иконка, а у приложения - стандартная для фрейма.



Офлайн

#4 Фев. 26, 2009 15:42:05

SAnty
От:
Зарегистрирован: 2006-04-21
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

Если вы прописали параметр ‘icon_resources’ в setup.py, а у вас показывает иконку фрейма, нужно фрейму присвоить иконку в програме.
Непомню как в QT, а в wxWindows это делаеться в конструкторе фрейма:

class MyFrame(wx.Frame):
def __init__(self, parent, ID, title, pos=wx.DefaultPosition,
size=(200, 200), style=wx.DEFAULT_FRAME_STYLE | wx.ICONIZE):
wx.Frame.__init__(self, parent, ID, title, pos, size, style)
iconFile = "img/PYPE.ICO"
icon1 = wx.Icon(iconFile, wx.BITMAP_TYPE_ICO)
self.SetIcon(icon1)



Офлайн

#5 Фев. 26, 2009 16:31:21

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

SAnty
Если вы прописали параметр ‘icon_resources’ в setup.py, а у вас показывает иконку фрейма, нужно фрейму присвоить иконку в програме.
Непомню как в QT, а в wxWindows это делаеться в конструкторе фрейма:

class MyFrame(wx.Frame):
def __init__(self, parent, ID, title, pos=wx.DefaultPosition,
size=(200, 200), style=wx.DEFAULT_FRAME_STYLE | wx.ICONIZE):
wx.Frame.__init__(self, parent, ID, title, pos, size, style)
iconFile = "img/PYPE.ICO"
icon1 = wx.Icon(iconFile, wx.BITMAP_TYPE_ICO)
self.SetIcon(icon1)
У меня так прописано:
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("img/icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)



Офлайн

#6 Фев. 12, 2010 10:03:21

lunariusis
От:
Зарегистрирован: 2010-02-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

У меня та же история.
Файл ui_mainwindow.py

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setEnabled(True)
MainWindow.resize(1024, 768)

MainWindow.setWindowIcon(QtGui.QIcon('data/200.ico'))

# создание трея и МЕНЮ к нему:
self.quitAction = QtGui.QAction(QtGui.QIcon('data/icon1.png'),u'&Выход', self)
self.showAction = QtGui.QAction(QtGui.QIcon('data/icon3.png'),u'&Восстановить', self)
#
#QtCore.QObject.connect(self.quitAction, QtCore.SIGNAL('triggered()'), QtGui.qApp, QtCore.SLOT('quit()'))
QtCore.QObject.connect(self.quitAction, QtCore.SIGNAL('triggered()'), self.exiGame)
QtCore.QObject.connect(self.showAction, QtCore.SIGNAL('triggered()'), self.notrayGo)
#
self.trayIconMenu = QtGui.QMenu(self)
#
self.trayIconMenu.addAction(self.quitAction)
self.trayIconMenu.addAction(self.showAction)
#
self.trayIconPixmap = QtGui.QPixmap('data/200.ico') # файл иконки
self.trayIcon = QtGui.QSystemTrayIcon(self)
self.trayIcon.setContextMenu(self.trayIconMenu)
self.trayIcon.setIcon(QtGui.QIcon(self.trayIconPixmap))
...........................дальше все остальное.......................................
файл webbrowser.py
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()

MainWindow._window_list.append(self)

self.setupUi(self)
#флаг полного открытия окна
self.fullScreen = False
#флаг максимизации окна
self.maximize = self.isMaximized()

if __name__ == "__main__":
def exitGame():
a.exec_()
try:
#удаляем темп и все что в нем есть
cpth = ntpath.abspath(os.curdir)
shutil.rmtree(cpth+"\\game\\tmp")
except:
print "нельзя удалить папку TMP"

a = QtGui.QApplication(sys.argv)
a.setStyleSheet(open("data/mystyle01.qss","rb").read())
w = MainWindow()
w.show()
sys.exit(exitGame())
файл setup.py
# -*- coding: utf-8 -*-

from distutils.core import setup
import py2exe

manifest_template = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="WB" version="0.0.0.1" processorArchitecture="x86" publicKeyToken="123456789"></assemblyIdentity>
<file name="msvcr90.dll" hashalg="SHA1" hash="e0dcdcbfcb452747da530fae6b000d47c8674671">
<asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod>
<dsig:DigestValue>KSaO8M0iCtPF6YEr79P1dZsnomY=</dsig:DigestValue>
</asmv2:hash>
</file>
<file name="msvcp90.dll" hashalg="SHA1" hash="81efe890e4ef2615c0bb4dda7b94bea177c86ebd">
<asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod>
<dsig:DigestValue>ojDmTgpYMFRKJYkPcM6ckpYkWUU=</dsig:DigestValue>
</asmv2:hash>
</file>
<file name="msvcm90.dll" hashalg="SHA1" hash="5470081b336abd7b82c6387567a661a729483b04">
<asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:Transforms>
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform>
</dsig:Transforms>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod>
<dsig:DigestValue>tVogb8kezDre2mXShlIqpp8ErIg=</dsig:DigestValue>
</asmv2:hash></file>
</assembly>
"""

RT_MANIFEST = 24


"""
setup(
windows = [ { 'script': 'webbrowser.py','dest_base':"Limon",'name':"Limon",'version':"0.0.1",'description':"Limon",'copyright':"C Lmon",'company_name':"Limon","icon_resources":[(200,"./data/200.ico")],'other_resources':[(RT_MANIFEST, 1, manifest_template)]}],
options = {"py2exe": {"compressed": 1, "optimize": 1, "bundle_files": 1, "excludes":'calendar',"includes" : ["sip", "PyQt4"] }},
zipfile = "lib/libW.zip",
data_files=[
('.', ['c:\Python26\DLLs\msvcp90.dll']),
('.', ['c:\Python26\DLLs\msvcr90.dll']),
('.', ['c:\Python26\DLLs\msvcm90.dll']),
('.', ['c:\Python26\DLLs\Microsoft.VC90.CRT.manifest']),
('.\data', ['data\icon1.png']),
('.\data', ['data\icon2.png']),
('.\data', ['data\icon3.png']),
('.\data', ['data\\200.ico']),
('.\data', ['data\mystyle01.qss']),
]
)
В конце концов получается екзешник Limon.exe, который в проводнике имеет иконку (./data/200.ico).
Но при запуске окно виджета не имеет этой иконки, точнее стандартная для запускающихся файлов Виндовс. Более того когда сворачиваю в трей, не видно и иконки в трее, место под нее выделяется, на клик правой клавишей реагирует а вот изображения нет.
Если откомпилировать с флагом (console = [{….), то опять же все хорошо в проводнике, т.е. есть иконка файла, если запустить, то “досовское” окно получает иконку а вот окна от Qt не получают эту иконку, хотя я явно прописал это в коде смотри выше.
Если запускать все это в питоне напрямую все работает как надо.
Еще один момент. Если убрать в коде выставление иконки виджетам Qt и откомпилировать в EXE (см setup.py но с параметром console), то в проводнике иконка есть, досовcкое окно получает иконку (видимо по факту наличия ее как ресурса в EXE), а виджеты Qt, уже понятно почему, не имеют иконки….

Резюме-вопрос, почему так может происходить. Ведь в коде явно указано что нужно повесить иконку…., причем в чистом питоне все работает, а вот в EXE уже нет… Сломал мозг себе за три дня… Версии типа - полный путь к иконкам указывать даже не рассматривайте, я проверял, это не то…
Спасибо за то что хоть прочитали :). Надеюсь что-то можно с этим сделать…



Офлайн

#7 Фев. 12, 2010 12:41:47

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

мож иконку в ресурсы запихнуть?



Офлайн

#8 Фев. 12, 2010 12:56:09

lunariusis
От:
Зарегистрирован: 2010-02-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

Ресурсы Qt?
Это конечно хорошее предложение. Надо попробовать, но мне нужны внешние файлы.
И в досовском окне есть иконка, она кстати встраивается как ресурс в EXE файле. Далее иконки в меню и в панели задач видит, они тоже внешние, выборочно не видит только иконку виджета и иконку в трее, так что мне кажется что это не поможет, тем более противоречит задаче (в моем случае), а именно грузить картинки извне… :(



Офлайн

#9 Фев. 14, 2010 16:50:06

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

Иконка в ресурсах должна идти под индексом 0.

setup(windows=[{“script”: “script.py”,
“icon_resources”: }],
options={'py2exe': {'includes': inclArr}},
data_files=data_files
)



Офлайн

#10 Фев. 16, 2010 09:45:37

lunariusis
От:
Зарегистрирован: 2010-02-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT и PyEXE - нет иконки по ALT+TAB

К сожалению это не меняет ситуацию… Для досовского окна есть иконка а вот Qt со стандартной…



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version