Форум сайта python.su
Привет всем формучанам!
Я недавно начал изучать 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_()
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)
Офлайн
Во-первых, Вы забыли вызвать main().
Во-вторых, окно показывается на мгновение и сразу закрывается из-за того, что ссылка на объект tg удаляется при выходе из функции. Ее нужно хранить. А учитывая
ViktorRudможно хранить список окон, чтобы можно было определить их положения.
При нажатии “Create new note” создавалось новое окно основной проги (рядом, а не точно на месте старой)
note_windows = [] def show_window(): tg = TestGui() note_windows.append(tg) tg.show()
QtGui.QApplication.setQuitOnLastWindowClosed(False)
Офлайн
Благодарю 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()
Офлайн