不显示图标
does not show icons
我刚刚安装了 Python3 (3.5.2) 和 Pyqt5 (5.8.2),我正在按照本教程学习和制作 GUI:http://zetcode.com/gui/pyqt5/firstprograms/
我正在尝试 运行 第二个示例,但程序返回错误(这也发生在第一个示例中,但由于它没有图像,我没有注意到)如下:
QApplication: invalid style override passed, ignoring it.
No XVisualInfo for format QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize 1, greenBufferSize 1, blueBufferSize 1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(SingleBuffer), swapInterval 1, profile QSurfaceFormat::OpenGLContextProfile(NoProfile))
Falling back to using screens root_visual.
这是什么意思?我是不是少了一些包裹?
我先用这个命令安装了pyqt:
sudo -H pip3 install PyQt5
但是 Python3 没有承认它的存在所以我搜索了 apt ubuntu 存储库并安装了:
sudo apt install python3-PyQt5
我还尝试通过完整路径 /foo/bar/image.png 引用图像,但什么也没有
有什么问题?
编辑#1
我使用的代码来自示例 2:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
ZetCode PyQt5 tutorial
This example shows an icon
in the titlebar of the window.
author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""
import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
base_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(base_dir)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('image.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在您 post 之后,我重新安装了所有软件包。错误略有不同,但结果是一样的:
python3 example_02.py
QApplication: invalid style override passed, ignoring it.
屏幕截图:
所以首先,您的代码没有错误。这更像是警告,但又不是。下面这行告诉你什么
QApplication: invalid style override passed, ignoring it
是您的样式选项无效。如果这是一个错误,您的脚本根本不会 运行。
我马上看到的是,您永远不会提供图像的路径。
现在,如果图像与脚本位于同一根目录中,那么它应该可以识别没有路径的图像。但是,如果你试图做我认为你正在做的事情,那无论如何都行不通。我认为您正在尝试创建一个启动器图标和一个标题栏图标,这通常是相辅相成的。
在我看来,您已将它作为某种形式的资源文件添加到 Atom 中。在这种情况下,大多数 Ide 会为该文件创建一个路径。有时是路径,有时是本地 url。当与 QT 创建者一起工作时,QT 本身就可以做到这两点。
我从未使用过 Atom,所以无法告诉您它是如何工作的。
我能说的就是这些。您使用的是 Linux,这意味着 .ico 文件没有用。我之前告诉过你 linux 处理图标文件的方式与 windows 不同。这很可能是您的问题。
所以我建议你看看这个
https://askubuntu.com/questions/476981/how-do-i-make-a-desktop-icon-to-launch-a-program
读完之后,如果需要,请看一下这个https://help.ubuntu.com/community/UnityLaunchersAndDesktopFiles#Using_a_text_editor
这两个 link 都解释了如何为您的程序创建启动器图标。
下面link将说明如何在您的程序中设置菜单栏(标题栏)的图标。
PyQt4 set windows taskbar icon
希望对您有所帮助!
请注意,所有应用程序都没有图标,不仅仅是 PyQt 图标示例。这是因为默认情况下,某些环境会关闭标题栏中的图标。你必须启用它们。
例如在Xfce桌面环境中,我们可以使用xfce4-settings-editor
工具。在 Settings/Settings 编辑器 select xfwm4
中。
找到 show_app_icon
选项并检查它。来回更改主题以查看更改;它们不会立即可见。
在此之后,您将在 PyQt5 示例的标题栏中看到该图标。
至于警告;这是最近发生的事情,它必须做点什么
Qt 和 GTK 主题之间的不兼容。我还没发现
到目前为止删除警告的解决方案。
我向提出这个问题的作者学习了PyQt5,我也遇到了图标无法显示的问题,我尝试了一些方法来解决它,这就是我所做的,希望它有效!
首先,请务必使用图标的绝对路径,例如:
self.setWindowIcon(QIcon("F:/Workspace/PyQT5-Study/images/web.png"))
但这不是一个好主意,所以你可以使用第二种方式:
from PyQt5.QtCore import QFileInfo
# ...
def initUI(self):
# ...
root = QFileInfo(__file__).absolutePath()
self.setWindowIcon(QIcon(root+'/images/web.png'))
# or
# import os
# current_dir = os.path.dirname(os.path.realpath(__file__))
# self.setWindowIcon(QIcon(os.path.join(current_dir, 'images/web.png')))
# ...
最后,如果你的图标也不能显示,你应该检查这个图标,如果它是合法的图标。
简而言之,普通图片无限多,可以存储很多图片,可以轻松转换,但是图标有一定的大小,颜色种类,更重要的是,图标有透明度,也就是说你可以看到背景,他们有框架(不总是直的)。所以你可以使用网络在线工具来转换你的图像然后再试一次,这对我很有帮助!
另外你应该检查图标的源格式,确保你永远不会改变它,比如 .jpg 到 .png 等。这会产生问题!
希望你能解决问题![=12=]
我遇到了完全相同的问题。
要事第一。 QWidget或QMainWindow类下其实并没有setWindowIcon()方法。您应该尝试在应用程序级别设置 QIcon,如下所示。
app = QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon('home.png'))
其次,使用此代码创建的图标不会反映在 window 的标题上,而是会反映为应用程序图标,如下图所示。 home.png
Ubuntu 中的“应用程序图标”,而不是 Window 标题上的“图标”
最后,路径无所谓,可以是绝对路径也可以是相对路径,系统会考虑。
在 windows 上确保使用真实的 .ico 文件和完整路径
iconpath = os.path.join(os.getcwd(),'qtlearning','assets','python.ico')
self.setWindowIcon(QIcon(iconpath))
我只是提供了图标的完整路径,就这么简单
我刚刚安装了 Python3 (3.5.2) 和 Pyqt5 (5.8.2),我正在按照本教程学习和制作 GUI:http://zetcode.com/gui/pyqt5/firstprograms/
我正在尝试 运行 第二个示例,但程序返回错误(这也发生在第一个示例中,但由于它没有图像,我没有注意到)如下:
QApplication: invalid style override passed, ignoring it.
No XVisualInfo for format QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize 1, greenBufferSize 1, blueBufferSize 1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(SingleBuffer), swapInterval 1, profile QSurfaceFormat::OpenGLContextProfile(NoProfile))
Falling back to using screens root_visual.
这是什么意思?我是不是少了一些包裹?
我先用这个命令安装了pyqt:
sudo -H pip3 install PyQt5
但是 Python3 没有承认它的存在所以我搜索了 apt ubuntu 存储库并安装了:
sudo apt install python3-PyQt5
我还尝试通过完整路径 /foo/bar/image.png 引用图像,但什么也没有
有什么问题?
编辑#1
我使用的代码来自示例 2:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
ZetCode PyQt5 tutorial
This example shows an icon
in the titlebar of the window.
author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""
import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
base_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(base_dir)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('image.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在您 post 之后,我重新安装了所有软件包。错误略有不同,但结果是一样的:
python3 example_02.py
QApplication: invalid style override passed, ignoring it.
屏幕截图:
所以首先,您的代码没有错误。这更像是警告,但又不是。下面这行告诉你什么
QApplication: invalid style override passed, ignoring it
是您的样式选项无效。如果这是一个错误,您的脚本根本不会 运行。
我马上看到的是,您永远不会提供图像的路径。
现在,如果图像与脚本位于同一根目录中,那么它应该可以识别没有路径的图像。但是,如果你试图做我认为你正在做的事情,那无论如何都行不通。我认为您正在尝试创建一个启动器图标和一个标题栏图标,这通常是相辅相成的。
在我看来,您已将它作为某种形式的资源文件添加到 Atom 中。在这种情况下,大多数 Ide 会为该文件创建一个路径。有时是路径,有时是本地 url。当与 QT 创建者一起工作时,QT 本身就可以做到这两点。
我从未使用过 Atom,所以无法告诉您它是如何工作的。
我能说的就是这些。您使用的是 Linux,这意味着 .ico 文件没有用。我之前告诉过你 linux 处理图标文件的方式与 windows 不同。这很可能是您的问题。
所以我建议你看看这个 https://askubuntu.com/questions/476981/how-do-i-make-a-desktop-icon-to-launch-a-program
读完之后,如果需要,请看一下这个https://help.ubuntu.com/community/UnityLaunchersAndDesktopFiles#Using_a_text_editor
这两个 link 都解释了如何为您的程序创建启动器图标。
下面link将说明如何在您的程序中设置菜单栏(标题栏)的图标。 PyQt4 set windows taskbar icon
希望对您有所帮助!
请注意,所有应用程序都没有图标,不仅仅是 PyQt 图标示例。这是因为默认情况下,某些环境会关闭标题栏中的图标。你必须启用它们。
例如在Xfce桌面环境中,我们可以使用xfce4-settings-editor
工具。在 Settings/Settings 编辑器 select xfwm4
中。
找到 show_app_icon
选项并检查它。来回更改主题以查看更改;它们不会立即可见。
在此之后,您将在 PyQt5 示例的标题栏中看到该图标。
至于警告;这是最近发生的事情,它必须做点什么 Qt 和 GTK 主题之间的不兼容。我还没发现 到目前为止删除警告的解决方案。
我向提出这个问题的作者学习了PyQt5,我也遇到了图标无法显示的问题,我尝试了一些方法来解决它,这就是我所做的,希望它有效!
首先,请务必使用图标的绝对路径,例如:
self.setWindowIcon(QIcon("F:/Workspace/PyQT5-Study/images/web.png"))
但这不是一个好主意,所以你可以使用第二种方式:
from PyQt5.QtCore import QFileInfo
# ...
def initUI(self):
# ...
root = QFileInfo(__file__).absolutePath()
self.setWindowIcon(QIcon(root+'/images/web.png'))
# or
# import os
# current_dir = os.path.dirname(os.path.realpath(__file__))
# self.setWindowIcon(QIcon(os.path.join(current_dir, 'images/web.png')))
# ...
最后,如果你的图标也不能显示,你应该检查这个图标,如果它是合法的图标。
简而言之,普通图片无限多,可以存储很多图片,可以轻松转换,但是图标有一定的大小,颜色种类,更重要的是,图标有透明度,也就是说你可以看到背景,他们有框架(不总是直的)。所以你可以使用网络在线工具来转换你的图像然后再试一次,这对我很有帮助!
另外你应该检查图标的源格式,确保你永远不会改变它,比如 .jpg 到 .png 等。这会产生问题! 希望你能解决问题![=12=]
我遇到了完全相同的问题。
要事第一。 QWidget或QMainWindow类下其实并没有setWindowIcon()方法。您应该尝试在应用程序级别设置 QIcon,如下所示。
app = QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon('home.png'))
其次,使用此代码创建的图标不会反映在 window 的标题上,而是会反映为应用程序图标,如下图所示。 home.png
Ubuntu 中的“应用程序图标”,而不是 Window 标题上的“图标”
最后,路径无所谓,可以是绝对路径也可以是相对路径,系统会考虑。
在 windows 上确保使用真实的 .ico 文件和完整路径
iconpath = os.path.join(os.getcwd(),'qtlearning','assets','python.ico')
self.setWindowIcon(QIcon(iconpath))
我只是提供了图标的完整路径,就这么简单