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

تصحيح لهذا الكود ـ عند الإختيار من قائمة المنسدلة _ يظهر الخطأ

Ali Ali49

السؤال

مالخطأ بهذا الكود

أولا  كود (  class  )

from openpyxl import load_workbook

class book_E:
    def __init__(self, BATH=None):
        self.BATH = BATH
        self.workbook = None
        self.sheet = None

    def load_file(self):
        if self.BATH:
            self.workbook = load_workbook(self.BATH)
            self.sheet = self.workbook.active
        
    def column_values(self):
        
        self.column_values_list = [cell.value for cell in self.sheet['A']]    
        return self.column_values_list


    def on_combobox_selected(self,combo,AM):
        self.combo = combo
        self.AM = AM
        selected_value = self.combo.get()   
        row_index = self.column_values_list.index(selected_value) + 1   
        corresponding_value = self.sheet[self.AM + str(row_index)].value 
        print(corresponding_value) 

  

ثانيا كود البرنامج 

from ttkbootstrap.constants import *
import ttkbootstrap as ttk
from LOOD_BOOK import book_E

BOOK1 = book_E()
column_values = "1"

def COLS_V():
    file_path = "E:\people.xlsx"
    BOOK1 = book_E(file_path)
    BOOK1.load_file()
    combo_name.configure(values=BOOK1.column_values())

def sheet_Names(BOOK1):
    q = BOOK1.workbook.sheetnames
    return q


def COL1_V(BOOK1):
    q = BOOK1.sheet['A2'].value

#--------------------------------------------------------------------------------------------
def on_combo_name_selected(event):
    BOOK1.on_combobox_selected(combo_name,"a")
 
#--------------------------------------------------------------------------------------------
root = ttk.Window(themename="minty")
frame = ttk.Frame(root)
frame.pack()

widgets_frame = ttk.LabelFrame(frame, text="طباعة")
widgets_frame.grid(row=0, column=0, padx=20, pady=5, sticky="nsew")

b1 = ttk.Button(widgets_frame, text="print", bootstyle=("info", "outline"), command=COLS_V)
b1.grid(row=0, column=0, padx=5, pady=5,  sticky="ew")

combo_name = ttk.Combobox(widgets_frame,justify=RIGHT,width=35,values=column_values)
combo_name.current(0)
combo_name.grid(row=1, column=0, padx=5, pady=5,  sticky="ew")
combo_name.bind("<<ComboboxSelected>>", on_combo_name_selected)
root.mainloop()

هذا الخطأ 

AttributeError: 'book_E' object has no attribute 'column_values_list'

تم التعديل في بواسطة Ali Ali49
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

إذا كان السؤال تابع لأحد الأسئلة الخاصة بك أرجو وضعه أسفل السؤال وسيتم الرد عليك لا تقلق، وبخصوص سؤالك، في السطر التالي:

from LOOD_BOOK import book_E

هل أخطأت في اسم الملف؟ حيث أنك قمت بتهجئتها على أنها "LOOD_BOOK" بدلاً من "LOAD_BOOK"، تأكد من أن اسم الملف صحيح.

وفي السطر:

from ttkbootstrap.constants import *

يتم استيراد جميع الثوابت من وحدة ttkbootstrap.constants. ولكن الوحدة ttkbootstrap لا توفر هذه الثوابت، والأفضل الاستيراد كالتالي:

from tkinter import ttk

وفي السطر التالي:

b1 = ttk.Button(widgets_frame, text="print", bootstyle=("info", "outline"), command=COLS_V)

الخاصية bootstyle ليست خاصية صحيحة.، هل أنت ترغب في تعيين نمط الزر؟ باستطاعتك استخدام الخاصية style بدلاً من ذلك كالتالي:

b1 = ttk.Button(widgets_frame, text="print", style="info.Outline.TButton", command=COLS_V)

وفي السطر التالي:

combo_name = ttk.Combobox(widgets_frame,justify=RIGHT,width=35,values=column_values)

لم يتم تعريف المتغير column_values في هذا المكان، وعليك تعريفه كمتغير عالمي أو تمرير قيمة صحيحة للوظيفة ttk.Combobox أي التعديل لما يلي:

combo_name = ttk.Combobox(widgets_frame, justify="right", width=35)

 

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

  • 0

هناك مشكلة في السطر التالي:

self.column_values_list = [cell.value for cell in self.sheet['A']]

ففي الدالة column_values() في صنف book_E، الخطأ الذي يحدث هو AttributeError: 'book_E' object has no attribute 'column_values_list'.

وذلك لأنك تحاول تعيين قائمة column_values_list كخاصية للكائن self، ولكن لم تقم بتعريفها كمتغير عضو في الكلاس book_E.

عليك بتعريف المتغير column_values_list كمتغير عضو في الدالة __init__ كالتالي:

def __init__(self, BATH=None):
    self.BATH = BATH
    self.workbook = None
    self.sheet = None
    self.column_values_list = []  # تعريف المتغير كمتغير عضو في الكلاس

بعد ذلك، تستطيع استخدام المتغير self.column_values_list في الدالة column_values() بدون أن تحدث الأخطاء.

تأكد أيضًا من استيراد load_workbook من الوحدة الصحيحة openpyxl.

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

  • 0

قمت بتعديل المشروع لك ورفعه بعد التعديل، عليك فقط تعديل المسار لملف people.xlsx الذي أنشأته وبه بيانات تجريبية فقط، وستقوم بتعديل المسار في ملف MINE.py وتغيير اسم المستخدم إلى اسم المستخدم الخاص بحاسوبك، حيث افترضت أن مجلد المشروع موجود لديك على سطح المكتب.

file_path = r"C:\Users\اسم المستخدم هنا\Desktop\CLASS_1\people.xlsx"  # المسار الذي تريده

Screenshot2023-06-07010052.thumb.png.39ea633a0518cef22b019c99d56657ba.png

CLASS_1.rar

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

  • 0

أسف أخي لقد أكثرت عليك بالأسئلة و أشكرك على رحب صدرك

لاكن المشكلة لا زالت قائمة ( أخي لكي تتضح لك المشكلة شغل البرنامج ومن ثم إضغط الزر عندها سوف تكون لديك قائمة داخل القائمة المنسدلة إختر إحداها ،  هنا سوف يظهر لديك خطأ ( كيف أستطيع إصلاح هذا الخطأ ) وهذا الذي ذكرته لك مسبقاً  والخطأ يحدث هنا على ما أعتقد  print(corresponding_value) قم بتجربة الكود والتحقق من الخطأ أخي

 def on_combobox_selected(self, combo, AM):
        self.combo = combo
        self.AM = AM
        selected_value = self.combo.get()  # القيمة المحددة من القائمة المنسدلة
        row_index = self.column_values_list.index(selected_value) + 1  # +1 لأن الصفوف تبدأ من 1 وليس 0
        corresponding_value = self.sheet[self.AM + str(row_index)].value  # افتراضًا العمود الثاني (B)
        print(corresponding_value)

 

تم التعديل في بواسطة Ali Ali49
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

أرجو منك الإنتباه، حيث أنك وضعت قيمة إفتراضية في ملف MINE.py بقيمة 1 للمتغير column_values وعند تشغيل البرنامج ستجد في القائمة رقم واحد بشكل إفتراضي وتلك القيمة غير موجودة في ملف إكسيل الذي ارفقته لك بالطبع.

ويجب تغيير قيمة المتغير column_values كالتالي:

column_values = "test"

ثم شغل البرنامج وعند الضغط على print سيتم طباقة القيم الموجودة في العمود الأول.

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

  • 0

المشكلة باقية حتى لو عدلت قيمة 

column_values = "test"

عند ضغط زر الطباعة تجاهل القيمة الأولي والتي تظهر كما حدتها أنا سابقا بقيمة 1 والأن بعد تعديلك بقيمة test 

وإختر أي قيمة أخرى يظهر لك الخطأ

ValueError: 'salem' is not in list

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

  • 0
بتاريخ 20 دقائق مضت قال Mustafa Suleiman:

هل يمكنك استخدام الكود الخاص بي في المرفقات؟

CLASS_1.rar 8.59 kB · 0 تنزيلات

عند التجريب نفس المشكلة 

image.thumb.png.3c94aea85aac3c9f2190146f7ee1d12a.png

 

image.thumb.png.62e622574fd99e075cd6911ddd8c72f7.png

ValueError: 'test' is not in list

أرفقت لك ملف الإكسل الخاص بي

people.xlsx

تم التعديل في بواسطة Ali Ali49
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 30 دقائق مضت قال Mustafa Suleiman:

بالطبع يظهر لك الخطأ عليك باستخدام ملف إكسيل الذي أرفقته لك في مجلد المشروع وليس ملفك أنت، وقم بالتجربة.

فعلا أخي لقد إستخدمت ملفك الخاص كا موضح لك بالصور بالأعلى والخطأ الذي يظهر

المشكلة ليست في ظهور القائمة العمود A في القائمة المنسدلة ولاكن المشكلة عند إختيار خيار من القائمة المنسدلة لطباعة القيمة المقابلة للعمود A إلا هوا حاليا وضعت العمود B هنا تظهر رسالة الخطأ

هل لك أن تقوم بتعديل على الأكواد

بحيث عند تشغيل البرنامج تكون أداة الكومبوبكس خالية من القيم إلى حين الضغط على زر لتحميل القائمة بها ومن ثم أقوم [ بإخيار قيمة منها لطباعة القيمة المقابلة لها من الجدول ]

هذه النتيجة التي أريد أن أصل لها حالياً ( قيمة العمود B المقابلة للعمود A )

image.png.2ff4b55c2e19da8ab8c420da5ef7b40e.png

تم التعديل في بواسطة Ali Ali49
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...