Skip to main content
 首页 » 编程设计

python之PyQt之如何处理模块导入异常

2025年05月04日6dyllove98

我在任何地方都找不到如何处理模块导入异常的解决方案。我需要导入“enchant”模块,但我必须先检查它是否已安装。如果未安装,我需要显示一条错误消息。因此,如果我这样做,就无法显示 QMessageBox,因为尚未创建主类。

import sys 
import re 
 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
 
try: 
    import enchant 
    dict_list = enchant.list_languages() 
    if "ru_RU" in dict_list: 
        self.dict = enchant.Dict("ru_RU") 
    else: 
        self.dict = enchant.Dict() 
except ImportError, inst: 
    #How do I graphically show an error message here if the class hasn't been set up yet? 
 
class Translit(QMainWindow): 
    def __init__(self, parent = None): 
        super(Translit, self).__init__(parent) 

如果我这样做:

import sys 
import re 
 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
 
class Translit(QMainWindow): 
    def __init__(self, parent = None): 
        super(Translit, self).__init__(parent) 
 
    try: 
        import enchant 
        dict_list = enchant.list_languages() 
        if "ru_RU" in dict_list: 
            self.dict = enchant.Dict("ru_RU") 
        else: 
            self.dict = enchant.Dict() 
    except ImportError, inst: 
        QMessageBox.warning(parent, "", "Error:\n%s seems to be installed\n\nSpell checking will be disabled" % (inst)) 
 
    self.change_dict() 
 
    def change_dict(self): 
        self.dict = enchant.Dict("en_US") 
        QMessageBox.about(parent,"","Spellcheck is set to " + self.dict.tag) 

然后解释器会报错“NameError: global name 'enchant' is not defined”。

请告诉我如何显示模块导入异常消息或如何使该模块在整个程序中工作。谢谢。

这是我尝试重用的原始来源:

__license__ = 'MIT' 
__copyright__ = '2009, John Schember ' 
__docformat__ = 'restructuredtext en' 
 
import re 
import sys 
 
import enchant 
 
from PyQt4.Qt import QAction 
from PyQt4.Qt import QApplication 
from PyQt4.Qt import QEvent 
from PyQt4.Qt import QMenu 
from PyQt4.Qt import QMouseEvent 
from PyQt4.Qt import QPlainTextEdit 
from PyQt4.Qt import QSyntaxHighlighter 
from PyQt4.Qt import QTextCharFormat 
from PyQt4.Qt import QTextCursor 
from PyQt4.Qt import Qt 
from PyQt4.QtCore import pyqtSignal 
 
 
class SpellTextEdit(QPlainTextEdit): 
 
def __init__(self, *args): 
    QPlainTextEdit.__init__(self, *args) 
 
    # Default dictionary based on the current locale. 
    self.dict = enchant.Dict("ru_RU") 
    self.highlighter = Highlighter(self.document()) 
    self.highlighter.setDict(self.dict) 
 
def mousePressEvent(self, event): 
    if event.button() == Qt.RightButton: 
        # Rewrite the mouse event to a left button event so the cursor is 
        # moved to the location of the pointer. 
        event = QMouseEvent(QEvent.MouseButtonPress, event.pos(), 
            Qt.LeftButton, Qt.LeftButton, Qt.NoModifier) 
    QPlainTextEdit.mousePressEvent(self, event) 
 
def contextMenuEvent(self, event): 
    popup_menu = self.createStandardContextMenu() 
 
    # Select the word under the cursor. 
    cursor = self.textCursor() 
    cursor.select(QTextCursor.WordUnderCursor) 
    self.setTextCursor(cursor) 
 
    # Check if the selected word is misspelled and offer spelling 
    # suggestions if it is. 
    if self.textCursor().hasSelection(): 
        text = unicode(self.textCursor().selectedText()) 
        if not self.dict.check(text): 
            spell_menu = QMenu('Spelling Suggestions') 
            for word in self.dict.suggest(text): 
                action = SpellAction(word, spell_menu) 
                action.correct.connect(self.correctWord) 
                spell_menu.addAction(action) 
            # Only add the spelling suggests to the menu if there are 
            # suggestions. 
            if len(spell_menu.actions()) != 0: 
                popup_menu.insertSeparator(popup_menu.actions()[0]) 
                popup_menu.insertMenu(popup_menu.actions()[0], spell_menu) 
 
    popup_menu.exec_(event.globalPos()) 
 
def correctWord(self, word): 
    ''' 
    Replaces the selected text with word. 
    ''' 
    cursor = self.textCursor() 
    cursor.beginEditBlock() 
 
    cursor.removeSelectedText() 
    cursor.insertText(word) 
 
    cursor.endEditBlock() 
 
class Highlighter(QSyntaxHighlighter): 
 
WORDS = u'(?iu)[\w\']+' 
 
def __init__(self, *args): 
    QSyntaxHighlighter.__init__(self, *args) 
 
    self.dict = None 
 
def setDict(self, dict): 
    self.dict = dict 
 
def highlightBlock(self, text): 
    if not self.dict: 
        return 
 
    text = unicode(text) 
 
    format = QTextCharFormat() 
    format.setUnderlineColor(Qt.red) 
    format.setUnderlineStyle(QTextCharFormat.SpellCheckUnderline) 
 
    for word_object in re.finditer(self.WORDS, text): 
        if not self.dict.check(word_object.group()): 
            self.setFormat(word_object.start(), 
                word_object.end() - word_object.start(), format) 
 
class SpellAction(QAction): 
 
''' 
A special QAction that returns the text in a signal. 
''' 
 
correct = pyqtSignal(unicode) 
 
def __init__(self, *args): 
    QAction.__init__(self, *args) 
 
    self.triggered.connect(lambda x: self.correct.emit( 
        unicode(self.text()))) 
 
def main(args=sys.argv): 
app = QApplication(args) 
 
spellEdit = SpellTextEdit() 
spellEdit.show() 
 
return app.exec_() 
 
if __name__ == '__main__': 
    sys.exit(main())  

请您参考如下方法:

这是您的问题的一种可能解决方法:

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
 
try: 
    import enchant 
except ImportError: 
    enchant = None 
 
class Translit(QMainWindow): 
    def __init__(self, parent = None): 
        super(Translit, self).__init__(parent) 
        if enchant is not None: 
            dict_list = enchant.list_languages() 
            if "ru_RU" in dict_list: 
                self.dict = enchant.Dict("ru_RU") 
            else: 
                self.dict = enchant.Dict() 
            self.change_dict() 
        else: 
            self.dict = None 
            QMessageBox.warning(parent, "", 
                "Error: could not import the 'enchant' module\n\n" 
                "Spell checking will be disabled") 
 
    def change_dict(self): 
        if self.dict is not None: 
            self.dict = enchant.Dict("en_US") 
            QMessageBox.about( 
                parent, "", "Spellcheck is set to " + self.dict.tag) 

但是,如果拼写检查是一项可选功能,作为用户,如果我每次运行应用程序时都收到此警告消息,我会非常恼火。

最好在用户第一次尝试访问拼写检查器(然后禁用任何进一步访问)时显示警告。但实现这一目标的方式显然取决于 enchant 模块在应用程序中其他地方的使用方式。