На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: B.V.
  
> Корректный запуск скриптов с под Qtopia
    Дано:
    Есть скрипт, написанный на Питоне с использованием PyQt.
    При запуске из консоли все "шоколадно" - появляется окошко, нажимаются кнопочки и все такое прочее.

    Проблема:
    Но если этот же скрипт попытаться запустить ярлыком с рабочего стола, то главное окошко появляется на несколько секунд, а потом исчезает. При этом процесс питона остается в памяти. Иконки в таскбаре не появляется вообще.

    Я обсуждал с Антоном эту проблему. Он сказал, что то ли имя процесса должно совпадать с именем иконки, то ли что-то еще в этом духе. Для джавы это дело решается каким-то ключем при запуске. Существует ли более общее решение? (сразу скажу: предлагать не писать на питоне, а писать на С не предлагать, мне нужен именно питон).
      А не мог бы ты выложить здесь маленький скриптик, с которым проблема воспроизводится?
        Любой пример из стандартного туториала к PyQt годится. Тут дело не в содержимом скрипта, имхо.
        Эти примеры лежат в каталоге /где/там/установлен/Питон/doc/PyQt/examples2/
        Начиная с tut1.py.
        Сообщение отредактировано: dmych -
          Вот короткий скрипт, который перечисленными проблемами не страдает:

          ExpandedWrap disabled
            #!/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/
          Сообщение отредактировано: vot -
            Ах вот где собака порылась!!!
            Спасибо. Однако, остается вопрос простоты портируемости питоновского кода.
            Вот что мне сказал Питон под RedHat:

            Цитата
            Traceback (most recent call last):
            File "./testQt.py", line 5, in ?
            from qtpe import QPEApplication
            ImportError: No module named qtpe

            Резюме: как ни крути, если хочешь, чтобы твой код работал и на "большом линуксе" и под Кутопией,
            нужно иметь по крайней мере две различные имплементации для главного окна.

            Ладно, будем копать дальше.

            Добавлено
            Все равно там что-то не то...
            Да, появляется красивое большое окошко, иконка появляется в таскбаре, но в меню задач (который по Shift-Menu) эта задача отсутствует!
            А если запустить его из шелловского скрипта, то и иконка не появляется. :wacko:

            Чем дальше, тем интереснее... :blink:
              Цитата dmych @
              Да, появляется красивое большое окошко, иконка появляется в таскбаре, но в меню задач (который по Shift-Menu) эта задача отсутствует!
              А если запустить его из шелловского скрипта, то и иконка не появляется. :wacko:

              Чем дальше, тем интереснее... :blink:

              В pdaX PyGtk нормально всё отрабатывает :(
              Может глюки именно в PyQt?
                Я думаю, это не глюки. Просто матчасть надо учить... 8-)
                Кроме того, я писал про Кутопию, а не Иксы. :tong:
                  Цитата dmych @
                  Однако, остается вопрос простоты портируемости питоновского кода.


                  Например, вот так:

                  ExpandedWrap disabled
                    #!/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 в приведенном выше коде решает эту проблему. ;)

                  Цитата
                  А если запустить его из шелловского скрипта, то и иконка не появляется. :wacko:


                  Вот тут помочь не могу -- у меня появляется. ;) (Разумеется, появляется только при запуске ровно того файла, что отображен на десктопе -- иначе откуда иконке взяться?)
                  Сообщение отредактировано: geometer -
                    Ага. Сенькс. Попробую на досуге.
                      Работает неплохо. Однако, заметил еще такую странность: если запустить скрипт из консоли,
                      а потом переключиться на другое приложение и обратно, то Заурус пытается перейти в Magnified screen mode,
                      после чего как правило падает Кутопия. Может, конечно, это трабла именно моего экземпляра, не знаю.

                      Да, вот еще что. При нажатии на кнопку (или меню), на которую повесил что-нть вроде:
                      ExpandedWrap disabled
                        QObject.connect(btnQuit, SIGNAL("clicked()"), a, SLOT("quit()"))

                      (как прописано в туториале Qt)
                      на десктопе происходит нормальное завершение приложения, а на Заурусе окошко исчезает, но иконка в таксбаре
                      остается, и если ткуть в нее, программа запустится снова...

                      Что ж, пойду читать мануалы по QPE... Кстати, никто не знает где можно скачать доки (не онлайн, а чтобы положить на Завр)?
                        Чем дальше в лес -- тем труднее давать советы, не видя исходного кода. ;) Если приведешь скриптик, с которым проблемы воспроизводятся -- может быть, я (или кто-то другой) смогу дать конкретный совет, как этих проблем избежать.

                        Абстрактно могу посоветовать поискать в интернете готовые программы на Python/Qte -- и почитать их код.
                          Ок. Вот такой скриптик (часть взята из туториального menu.py):
                          ExpandedWrap disabled
                            #!/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 та же проблема с падением Кутопии. Так что, имхо, дело не в скрипте... :whistle:
                          Сообщение отредактировано: dmych -
                            Проблема с завершением приложения у меня решилась заменой строчки
                            ExpandedWrap disabled
                              self.file.insertItem("E&xit",  qApp, SLOT( "quit()" ), Qt.CTRL+Qt.Key_Q)
                            на
                            ExpandedWrap disabled
                              self.file.insertItem("E&xit",  parent, SLOT( "close()" ), Qt.CTRL+Qt.Key_Q)

                            Беда с попыткой переключиться в неправильное разрешение действительно ;) повторяется для любого скрипта, у которого нет иконки на десктопе. Можно ли это поправить -- не знаю. Но, с другой стороны, зачем мне скрипты с UI, но без иконок? ;)

                            Да, еще я, по аналогии с QApplication, поменял бы QMenuBar->QPEMenuBar и QMessageBar->QPEMessageBar. Просто для порядка. ;)
                            Сообщение отредактировано: geometer -
                              Сенькс э лот.
                              Сообщение отредактировано: dmych -
                                Вопрос решен.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0393 ]   [ 16 queries used ]   [ Generated: 26.04.24, 21:41 GMT ]