У вас есть 3 условия блокировки: цикл while
, проверка почты и time.sleep. Все они каким-то образом блокируют интерфейс (что позволяет рисовать и взаимодействовать в главном событии приложения l oop), причем while
является «наиболее блокирующим»: до его выхода GUI блокируется. , поэтому значок не закрашен (на самом деле ничего, связанного с GUI, не будет работать, включая главное окно, если вы его показали).
Поскольку проверка почты может потребовать некоторого времени для обработать, вам нужно будет поместить это в отдельный поток.
В этом примере я поместил logi c внутри подкласса главного окна, потому что вы, вероятно, будете использовать его в качестве основного "контейнера". "для вашей программы. Другие альтернативы включают использование подклассов QObject или самого QApplication.
server = 'mail.mailserver.com'
email = 'myname@mailserver.com'
class MailChecker(QtCore.QThread):
mailAvailable = QtCore.pyqtSignal(bool)
def __init__(self, server, mail):
super().__init__()
self.server = server
self.mail = mail
def run(self):
while True:
a = extest4.connect(self.server, self.email)
if a.inbox.unread_count > 0:
a.inbox.refresh()
self.mailAvailable.emit(True)
else:
self.mailAvailable.emit(False)
extest4.close_connections()
QtCore.QThread.sleep(10)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.trayIcon = QtWidgets.QSystemTrayIcon(
QtGui.QIcon(r'payments.PNG'), self)
self.trayIcon.activated.connect(self.show)
self.mailChecker = MailChecker(server, email)
self.mailChecker.mailAvailable.connect(self.trayIcon.setVisible)
self.mailChecker.start()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(app.exec_())