2012-04-14 6 views
1

非常に単純なユーザーインターフェイスを実行しようとすると問題が発生します。 Qt DesignerでUIを作ってから、pyuic4でPythonコードを手に入れました。それから、必要な機能をプログラミングし、Eclipse IDEでコンパイルしました。私はpyuic4からもらったPython 3:Q​​String on PyQt4

コードは次のとおりです。

# -*- 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 

を誰も私を助けることができる:私が言うエラーが出る秒1をコンパイル

ありがとうございます。

+0

コンパイル済みですか?これはあなたの食のPYTHONPATHに固有のようである。コード自体は実際にはうまく動作します。 – jdi

答えて

2

まず、あなたの実際の問題は、Eclipse、pydev、およびプロジェクトのPYTHONPATHに関連していると思います。あなたが適切にすべてを設定し、PYTHONPATHにPyQt4が含まれていることを確認するために、これを確認します。その後
http://popdevelop.com/2010/04/setting-up-ide-and-creating-a-cross-platform-qt-python-gui-application/

、あなたは...あなたが言及しているものを超えて、あなたのコードのいくつかの問題を持っているように見える

ファーストあなたは​​機能は、その後、Principalクラスを定義しますが、その後、あなたはPrincipalの一部であるべきクラスのインスタンスメソッドletradniどのように見えるかを定義している:

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

    def letradni(self): 
     ... 


def Calcula_letra_dni(dni): 
    ... 

その後、それはあなたのwiのように見えます私は、num_letra = float(dni) % 23.0

そして最後に:あなたはおそらく最初のフロートにその文字列を変換する必要があり
num_letra = dni % 23.0

:あなたは、文字列に数学をしようとするとLL(感謝@Avaris)とフロートを例外を発生させますあなたのアプリケーションにmainを定義するのを忘れたと思います。 Dni.pyに自動生成されたものがありますが、実際のエントリポイントスクリプト用のものは書きませんでした。

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

Py3.xでは、' QString'はPyQt4に存在しません。 'QString'を返すべきものはすべて、通常のPython文字列(Unicode)オブジェクトを返します。しかし、まだ数字ではないという事実は残っています:)。 – Avaris

+0

@Avaris:それを指摘してくれてありがとう。私はまだPy3.xを使っていません。 – jdi

+0

私はあなたの助けを借りて問題を解決しました!どうもありがとうございました!私はあなたが私に言ったすべてのものを修正し、今はとてもうまく走っています。私は私のプログラム 'try: Dni import Ui_Dialog 以外に: pass'を追加してQStringの問題を回避し、正常に動作しているようです。 – dpolot