İmport beyond top-level Hatası

Merhaba.
Python öğrenmeye yani başladım.
Projemde aşağıdaki hatayı alıyorum. Sorunu çözemedim maalesef.

ImportError:attempted relative import beyond top-level package

Dizin Yapisi
Hata

Dizin Yapısı Açıklama

1 - design_ui klasöründe .ui uzantılı tasarım dosyaları vardır.
2 - ui klasöründe .ui uzantılı dosyaların .py uzantısına çevrilmiş halleri vardır.
3 - py klasöründe programın class dosyaları vardır. Tasarımlar ui klasöründen import edilmektedir.
4 - main.py dosyası tasarımını direkt olarak ui klasöründen import edilmektedir.

Kodlarım
Paste Laravel

Python’un paket ve import sistemi cok karisik. Her seferinde tavsiyeleri resmi olmayan bir dokumandan okuyup calisana kadar kurcaliyorum.

Gelismis...'e __init__.py koymak veya ..sql yerine sql kullanmak ise yarayabilir.

Bu arada dizin/dosya listesini iletmek icin tree programini kullanabilirsin:

04:05:54 0 aib@vivaldi:/tmp% tree
.
├── amdgpu-install-21.40.40500-1_all
│   ├── DEBIAN
│   │   ├── conffiles
│   │   ├── control
[...]
├── xauth-1000-_1
└── x.js
2 Beğeni

Merhaba.
Öncelikle cevabınız için teşekkür ederim.

İmport ettiğim dizinlerdeki iki noktayı kaldırdığım zaman dizin adının altı kırmızılı oluyor ama kodlarım çalışıyor.

  • tek nokta bulunduğu dizini iki nokta bir üst dizini göstermiyor mu? Neden böyle bir hata alıyorum.

  • İki noktayı kaldırdığım zaman import ettiğim sayfanın içeriklerini kullanamıyorum. Örneğin Pyqt5 için kullanulan self.LabelText gibi. İki noktayı koyduğum zaman erişebiliyorum. Python’un import işlemi karışık geldi bana.

  • init.py dosyasına import yapılabiliyor mu? init.py başka bir dosyaya import edilebilir mi?

  • init.py dosyasına bulunduğu konumdaki dosyaları import etsek init.py dosyasını da başka bir dosyaya import etsek init içerisindeki dosyalarda import edilmiş olur mu?

Dosya sisteminde, evet. Python import’larinda moduldeki bir ust dizini gosteriyor. Modulun en ust dizinindeysen boyle hata veriyor.

Sayfa degil modul.
Import ettigin modulun icerigini kullanamiyorsan kullanmaya calisan kodda bir sorun var muhtemelen.
Verdigin ornek Pyqt5’ten alakasiz, self objesinin uzerinde bir attribute’a erisiyor.

Yine iyiymis. Bana yukarida dedigim gibi “cok karisik” geliyor :slight_smile:

__init__.py dosyasi modul import edildiginde (dizin adi) import ediliyor. Icinde import dahil olmak uzere her turlu Python kodu barindirabilir.

Init dosyasi butun modulu temsil ediyor. Modul adi altina koymak istedigin isimler varsa init icine koyabilir veya import edebilirsin:

hede/__init__.py:

from a import x
import b
y = b.y
import hede
print(hede.x)
print(hede.y)

Ne yaptigini bilene kadar sadece “import hede” seklindeki import’lari kullanmayi denemeni tavsiye ediyorum.

1 Beğeni

Merhaba.

Kodlarım aşağıdaki şekilde.

Arayüz dosyalarımı (py uzantılı) ui klasöründen import ediyorum. Kodlarım ise py klasöründe.
import esnasında ui klasörünün önünden iki notayı kaldırdığım zaman ui klasörünün içerisindeki class’ın özelliklerine erişemiyorum. ui klasörünün önünde iki nota olunca erişebiliyorum.

ui klasöründeki UyeKayit.py (arayüz dosyası)

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 442)
        Dialog.setMinimumSize(QtCore.QSize(400, 442))
        Dialog.setMaximumSize(QtCore.QSize(400, 442))
        Dialog.setStyleSheet("background-color:#fff;")
        self.frame = QtWidgets.QFrame(Dialog)
        self.frame.setGeometry(QtCore.QRect(10, 190, 381, 241))
        self.frame.setStyleSheet("background-color:orange;")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.layoutWidget = QtWidgets.QWidget(self.frame)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 341, 41))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.labelUyeAdiSoyadi = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setFamily("Bahnschrift")
        font.setPointSize(14)
        self.labelUyeAdiSoyadi.setFont(font)
        self.labelUyeAdiSoyadi.setObjectName("labelUyeAdiSoyadi")
        self.horizontalLayout.addWidget(self.labelUyeAdiSoyadi)
        self.lineEditUyeAdiSoyadi = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEditUyeAdiSoyadi.setMinimumSize(QtCore.QSize(0, 30))
        self.lineEditUyeAdiSoyadi.setMaximumSize(QtCore.QSize(16777215, 30))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.lineEditUyeAdiSoyadi.setFont(font)
        self.lineEditUyeAdiSoyadi.setStyleSheet("background-color:#fff; border-radius:3px; padding: 0 10px; border:1px solid #ddd;")
        self.lineEditUyeAdiSoyadi.setObjectName("lineEditUyeAdiSoyadi")
        self.horizontalLayout.addWidget(self.lineEditUyeAdiSoyadi)
        self.layoutWidget1 = QtWidgets.QWidget(self.frame)
        self.layoutWidget1.setGeometry(QtCore.QRect(20, 70, 341, 41))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget1)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.labelTelefonNumarasi = QtWidgets.QLabel(self.layoutWidget1)
        font = QtGui.QFont()
        font.setFamily("Bahnschrift")
        font.setPointSize(14)
        self.labelTelefonNumarasi.setFont(font)
        self.labelTelefonNumarasi.setObjectName("labelTelefonNumarasi")
        self.horizontalLayout_2.addWidget(self.labelTelefonNumarasi)
        self.lineEditTelefonNumarasi = QtWidgets.QLineEdit(self.layoutWidget1)
        self.lineEditTelefonNumarasi.setMaximumSize(QtCore.QSize(16777215, 30))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.lineEditTelefonNumarasi.setFont(font)
        self.lineEditTelefonNumarasi.setStyleSheet("background-color:#fff; border-radius:3px; padding: 0 10px; border:1px solid #ddd;")
        self.lineEditTelefonNumarasi.setObjectName("lineEditTelefonNumarasi")
        self.horizontalLayout_2.addWidget(self.lineEditTelefonNumarasi)
        self.layoutWidget2 = QtWidgets.QWidget(self.frame)
        self.layoutWidget2.setGeometry(QtCore.QRect(20, 190, 341, 32))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.layoutWidget2)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setSpacing(10)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.labelKayitDurum = QtWidgets.QLabel(self.layoutWidget2)
        font = QtGui.QFont()
        font.setFamily("Bahnschrift")
        font.setPointSize(10)
        self.labelKayitDurum.setFont(font)
        self.labelKayitDurum.setObjectName("labelKayitDurum")
        self.horizontalLayout_3.addWidget(self.labelKayitDurum, 0, QtCore.Qt.AlignVCenter)
        self.pushButtonKapat = QtWidgets.QPushButton(self.layoutWidget2)
        self.pushButtonKapat.setMinimumSize(QtCore.QSize(85, 30))
        self.pushButtonKapat.setMaximumSize(QtCore.QSize(85, 30))
        self.pushButtonKapat.setStyleSheet("background-color:#f1f1f1;")
        self.pushButtonKapat.setObjectName("pushButtonKapat")
        self.horizontalLayout_3.addWidget(self.pushButtonKapat)
        self.pushButtonKaydet = QtWidgets.QPushButton(self.layoutWidget2)
        self.pushButtonKaydet.setMinimumSize(QtCore.QSize(85, 30))
        self.pushButtonKaydet.setMaximumSize(QtCore.QSize(85, 30))
        self.pushButtonKaydet.setStyleSheet("background-color:#f1f1f1;")
        self.pushButtonKaydet.setObjectName("pushButtonKaydet")
        self.horizontalLayout_3.addWidget(self.pushButtonKaydet)
        self.frame_2 = QtWidgets.QFrame(Dialog)
        self.frame_2.setGeometry(QtCore.QRect(9, 9, 381, 151))
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.frame_2)
        self.verticalLayout.setObjectName("verticalLayout")
        self.labelLogo = QtWidgets.QLabel(self.frame_2)
        self.labelLogo.setText("")
        self.labelLogo.setPixmap(QtGui.QPixmap(":/IconsImages/icons/addperson.png"))
        self.labelLogo.setObjectName("labelLogo")
        self.verticalLayout.addWidget(self.labelLogo, 0, QtCore.Qt.AlignHCenter)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Üye Kayıt"))
        self.labelUyeAdiSoyadi.setText(_translate("Dialog", "Üye Adı Ve Soyadı : "))
        self.labelTelefonNumarasi.setText(_translate("Dialog", "Telefon Numarası : "))
        self.labelKayitDurum.setText(_translate("Dialog", "Kayıt Başarılı."))
        self.pushButtonKapat.setText(_translate("Dialog", "Kapat"))
        self.pushButtonKaydet.setText(_translate("Dialog", "Kaydet"))

py klasöründeki UyeEkle.py

import sys
from sql.Sql import *

from PyQt5.QtWidgets import *
from ui.UyeKayit import *

class Uye(QDialog,Ui_Dialog):
    def __init__(self):
        super(Uye,self).__init__()
        self.setupUi(self)
        self.Init_Ui()

    def Init_Ui(self):
        self.pushButtonKaydet.clicked.connect(self.UyeKayit)
        self.pushButtonKapat.clicked.connect(self.Kapat)
        self.labelKayitDurum.setText("")

    def UyeKayit(self):
        uye_adisoyadi = self.lineEditUyeAdiSoyadi.text()
        uye_telefonu = self.lineEditTelefonNumarasi.text()

        if (uye_adisoyadi and uye_telefonu != ""):

            try:
                UyeEkle(uye_adisoyadi, uye_telefonu)

                self.lineEditUyeAdiSoyadi.setText("")
                self.lineEditTelefonNumarasi.setText("")
                self.labelKayitDurum.setText("Kayıt Başarılı.")

                QMessageBox.information(self, "Bilgi", "Üye başarıyla kaydedildi")
            except:
                QMessageBox.warning(self, "Hata", "Bir hata oluştu. Üye kaydedilemedi!")

        else:
            QMessageBox.warning(self, "Hata", "Tüm alanları doldurunuz!")

    def Kapat(self):
        self.close()

Ondan ziyade import’un gerceklesmiyor ve kodun hata veriyor olmasi lazim. Bir seyi import edebiliyorsan import ettigin isim uzerinden export ettigi ozelliklerine erisebilmen lazim.

Ilk tavsiyemi denedin mi? Her seyi tek bir paket haline getirebilirsin.

En olmadi import oncesi sys.path’i veya pythonpath’i modifiye ederek import’un baktigi yerleri degistirebilirsin. (Cok hacky cozum ama import bilmecesi cozmuyoruz, kod yaziyoruz.)

İlginç bir biçimde program çalışıyor hata vermiyor ama dediğim gibi kod yazarken örneğin bir butona erişmek istersem self.pushButtonKaydet yazımı esnasında açılan elemanlar listesinde bu elemanı göremiyorum. Ama ui önüne iki nokta koyarsam görebiliyorum.

Konuda paylaşmış olduğum dizin resmine göre sizin tavsiye ettiğiniz dizin yapısı nasıl?
Örnek verir misiniz?

Bu kullandigin IDE’nin bir bug’i.

Ayni, sadece main’in yaninda bos init var.

PyCharm kullanıyorum IDE olarak.

Dediğiniz gibi main yanına init.py koydum ama bir değişiklik yok. Ama program çalışıyor.

İncelerim derseniz dosyalarımı upload edebilirim. Python’a yeni başladığım için göremediğim bir hatam olmuş olabilir.

Program calisiyorsa sorun goremiyorum :slight_smile:

Yuklerseniz bakarim da PyCharm kullanmiyorum, onunla ilgili yardimci olamam.

Ama baskalari olabilir belki.

1 Beğeni

Program önemli değil.

Kodlarda bir hata var mı bakarsanız sevinirim :slight_smile:

Link (1.9 MB)
Kütüphane Sistemi

Dosyalarin ve fonksiyonlarin buyuk harfli olmasi disinda bir sey gozume batmadi.

1 Beğeni

İmport işlemleri doğru mu?

Calistigina gore dogru. :slight_smile:

1 Beğeni