2009-10-11 48 views
35

Làm cách nào để đặt biểu tượng thanh tác vụ của ứng dụng trong PyQt4?Cách đặt biểu tượng thanh tác vụ của ứng dụng trong Windows 7

Tôi đã thử setWindowIcon và nó đặt thành công biểu tượng ở trên cùng bên trái của cửa sổ chính, nhưng nó không ảnh hưởng đến biểu tượng được hiển thị trong thanh tác vụ Windows 7 - biểu tượng thanh tác vụ vẫn là biểu tượng pyw python mặc định. Đây là mã của tôi:

from PyQt4 import QtGui 

app = QtGui.QApplication([]) 
mainwindow = QtGui.QMainWindow() 
mainwindow.show() 

app.setWindowIcon(QtGui.QIcon('chalk.ico')) 
mainwindow.setWindowIcon(QtGui.QIcon('chalk.ico')) 
app.exec_() 

[cập nhật] Tôi đã thử đặt setWindowIcon() trước show(). Tôi đã thử nó với hình ảnh khác, ico và png. Không có gì giúp.

+0

Không đặt biểu tượng trước khi bạn '.show()' trợ giúp cửa sổ? –

+0

Không, nó không có sự khác biệt nếu tôi đặt biểu tượng trước '.show()'. – DamonJW

+0

Bạn có thử một tệp hình ảnh khác không? Mã của bạn hoạt động tốt cho tôi với một tệp png ngẫu nhiên, mặc dù tôi đang sử dụng KDE4. –

Trả lời

79

Tôi đã tìm thấy câu trả lời, sau một số lần đào.

Trong Windows 7, thanh tác vụ không dành cho "Windows ứng dụng", nó dành cho "Mô hình người dùng ứng dụng". Ví dụ, nếu bạn có nhiều trường hợp khác nhau của ứng dụng đang chạy, và mỗi cá thể có biểu tượng riêng của nó, thì tất cả chúng sẽ được nhóm lại dưới một biểu tượng trên thanh tác vụ. Windows sử dụng các chẩn đoán khác nhau để quyết định xem các cá thể khác nhau có nên được nhóm lại hay không và trong trường hợp này, nó quyết định rằng mọi thứ được lưu trữ bởi Pythonw.exe nên được nhóm lại dưới biểu tượng cho Pythonw.exe.

Giải pháp đúng là dành cho Pythonw.exe để cho Windows biết rằng nó chỉ đơn thuần là lưu trữ các ứng dụng khác. Có lẽ một phiên bản tương lai của Python sẽ làm điều này. Ngoài ra, bạn có thể thêm một khóa đăng ký để cho Windows biết rằng Pythonw.exe chỉ là một máy chủ chứ không phải là một ứng dụng theo đúng nghĩa của nó. Xem tài liệu MSDN cho AppUserModelIDs.

Ngoài ra, bạn có thể sử dụng một cuộc gọi Windows từ Python, để nói một cách rõ ràng của Windows gì đúng AppUserModelID là cho quá trình này:

import ctypes 
myappid = 'mycompany.myproduct.subproduct.version' # arbitrary string 
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) 

EDIT: Xin vui lòng xem câu trả lời Ronan: chuỗi myappid nên unicode.

+0

Bạn nên chấp nhận câu trả lời của riêng mình nếu nó khắc phục được sự cố của bạn. :) – Macke

+0

Cảm ơn! Tôi cần điều tương tự bằng cách sử dụng PySide. – BaldDude

+0

Cách tìm hiểu myappid là gì? – aBiologist

4

Bạn phải đặt AppUserModelID trước khi ứng dụng của bạn hiển thị bất kỳ GUI nào. Nếu bạn cần truy cập các tính năng khác của Windows 7, bạn có thể xem Q7Goodies là một tiện ích bổ sung Qt cho Windows 7 với các ràng buộc PyQt.

4

@ Câu trả lời của DamonJW sẽ hoạt động, nhưng có một sự bắt nhỏ: myappid phải là unicode (loại đối số là PCWSTR).

import ctypes 
myappid = u'mycompany.myproduct.subproduct.version' # arbitrary string 
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) 

Nếu không nhận được AppUserModelID sẽ nhận được các ký tự unicode sai (祭潣灭湡⹹祭牰摯捵⹴畳灢潲畤瑣瘮牥楳湯):

import ctypes 
from ctypes import wintypes 
lpBuffer = wintypes.LPWSTR() 
AppUserModelID = ctypes.windll.shell32.GetCurrentProcessExplicitAppUserModelID 
AppUserModelID(ctypes.cast(ctypes.byref(lpBuffer), wintypes.LPWSTR)) 
appid = lpBuffer.value 
ctypes.windll.kernel32.LocalFree(lpBuffer) 
if appid is not None: 
    print(appid) 

Điều đó nói rằng, nó là một điều nhỏ, kể từ khi Windows vẫn sẽ nhận ra chuỗi unicode là "một quá trình" và chuyển đổi biểu tượng cho phù hợp.

+0

Tôi không thể làm cho mã của bạn hoạt động, nhưng câu trả lời từ @DamonJW đã làm việc cho tôi. – uruloke

+0

Phần đầu tiên của mã của tôi giống với @ DamonJW, ngoại trừ 'u' được thêm vào trong chuỗi' myappid'. Phần thứ hai chỉ là kiểm tra chuỗi thực mà Windows đang "nhìn thấy". –

+0

Ngoài ra tốt đẹp. Có lẽ đây không phải là vấn đề trên Python 3 vì tất cả các chuỗi đều là unicode. – Snorfalorpagus

Các vấn đề liên quan