Не понимаю ошибку pyqt

#python #pyqt

#python #pyqt

Вопрос:

Заранее прошу прощения, если мой заголовок звучит очень расплывчато… Не стесняйтесь редактировать, если это необходимо? Я нахожусь в некоторой дилемме здесь, где он работал в прошлый раз, но после изменения части кода в основном скрипте у пользовательского интерфейса, похоже, возникли проблемы.

Здесь есть 2 сценария, mmvsTool.py (сценарий выполнения) и mmvsToolUI.py (сценарий пользовательского интерфейса)

Поправьте меня, если я ошибаюсь, поскольку я использую from PyQt4 import QtCore, QtGui в качестве импортирующего предложения для виджетов PyQt, и нигде в сценариях, которые я использовал Pyside... , когда ошибка, похоже, говорит мне использовать ее иначе?

 # Traceback (most recent call last):
#   File "<string>", line 1, in <module>
#   File "/user_data/maya/python/mmvsTool.py", line 14, in __init__
#     self.setupUi( self )
#   File "/user_data/maya/python/mmvsToolUI.py", line 18, in setupUi
#     mmvsFTool.setWindowIcon(icon)
# TypeError: # 'PySide.QtGui.QWidget.setWindowIcon' called with wrong argument types:
#   PySide.QtGui.QWidget.setWindowIcon(QIcon)
# Supported signatures:
  PySide.QtGui.QWidget.setWindowIcon(PySide.QtGui.QIcon)
 

Некоторое представление о коде пользовательского интерфейса, на который ссылается ошибка:

 from PyQt4 import QtCore, QtGui

class Ui_mmvsTool(object):
    def setupUi(self, mmvsTool):
        mmvsFTool.setObjectName("mmvsTool")
        mmvsFTool.resize(419, 752)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/mmvsIcons/mmvsFTool"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        mmvsFTool.setWindowIcon(icon)
 

Часть в основном скрипте:

 from mmvsToolUI import Ui_mmvsTool

from qtswitch import QtGui
from  maya import cmds as mc, mel as mm
import os

class mmvsFTool( QtGui.QWidget, Ui_mmvsTool ):
    """
    """
    def __init__( self, parent = None ):
        super( mmvsFTool, self ).__init__( parent = parent )
        self.setupUi( self )
        # this does nothing yet
        self.modeWidget.setVisible( False )    
 

Комментарии:

1. Найдите и проверьте mmvsFTool .

2. @furas Не совсем уверен, что вы имеете в виду, но ошибка в то же время также относилась к той части, которую я вставил выше

3. Не могли бы вы скопировать и вставить сюда свои операторы импорта из обоих файлов. PyQt4 и PySide — это не одно и то же.

4. Что вы изменили с тех пор, как он работал в последний раз?

5. Что такое qtswitch? Я не смог найти никаких ссылок на нее в Google. Я предполагаю, что он используется для условного импорта либо PySide, либо PyQt, и по какой-то причине выбран PySide.

Ответ №1:

Думаю, теперь я понимаю вашу проблему.

 from qtswitch import QtGui  # This is maybe in PySide? Not compatible with PyQt4
 

измените его на:

 from PyQt4 import QtGui
 

Затем посмотрите, работает ли это.

Комментарии:

1. Я думаю, что это работает! Но нужно протестировать еще один раунд в понедельник, чтобы быть уверенным. Могу ли я спросить, как я узнаю, когда или какой импорт принадлежит pyqt4 или pyside ?.

2. Если вы используете PyQt4, вам никогда не следует импортировать из PySide. Они являются взаимоисключающими

3. Я бы подумал, что комментарий от @user3419537 выше верен в том смысле, что предполагается, что qtswitch автоматически выбирает между PySide и PyQt4, но делает это неправильно. Возможно, вместо переключения строки qtswitch на PyQt4 вам следует изменить импорт PyQt4 в mmvsToolUi на qtswitch?

4. @three_pineapples Спасибо за комментарий. Это работает в любом случае, независимо от того, меняю ли я предложение импорта на либо from qtswitch import QtCore, QtGui или from PyQt4 import QtCore, QtGui . Большое спасибо! Не уверен, когда я или, может быть, кто-то перешел с PySide на PyQt4.

5. @dissidia, я полагаю mmvsToolUI , автоматически генерируется из файла пользовательского интерфейса? В зависимости от того, какой инструмент вы используете для этого (Pyside или PyQt), будет решаться, какой инструментарий будет импортирован в этот файл. Это означает, что каждый раз, когда вы создаете класс, вам придется редактировать его и переключать строку на from qtswitch... etc. Другой вариант — динамически загружать файл пользовательского интерфейса во время выполнения, но, к сожалению, синтаксис отличается в зависимости от того, используете ли вы PySide или PyQt, но вы можете это исправить (я сам это сделал в своем проекте bitbucket qtutils)