Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2013 22:14:30

ViktorRud
Зарегистрирован: 2013-01-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Иконка в трее для программы

Привет всем формучанам!
Я недавно начал изучать Pythoh и это мой первый язык программирования, так что извиняюсь если вопрос глупый.
Суть вопроса: есть элементарный код проги - типа “привет”, и есть код проги отображающий иконку в трее (Виндос) - Как совместить эти две проги чтоб при запуске “привет” отображалась иконка проги в трее и события были связаны - т.е закрытие программы закрывает иконку в трее и при закрытии из контекстного меню в треи закрывается вся программа. При нажатии “Create new note” создавалось новое окно основной проги (рядом, а не точно на месте старой)
Вот поставил себе цель, но похоже не смогу справится без вашей помощи. (Программированием начал заниматься совсем недавно). Цель вопроса: увидеть решение на конкретном примере и если можно с пояснениями (если не лень) или ссылками на ресурсы чтоб я смог поумнеть.
Вот код основной прoги, (файл - proga2.py):

# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class TestGui(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setGeometry(600, 300, 500, 150)
        self.setWindowTitle(u"Первое GUI-приложение")
        self.setWindowIcon(QtGui.QIcon('data/crazy.ico'))
        lTitle = QtGui.QLabel(u"Пример GUI-приложения", self)
        lTitle.setAlignment(QtCore.Qt.AlignHCenter)
        lTitle.setGeometry(100,10,300,20)
        fntMyFont = QtGui.QFont(self)
        fntMyFont.setBold(True)
        fntMyFont.setPixelSize(18)
        lTitle.setFont(fntMyFont)
        lDescription = QtGui.QLabel(u"Это наше первое GUI-приложение\nСпециально для Viktor", self)
        lDescription.setAlignment(QtCore.Qt.AlignHCenter)
        lDescription.setGeometry(100, 35, 300, 40)
        fntMyFont2 = QtGui.QFont(self)
        fntMyFont2.setItalic(True)
        fntMyFont2.setPixelSize(14)
        lDescription.setFont(fntMyFont2)
        btnQuit = QtGui.QPushButton(u"Выйти", self)
        btnQuit.setGeometry(150, 75, 200, 30)
        self.connect(btnQuit, QtCore.SIGNAL('clicked()'), quit)
app = QtGui.QApplication(sys.argv)
tg = TestGui()
tg.show()
app.exec_()

А вот код проги для иконки в треи (файл - icon.py):

from PyQt4 import QtCore, QtGui
import sys
def main():
    app = QtGui.QApplication(sys.argv)
    tray = QtGui.QSystemTrayIcon()
    icon = app.style().standardIcon(QtGui.QStyle.SP_DesktopIcon)
    tray.setIcon(icon)
    tray.show()
    CreateMenu(tray, app)
    sys.exit(app.exec_())
def CreateMenu(tray, app):
    m1 = QtGui.QMenu("Menu 1")
    m2 = QtGui.QMenu("Notes", parent=m1)
    m2.addAction("Create new note")
    m1.addMenu(m2)
    m1.addSeparator()
    m1.addAction("Quit", app.quit)
    tray.setContextMenu(m1)
if __name__ == '__main__':
    main()

Ну, и на по следок вот что я смог на мучить, правда ничего не получилось:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class TestGui(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setGeometry(600, 300, 500, 150)
        self.setWindowTitle(u"Первое GUI-приложение")
        self.setWindowIcon(QtGui.QIcon('data/crazy.ico'))
        lTitle = QtGui.QLabel(u"Пример GUI-приложения", self)
        lTitle.setAlignment(QtCore.Qt.AlignHCenter)
        lTitle.setGeometry(100,10,300,20)
        fntMyFont = QtGui.QFont(self)
        fntMyFont.setBold(True)
        fntMyFont.setPixelSize(18)
        lTitle.setFont(fntMyFont)
        lDescription = QtGui.QLabel(u"Это наше первое GUI-приложение\nСпециально для Viktor", self)
        lDescription.setAlignment(QtCore.Qt.AlignHCenter)
        lDescription.setGeometry(100, 35, 300, 40)
        fntMyFont2 = QtGui.QFont(self)
        fntMyFont2.setItalic(True)
        fntMyFont2.setPixelSize(14)
        lDescription.setFont(fntMyFont2)
        btnQuit = QtGui.QPushButton(u"Выйти", self)
        btnQuit.setGeometry(150, 75, 200, 30)
        self.connect(btnQuit, QtCore.SIGNAL('clicked()'), quit)
def show_window():
    tg = TestGui()
    tg.show()
def createMenu(tray, app):
    m1 = QtGui.QMenu("Menu 1")
    m2 = QtGui.QMenu("Notes", parent=m1)
    m3 = m2.addAction("Create new note")
    m3.triggered.connect(show_window)
    m1.addMenu(m2)
    m1.addSeparator()
    m1.addAction("Quit", app.quit)
    tray.setContextMenu(m1)
def main():
    app = QtGui.QApplication(sys.argv)
    tray = QtGui.QSystemTrayIcon()
    icon = app.style().standardIcon(QtGui.QStyle.SP_DesktopIcon)
    tray.setIcon(icon)
    tray.show()
    createMenu(tray, app)
    sys.exit(app.exec_())

Отредактировано ViktorRud (Янв. 18, 2013 10:16:49)

Офлайн

#2 Янв. 19, 2013 11:45:04

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Иконка в трее для программы

Во-первых, Вы забыли вызвать main().

Во-вторых, окно показывается на мгновение и сразу закрывается из-за того, что ссылка на объект tg удаляется при выходе из функции. Ее нужно хранить. А учитывая

ViktorRud
При нажатии “Create new note” создавалось новое окно основной проги (рядом, а не точно на месте старой)
можно хранить список окон, чтобы можно было определить их положения.
note_windows = []
def show_window():
    tg = TestGui()
    note_windows.append(tg)
    tg.show()
Проверку положения и управление окнами попробуйте сделать сами.

Сразу добавлю, чтобы программа не завершалась при закрытии последнего окна, нужно в main() добавить:
QtGui.QApplication.setQuitOnLastWindowClosed(False)

Ну а самый полный источник по Qt - документация (правда C++).

Офлайн

#3 Янв. 20, 2013 13:54:07

ViktorRud
Зарегистрирован: 2013-01-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Иконка в трее для программы

Благодарю reclosedev!
Теперь всё работает, осталось разобраться с положением и управлением окон.
Если кому то интересно - вот код что у меня получился:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
class TestGui(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.setGeometry(600, 300, 500, 150)
        self.setWindowTitle(u"Первое GUI-приложение")
        self.setWindowIcon(QtGui.QIcon('data/crazy.ico'))
        lTitle = QtGui.QLabel(u"Пример GUI-приложения", self)
        lTitle.setAlignment(QtCore.Qt.AlignHCenter)
        lTitle.setGeometry(100,10,300,20)
        fntMyFont = QtGui.QFont(self)
        fntMyFont.setBold(True)
        fntMyFont.setPixelSize(18)
        lTitle.setFont(fntMyFont)
        lDescription = QtGui.QLabel(u"Это наше первое GUI-приложение\nСпециально для Viktor", self)
        lDescription.setAlignment(QtCore.Qt.AlignHCenter)
        lDescription.setGeometry(100, 35, 300, 40)
        fntMyFont2 = QtGui.QFont(self)
        fntMyFont2.setItalic(True)
        fntMyFont2.setPixelSize(14)
        lDescription.setFont(fntMyFont2)
        btnQuit = QtGui.QPushButton(u"Выйти", self)
        btnQuit.setGeometry(150, 75, 200, 30)
        self.connect(btnQuit, QtCore.SIGNAL('clicked()'), quit)
note_windows = []
def show_window():
    tg = TestGui()
    note_windows.append(tg)
    tg.show()
def createMenu(tray, app):
    m1 = QtGui.QMenu("Menu 1")
    m2 = QtGui.QMenu("Notes", parent=m1)
    m3 = m2.addAction("Create new note")
    m3.triggered.connect(show_window)
    m1.addMenu(m2)
    m1.addSeparator()
    m1.addAction("Quit", app.quit)
    tray.setContextMenu(m1)
def main():
    app = QtGui.QApplication(sys.argv)
    QtGui.QApplication.setQuitOnLastWindowClosed(False)
    window = TestGui() # Создаем экземпляр класса
    window.setWindowTitle(u"Первое GUI-приложение")
    window.resize(500, 150)
    window.show() # Отображаем окно
    tray = QtGui.QSystemTrayIcon()
    icon = app.style().standardIcon(QtGui.QStyle.SP_DesktopIcon)
    tray.setIcon(icon)
    tray.show()
    createMenu(tray, app)
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version