Importprobleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
niederrheiner
User
Beiträge: 30
Registriert: Montag 7. Januar 2013, 11:52

Hallo an Alle,
ich habe folgende Projektstruktur:
[codebox=text file=Unbenannt.txt]
rezeptverwaltung
├── rezeptverwaltung
│   ├── __init__.py
│   ├── mymodules
│   │   ├── __init__.py
│   │   ├── rezept_auswahl
│   │   │   ├── __init__.py
│   │   │   ├── rezept_auswahl.py
│   │   │   ├── rezept_auswahl.ui
│   │   │   ├── rezept_suche.ui
│   │   │   └── ui_rezept_auswahl.py
│   │   ├── rezept_eingabe
│   │   │   ├── __init__.py
│   │   │   ├── rezept_eingabe.py
│   │   │   ├── rezept_eingabe.ui
│   │   │   └── ui_rezept_eingabe.py
│   │   └── rezept_main
│   │   ├── __init__.py
│   │   ├── rezept_main.py
│   │   ├── rezept_main.ui
│   │   └── ui_rezept_main.py
│   └── rezeptverwaltung.py
└── rezeptverwaltung.db.txt
[/code]

mein Hauptprogramm wie folgt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding_ latin-1 -*-
# rezeptverwaltung.py

"""
Rezeptverwaltung
"""
import os
import sys
import logging
import _sqlite3
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import PyQt5.QtWidgets as w

import mymodules.rezept_main.rezept_main
from mymodules.rezept_main.ui_rezept_main import Ui_dlg_rez_main

import mymodules.rezept_eingabe.rezept_eingabe
#
# import mymodules.rezept_auswahl.rezept_auswahl

class rezeptverwaltung(w.QMainWindow):
    def __init__(self, parent=None):
        super(rezeptverwaltung, self).__init__(parent)

        """Setup Hauptbildschirm"""
        self.ui = Ui_dlg_rez_main()
        self.ui.setupUi(self)
        self.show()

        """Slots"""
        self.ui.pb_Close.clicked.connect(self.onCloseClicked)
        self.ui.pb_rez_eingabe.clicked.connect(self.onRezEingabeClicked)
        self.ui.pb_rez_auswahl.clicked.connect(self.onRezAuswahlClicked)

    def onRezEingabeClicked(self):
		pass

    def onRezAuswahlClicked(self):
        pass


    def onCloseClicked(self):
		pass

app = QApplication(sys.argv)
w = rezeptverwaltung()
w.show()
sys.exit(app.exec_())
der aufzurufende Dialog:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding_ latin-1 -*-
# rezept_eingabe.py

"""
rezept_eingabe
"""

import sys
import logging
import _sqlite3
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import PyQt5.QtWidgets as w

#import ui_rezept_eingabe
from  ui_rezept_eingabe import Ui_dlgRezEingabe

class rezept_eingabe(w.QDialog):
    def __init__(self, parent=None):
        super(rezept_eingabe, self).__init__(parent)

        """Setup Hauptbildscirm"""
        self.ui = Ui_dlgRezEingabe()
        self.ui.setupUi(self)
        self.show()

        """Slots"""
        self.ui.pb_Close.clicked.connect(self.onCloseClicked)
        self.ui.pb_Save.clicked.connect(self.onSaveClicked)
        self.ui.pb_Delete.clicked.connect(self.onDeleteClicked)

    def onCloseClicked(self):
        pass

    def onSaveClicked(self):
        pass

    def onDeleteClicked(self):
        pass

Nun zu meinem Problem. Wenn ich den Dialog <rezept_eingabe> standalone starte, läuft er fehlerfrei.
Rufe ich den Dialog aber über <rezeptverwaltung> auf erhalte folgende Fehlermeldung:
/usr/bin/python3.6 /home/guenter/entw/projekte/python/rezeptverwaltung/rezeptverwaltung/rezeptverwaltung.py
Traceback (most recent call last):
File "/home/guenter/entw/projekte/python/rezeptverwaltung/rezeptverwaltung/rezeptverwaltung.py", line 19, in <module>
import mymodules.rezept_eingabe.rezept_eingabe
File "/home/guenter/entw/projekte/python/rezeptverwaltung/rezeptverwaltung/mymodules/rezept_eingabe/rezept_eingabe.py", line 16, in <module>
from ui_rezept_eingabe import Ui_dlgRezEingabe
ModuleNotFoundError: No module named 'ui_rezept_eingabe'

Process finished with exit code 1

[codebox=text file=Unbenannt.txt]
[/code]

Das Problem liegt wohl beim Import der einzelnen Module. Scheinbar habe ich das Import-Prinzip noch nicht richtig verstanden. Könnt Ihr mit Tipps und Hinweisen mal auf die Sprünge helfen?

Noch eine Frage zur Projektstruktur. Ist diese so sinnvoll, wenn nein, wie sieht eine sinnvolle Projektstruktur aus (mit Gui)

Danke für Eure Hilfe und Tipps.

Bis dann ...
MfG
Günter
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@niederrheiner: Pakete gibt man entweder absolut oder relativ an. Wenn Du das Dialog-Skript direkt aufrufst, mußt Du das Paket absolut angeben, sonst entweder mit seinem vollen Pfad, oder relativ:

Code: Alles auswählen

from . import xy
Die ui_xxx.py Dateien sollten aber gar nicht exisitieren. Lade direkt die .ui-Dateien per `uic.loadui`.

Latin-1-Kodierung sollte man auch nicht mehr benutzen. Nimm utf-8. Pakete mit Unterstrich sind nicht für den öffentlichen gebrauch gedacht. Warum importierst Du nicht `sqlite3` (wenn es denn gebraucht wird)? Sternchenimporte vermeiden, importierte Namen explizit angeben. `w` ist ein zu kurzer Name. Als Qtwidgets wird er gar nicht gebraucht, als rezeptverwaltung taugt er nichts. Klassen werden Großgeschrieben. Fenster sollten sich nicht selbst per `show` anzeigen, das ist Aufgabe des Erzeugers der Instanz (was der auch zusätzlich macht).
niederrheiner
User
Beiträge: 30
Registriert: Montag 7. Januar 2013, 11:52

@sirus Danke für Deine Antwort. Ich werde Deine Anregungen aufgreifen und das Projekt entsprechend ändern.

Bis dann ...
MfG
Günter
Antworten