اذهب إلى المحتوى
  • 0

مشكلة عند استيراد كلاس من ملف آخر بايثون

إبراهيم أحمد3

السؤال

السلام عليكم

عندما أقوم باستيراد كلاس lten والذي هو في ملف  lten.py يظهر خطأ:

ImportError: cannot import name 'lten' from partially initialized module 'lten' (most likely due to a circular import) (D:\programming\python\school\lten.py)

الأكواد:

كود school.py (الملف الذي أريد استخدام كلاس lten فيه):

 

import wx
from lten import lten

class school(wx.Frame):
	def __init__(self, parent):
		super(school,self).__init__(parent,-1, title= 'النظام التعليمي')
		p = wx.Panel(self,-1)
		self.Center()
		self.aenl = wx.Button(p,-1, 'النظام التعليمي للحروف الإنجليزية, التدريب على الأحرف الانجليزية بالترتيب')
		self.aenl.Bind(wx.EVT_BUTTON, self.onaenl)
		'''
		self.enl = wx.Button(p,-1, 'النظام التعليمي للحروف الإنجليزية, التدريب على الأحرف الانجليزية عشوائياً')
		self.enl.Bind(wx.EVT_BUTTON, self.onenl)

		self.enw = wx.Button(p,-1, 'النظام التعليمي للكلمات الإنجليزية')
		self.enw.Bind(wx.EVT_BUTTON, self.onenw)

		self.enp = wx.Button(p,-1, 'النظام التعليمي للجُمَل الإنجليزية')
		self.enp.Bind(wx.EVT_BUTTON, self.onenp)
		'''
		self.Show()

	def onaenl(self, event):
		lten()

app = wx.App()
school(None)
app.MainLoop()

 

كود ملف lten.py:

 

import wx
import winsound
from school import school

enletters= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

class lten(wx.Frame):
    def __init__(self, parent):
        super(lten,self).__init__(parent,-1, title= 'النظام التعليمي, الأحرف الإنجليزية المرتبة')
        self.p = wx.Panel(self,-1)
        self.Center()
        self.lettern= (0)
        self.letter= (enletters[self.lettern])
        wx.StaticText(self.p, -1, "الإجابات: ")
        self.verify = wx.TextCtrl(self.p, -1, style=wx.TE_READONLY+wx.TE_MULTILINE+wx.HSCROLL)

        self.wt= wx.StaticText(self.p, -1, f"اكتب حرف  {self.letter}  ")
        self.write = wx.TextCtrl(self.p, -1)
        self.write.SetFocus()

        self.send= wx.Button(self.p, -1, "إرسال الإجابة")
        self.send.Bind(wx.EVT_BUTTON, self.onsend)

        self.back= wx.Button(self.p, -1, "العودة إلى الشاشة الرئيسية")
        self.back.Bind(wx.EVT_BUTTON, self.onback)

        self.Show()

    def onsend(self, event):
        self.result= self.write.GetValue()
        if self.result == self.letter:
            self.verify.write(f'''صحيح {self.letter}
''')
            winsound.PlaySound('data\\yes.wav', 1)
            if self.lettern == 25:
                self.lettern= (0)
            else:
                self.lettern= self.lettern+1

            self.letter= (enletters[self.lettern])
            self.wt.SetLabel(f"اكتب حرف {self.letter} ")
            self.write.SetFocus()
            self.write.SetValue("")

        elif self.result != self.letter:
            self.verify.write(f'''خطأ: المطلوب كتابته: {self.letter} , المكتوب: {self.result}
''')
            winsound.PlaySound('data\\no.wav', 1)
            self.write.SetFocus()
            self.write.SetValue("")

    def onback(self, event):
        school.school()

app = wx.App()
lten(None)
app.MainLoop()

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

الخطأ معناه أنك تقوم بإستيراد module داخل الأخر بشكل من الطرفين أي ما معناه أنت تستورد lten داخل schoole وتقوم بإستيراد schoole داخل lten وهذا غير جائز ويسمى circular import.  لحل المشكلة قم بإزالة إستيراد school من lten.py وعوضاً عن ذلك قم بتمرير school في ملف school.py الى جسم lten وإستعمله.

...
class lten(wx.Frame):
    def __init__(self, parent, school):
        super(lten,self).__init__(parent,-1, title= 'النظام التعليمي, الأحرف الإنجليزية المرتبة')
        self.p = wx.Panel(self,-1)
        self.Center()
        self.lettern= (0)
        self.letter= (enletters[self.lettern])
        wx.StaticText(self.p, -1, "الإجابات: ")
        self.verify = wx.TextCtrl(self.p, -1, style=wx.TE_READONLY+wx.TE_MULTILINE+wx.HSCROLL)
        this.school= school
...
....
class school(wx.Frame):
	def __init__(self, parent):
		super(school,self).__init__(parent,-1, title= 'النظام التعليمي')
		p = wx.Panel(self,-1)
		self.Center()
		self.aenl = wx.Button(p,-1, 'النظام التعليمي للحروف الإنجليزية, التدريب على الأحرف الانجليزية بالترتيب')
		self.aenl.Bind(wx.EVT_BUTTON, self.onaenl)
		'''
		self.enl = wx.Button(p,-1, 'النظام التعليمي للحروف الإنجليزية, التدريب على الأحرف الانجليزية عشوائياً')
		self.enl.Bind(wx.EVT_BUTTON, self.onenl)

		self.enw = wx.Button(p,-1, 'النظام التعليمي للكلمات الإنجليزية')
		self.enw.Bind(wx.EVT_BUTTON, self.onenw)

		self.enp = wx.Button(p,-1, 'النظام التعليمي للجُمَل الإنجليزية')
		self.enp.Bind(wx.EVT_BUTTON, self.onenp)
		'''
		self.Show()

	def onaenl(self, event):
		lten(self)

app = wx.App()
school(None)
app.MainLoop()

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

 

المشكلة الآن أنني عندما أفتح school.py تظهر النافذتين بنفس الوقت, والزر يصبح بلا فائدة.

بالمناسبة: في بايثون لا يوجد this انت كتبت (this.school)

واضح أنك متعود على java أو js.

هنا هي self.

المهم ما الحل للمشكلة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 11 ساعة قال إبراهيم أحمد3:

 

المشكلة الآن أنني عندما أفتح school.py تظهر النافذتين بنفس الوقت, والزر يصبح بلا فائدة.

بالمناسبة: في بايثون لا يوجد this انت كتبت (this.school)

واضح أنك متعود على java أو js.

هنا هي self.

المهم ما الحل للمشكلة؟

لا يمكنك القيام بالتضمين هكذا، لا يمكن لملفين تضمين بعضهما فهذا غير منطقي حيث أن كل منهما يعتمد على الآخر و بالتالي لا يمكن البدء بتنفيذ أحدهما قبل الآخر و لا يمكن تنفيذهما معا و بالتالي يحدث خطأ.

في حال وجود أمور مشتركة بين ملفين يفضل وضعها في ملف ثالث لا يعتمد على شيء و جعل الملفين الآخرين يضمنان هذا الملف العام.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 15‏/2‏/2023 at 20:45 قال إبراهيم أحمد3:

 

المشكلة الآن أنني عندما أفتح school.py تظهر النافذتين بنفس الوقت, والزر يصبح بلا فائدة.

بالمناسبة: في بايثون لا يوجد this انت كتبت (this.school)

واضح أنك متعود على java أو js.

هنا هي self.

المهم ما الحل للمشكلة؟

عزيزي أنا لا أكتب لك الكود ولكني أريك طريقة حل للمشكلة و نعم تستعمل self بدلاً من this برغم  إمكانية إستعمال this ممكنة أيضاً إذا قمت بتعريفها بدلالة self. إما لماذا تظهر لك نافذتين فذلك لانك تعرف كلا الصنفين على أنهما frame  وهو أمر تستطيع تغييره بأستعمال widget أخر  لأحد الصنفين.  

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...