2012-04-14 36 views
1

我在嘗試做一個非常簡單的用戶界面時遇到問題。我使用Qt Designer創建了我的UI,然後使用pyuic4獲得了我的Python代碼。然後我編寫了我需要的函數,並使用Eclipse IDE進行編譯。Python 3:PyQt4上的QString

我從pyuic4得到的代碼是:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'Dni.ui' 
# 
# Created: Sat Apr 14 02:44:34 2012 
#  by: PyQt4 UI code generator 4.9.1 
# 
# WARNING! All changes made in this file will be lost! 
from PyQt4 import QtCore, QtGui 
try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    _fromUtf8 = lambda s: s 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(371, 217) 
     Dialog.setMinimumSize(QtCore.QSize(371, 217)) 
     self.layoutWidget = QtGui.QWidget(Dialog) 
     self.layoutWidget.setGeometry(QtCore.QRect(30, 30, 311, 151)) 
     self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) 
     self.gridLayout = QtGui.QGridLayout(self.layoutWidget) 
     self.gridLayout.setMargin(0) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.horizontalLayout = QtGui.QHBoxLayout() 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     self.label = QtGui.QLabel(self.layoutWidget) 
     self.label.setObjectName(_fromUtf8("label")) 
     self.horizontalLayout.addWidget(self.label) 
     self.entrada = QtGui.QLineEdit(self.layoutWidget) 
     self.entrada.setObjectName(_fromUtf8("entrada")) 
     self.horizontalLayout.addWidget(self.entrada) 
     self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) 
     self.boton = QtGui.QPushButton(self.layoutWidget) 
     self.boton.setObjectName(_fromUtf8("boton")) 
     self.gridLayout.addWidget(self.boton, 1, 0, 1, 1) 
     self.horizontalLayout_2 = QtGui.QHBoxLayout() 
     self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) 
     self.label_3 = QtGui.QLabel(self.layoutWidget) 
     self.label_3.setObjectName(_fromUtf8("label_3")) 
     self.horizontalLayout_2.addWidget(self.label_3) 
     self.salida = QtGui.QLineEdit(self.layoutWidget) 
     self.salida.setObjectName(_fromUtf8("salida")) 
     self.horizontalLayout_2.addWidget(self.salida) 
     self.gridLayout.addLayout(self.horizontalLayout_2, 2, 0, 1, 1) 
     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 

    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) 
     self.label.setText(QtGui.QApplication.translate("Dialog", "Introduzca su DNI", None, QtGui.QApplication.UnicodeUTF8)) 
     self.boton.setText(QtGui.QApplication.translate("Dialog", "Hallar NIF", None, QtGui.QApplication.UnicodeUTF8)) 
     self.label_3.setText(QtGui.QApplication.translate("Dialog", "NIF:", None, QtGui.QApplication.UnicodeUTF8)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Dialog = QtGui.QDialog() 
    ui = Ui_Dialog() 
    ui.setupUi(Dialog) 
    Dialog.show() 
    sys.exit(app.exec_()) 

,我和功能所作的代碼,我需要:

from Dni import Ui_Dialog 
from PyQt4 import QtCore, QtGui 

LETRADNI = {0:'T', 1:'R', 2:'W', 3:'A', 4:'G', 5:'M', 6:'Y', 7:'F', 8:'P', 9:'D', 10:'X', 11:'B', 12:'N', 
      13: 'J', 14:'Z', 15:'S', 16:'Q', 17:'V', 18:'H', 19:'L', 20:'C', 21:'K', 22:'E'} 


# Se hereda de la clase QtGui.QMainWindow 
class Principal(QtGui.QMainWindow): 
    # Se define el constructor de la clase __init__ 
    def __init__(self): 
     # Se llama al constructor de la clase padre 
     QtGui.QMainWindow.__init__(self) 

     # Se crea la instancia de Ui_Dialog 
     self.ventana = Ui_Dialog() 
     self.ventana.setupUi(self) 

     # Se conectan las señales con los slots 
     self.connect(self.ventana.boton,QtCore.SIGNAL('clicked()'), self.letradni) 


def Calcula_letra_dni(dni): 
    '''Función Calcula_letra_dni: 

     Funcionamiento: 

      La función recibe el valor entero dni. Posteriormente calculará el resto de la división 
      por 23. Éste número se buscará en el diccionario 'LETRADNI' para obtener la letra correspondiente 
      a ese DNI. 

     Argumentos 

      dni -- número del documento nacional de identidad (int) 

     Devuelve: 

      Una cadena (string) -- DNI + letra preparado para salida por pantalla 
    ''' 
    #if len(str(dni))>8 & len(str(dni))<7: 
    # raise ValueError('El dni debe tener entre 7 y 8 cifras') 

    num_letra = dni % 23.0 

    letra = LETRADNI[num_letra] 

    return '{0}-{1}'.format(dni,letra) 


def letradni(self): 
    self.ventana.salida.setText(Calcula_letra_dni(self.ventana.entrada.text())) 

第一個編譯和運行,這說明我的UI完美。

編譯第二個我得到一個錯誤,指出:

Description         Resource Path Location Type 
Undefined variable from import: QString Dni.py /Dni line 18 PyDev Problem 

誰能幫助我?

在此先感謝。

+0

編譯?這看起來可能是特定於您的日食PYTHONPATH。你的代碼本身實際上工作得很好。 – jdi 2012-04-14 02:36:16

+0

我說得太快了,在我看得更仔細之後,你對這個腳本有其他問題 – jdi 2012-04-14 02:42:46

回答

2

首先,我認爲你實際列出的問題與Eclipse,pydev和你的項目PYTHONPATH有關。查看此以確保您正確設置了一切,在你的PYTHONPATH包括PyQt4的:
http://popdevelop.com/2010/04/setting-up-ide-and-creating-a-cross-platform-qt-python-gui-application/

之後,你似乎有一些問題,你的代碼超越你所提到的...

第一你定義Principal類,然後是​​功能,但你要定義什麼看起來像一個類的實例方法letradni這應該是Principal部分:

class Principal(QtGui.QMainWindow): 
    # Se define el constructor de la clase __init__ 
    def __init__(self): 
     ... 

    def letradni(self): 
     ... 


def Calcula_letra_dni(dni): 
    ... 

那麼它看起來像你的Wi當您嘗試做一個字符串(感謝@Avaris)數學會引發異常和float:
num_letra = dni % 23.0

你應該是字符串有可能轉換爲浮動第一:num_letra = float(dni) % 23.0

最後,我認爲你也忘了爲你的應用程序定義一個main。您的Dni.py中有一個是自動生成的,但是您沒有爲您的實際入口點腳本編寫一個:

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    form = Principal() 
    form.show() 
    sys.exit(app.exec_()) 
+1

在Py3.x中,PyQt4中不存在'QString'。所有應該返回'QString'的東西都會返回普通的Python字符串(unicode)對象。雖然,它仍然不是一個數字的事實仍然:)。 – Avaris 2012-04-14 03:02:39

+0

@Avaris:謝謝你指出。我還沒有使用Py3.x。 – jdi 2012-04-14 03:05:32

+0

我幫你解決了這個問題!非常感謝你!我糾正了你告訴我的所有事情,現在運行得很好。我添加到我的程序'嘗試: 從Dni進口​​Ui_Dialog 除外: 通過'以避免QString的問題,它似乎它工作正常。 – dpolot 2012-04-14 13:48:02