Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.188.16] |
|
Сообщ.
#1
,
|
|
|
Дано:
Есть скрипт, написанный на Питоне с использованием PyQt. При запуске из консоли все "шоколадно" - появляется окошко, нажимаются кнопочки и все такое прочее. Проблема: Но если этот же скрипт попытаться запустить ярлыком с рабочего стола, то главное окошко появляется на несколько секунд, а потом исчезает. При этом процесс питона остается в памяти. Иконки в таскбаре не появляется вообще. Я обсуждал с Антоном эту проблему. Он сказал, что то ли имя процесса должно совпадать с именем иконки, то ли что-то еще в этом духе. Для джавы это дело решается каким-то ключем при запуске. Существует ли более общее решение? (сразу скажу: предлагать не писать на питоне, а писать на С не предлагать, мне нужен именно питон). |
Сообщ.
#2
,
|
|
|
А не мог бы ты выложить здесь маленький скриптик, с которым проблема воспроизводится?
|
Сообщ.
#3
,
|
|
|
Любой пример из стандартного туториала к PyQt годится. Тут дело не в содержимом скрипта, имхо.
Эти примеры лежат в каталоге /где/там/установлен/Питон/doc/PyQt/examples2/ Начиная с tut1.py. |
Сообщ.
#4
,
|
|
|
Вот короткий скрипт, который перечисленными проблемами не страдает:
#!/usr/bin/env python import sys from qt import * from qtpe import QPEApplication a = QPEApplication(sys.argv) mainWindow = QMainWindow() button = QPushButton("Hello World!", mainWindow) mainWindow.setCentralWidget(button) a.showMainWidget(mainWindow) a.exec_loop() Правда, он создает fullscreen окно, а не маленькое окошечко. (Мне это скорее нравится, но, возможно, бывают другие вкусы. ) Насколько я понимаю, QPEApplication, QMainWindow и setCentralWidget существенны. PS У меня стоят пакеты python и pyqt из http://www.linuxdojo.net/zaurus/feed/ |
Сообщ.
#5
,
|
|
|
Ах вот где собака порылась!!!
Спасибо. Однако, остается вопрос простоты портируемости питоновского кода. Вот что мне сказал Питон под RedHat: Цитата Traceback (most recent call last): File "./testQt.py", line 5, in ? from qtpe import QPEApplication ImportError: No module named qtpe Резюме: как ни крути, если хочешь, чтобы твой код работал и на "большом линуксе" и под Кутопией, нужно иметь по крайней мере две различные имплементации для главного окна. Ладно, будем копать дальше. Добавлено Все равно там что-то не то... Да, появляется красивое большое окошко, иконка появляется в таскбаре, но в меню задач (который по Shift-Menu) эта задача отсутствует! А если запустить его из шелловского скрипта, то и иконка не появляется. Чем дальше, тем интереснее... |
Сообщ.
#6
,
|
|
|
Цитата dmych @ Да, появляется красивое большое окошко, иконка появляется в таскбаре, но в меню задач (который по Shift-Menu) эта задача отсутствует! А если запустить его из шелловского скрипта, то и иконка не появляется. Чем дальше, тем интереснее... В pdaX PyGtk нормально всё отрабатывает Может глюки именно в PyQt? |
Сообщ.
#7
,
|
|
|
Я думаю, это не глюки. Просто матчасть надо учить...
Кроме того, я писал про Кутопию, а не Иксы. |
Сообщ.
#8
,
|
|
|
Цитата dmych @ Однако, остается вопрос простоты портируемости питоновского кода. Например, вот так: #!/usr/bin/env python import sys from qt import * try: from qtpe import QPEApplication useQtopia = 1 except ImportError: QPEApplication = QApplication useQtopia = 0 a = QPEApplication(sys.argv) mainWindow = QMainWindow() mainWindow.setCaption("Test") button = QPushButton("Hello World!", mainWindow) mainWindow.setCentralWidget(button) if useQtopia: a.showMainWidget(mainWindow) else: mainWindow.resize(640, 480) a.setMainWidget(mainWindow) mainWindow.show() a.exec_loop() Цитата Да, появляется красивое большое окошко, иконка появляется в таскбаре, но в меню задач (который по Shift-Menu) эта задача отсутствует! setCaption в приведенном выше коде решает эту проблему. Цитата А если запустить его из шелловского скрипта, то и иконка не появляется. Вот тут помочь не могу -- у меня появляется. (Разумеется, появляется только при запуске ровно того файла, что отображен на десктопе -- иначе откуда иконке взяться?) |
Сообщ.
#9
,
|
|
|
Ага. Сенькс. Попробую на досуге.
|
Сообщ.
#10
,
|
|
|
Работает неплохо. Однако, заметил еще такую странность: если запустить скрипт из консоли,
а потом переключиться на другое приложение и обратно, то Заурус пытается перейти в Magnified screen mode, после чего как правило падает Кутопия. Может, конечно, это трабла именно моего экземпляра, не знаю. Да, вот еще что. При нажатии на кнопку (или меню), на которую повесил что-нть вроде: QObject.connect(btnQuit, SIGNAL("clicked()"), a, SLOT("quit()")) (как прописано в туториале Qt) на десктопе происходит нормальное завершение приложения, а на Заурусе окошко исчезает, но иконка в таксбаре остается, и если ткуть в нее, программа запустится снова... Что ж, пойду читать мануалы по QPE... Кстати, никто не знает где можно скачать доки (не онлайн, а чтобы положить на Завр)? |
Сообщ.
#11
,
|
|
|
Чем дальше в лес -- тем труднее давать советы, не видя исходного кода. Если приведешь скриптик, с которым проблемы воспроизводятся -- может быть, я (или кто-то другой) смогу дать конкретный совет, как этих проблем избежать.
Абстрактно могу посоветовать поискать в интернете готовые программы на Python/Qte -- и почитать их код. |
Сообщ.
#12
,
|
|
|
Ок. Вот такой скриптик (часть взята из туториального menu.py):
#!/usr/bin/env python import sys from qt import * class MyMenu(QWidget): def __init__(self, parent=None, name=None): apply(QWidget.__init__, (self, parent, name)) self.file = QPopupMenu( self ) #CHECK_PTR( self.file ); self.file.insertItem("&New", self.news, Qt.CTRL+Qt.Key_N) self.file.insertItem("&Open", self.open, Qt.CTRL+Qt.Key_O) self.file.insertItem("&Save", self.save, Qt.CTRL+Qt.Key_S) self.file.insertSeparator() self.file.insertItem("E&xit", qApp, SLOT( "quit()" ), Qt.CTRL+Qt.Key_Q) self.help = QPopupMenu( self ) #CHECK_PTR( self.help ) self.help.insertItem("&About", self.about, Qt.CTRL+Qt.Key_H) self.help.insertItem("About &Qt", self.aboutQt) self.menu = QMenuBar( self ) #CHECK_PTR( self.menu ); self.menu.insertItem( "&File", self.file ) self.menu.insertSeparator() self.menu.insertItem( "&?", self.help ) self.menu.setSeparator( QMenuBar.InWindowsStyle ) self.label = QLabel( self ) #CHECK_PTR( self.label ) self.label.setGeometry( 20, self.rect().center().y()-20, self.width()-40, 40 ) self.label.setFrameStyle( QFrame.Box | QFrame.Raised ) self.label.setLineWidth( 1 ) self.label.setAlignment( Qt.AlignCenter ) self.label.setFont( QFont( "times", 18, QFont.Bold ) ) self.connect(self, PYSIGNAL("explain"), self.label.setText) self.setMinimumSize( 100, 80 ) def open( self ): self.emit(PYSIGNAL("explain"), ("File/Open selected",)) def news( self ): self.emit ( PYSIGNAL( "explain" ), ( "File/New selected", ) ) def save( self ): self.emit ( PYSIGNAL( "explain" ), ( "File/Save selected", ) ) def about( self ): QMessageBox.about( self, "Qt Menu Example", "This example demonstrates simple use of Qt menus.\n" "You can cut and paste lines from it to your own\n" "programs." ) def aboutQt( self ): QMessageBox.aboutQt( self, "Qt Menu Example" ) def resizeEvent( self, ev ): self.label.setGeometry( 20, self.rect().center().y()-20, self.width()-40, 40 ) try: from qtpe import QPEApplication useQtopia = 1 except ImportError: QPEApplication = QApplication useQtopia = 0 a = QPEApplication(sys.argv) mainWindow = QMainWindow() mainWindow.setCaption("Menu Example") m = MyMenu(mainWindow) mainWindow.setCentralWidget(m) mainWindow.resize(640, 480) if useQtopia: a.showMainWidget(mainWindow) else: a.setMainWidget(mainWindow) mainWindow.show() a.exec_loop() Если его запустить через иконку на десктопе и выйти через меню, то у меня остается иконка в таскбаре. А если запустить из консоли и переключиться на консоль и обратно, то Завр показывает белый экран с надписью "Please wait". Если снова нажать Shift-Home, то произойдет перезагрузка кутопии. P.S. У вот этого скрипта http://zaurus.xavierxeon.de/devel/python/pyclock та же проблема с падением Кутопии. Так что, имхо, дело не в скрипте... |
Сообщ.
#13
,
|
|
|
Проблема с завершением приложения у меня решилась заменой строчки
self.file.insertItem("E&xit", qApp, SLOT( "quit()" ), Qt.CTRL+Qt.Key_Q) self.file.insertItem("E&xit", parent, SLOT( "close()" ), Qt.CTRL+Qt.Key_Q) Беда с попыткой переключиться в неправильное разрешение действительно повторяется для любого скрипта, у которого нет иконки на десктопе. Можно ли это поправить -- не знаю. Но, с другой стороны, зачем мне скрипты с UI, но без иконок? Да, еще я, по аналогии с QApplication, поменял бы QMenuBar->QPEMenuBar и QMessageBar->QPEMessageBar. Просто для порядка. |
Сообщ.
#14
,
|
|
|
Сенькс э лот.
|
Сообщ.
#15
,
|
|
|
Вопрос решен.
|