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

السؤال

نشر (معدل)

السلام عليكم 

من فضلكم أحتاج مراجعة لهذا الكود 

في البداية قمت بإنشاء هذا الكلاس

from openpyxl import load_workbook

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

    def column_values(self):
        # استخراج قيم العمود الأول من ورقة العمل وتخزينها في قائمة:
        self.column_values = [cell.value for cell in self.sheet['A']]    
        return self.column_values

من ثم في صفحة البرنامج قم بإنشاء هذا الكود

 

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

BOOK1 = book_E('d:\abc.xlsx')

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

def COLS_V(BOOK1):
    B = BOOK1.column_values()
    print(q)  

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

#--------------------------------------------------------------------------------------------
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(BOOK1))
b1.grid(row=0, column=0, padx=5, pady=5,  sticky="ew")

root.mainloop()

المشكلة التي تحدث أنه قبل الضغط على الزر طباعة في واجهة البرنامج البرنامج يقوم بتنفيذ الأمر وحده عند تشغيل البرنامج داخل TERMINAL 

أين الخطأ في ذلك أحبتي

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال

Recommended Posts

  • 0
نشر

المشكلة تكمن في الطريقة التي تقوم بها بتعيين الدالة المرتبطة بزر الطباعة (b1) في واجهة البرنامج، ويجب أن تقوم بتمرير الدالة نفسها بدون استدعاءها فورًا.

وباستطاعتك استخدام وظيفة lambda لتعيين الدالة كوظيفة منفصلة بدون استدعائها فورًا، وإليك الكود:

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

باستخدام lambda، سيتم تمرير الدالة COLS_V(BOOK1) نفسها كوظيفة مستقلة إلى الزر، ولن تستدعى فورًا عند تشغيل البرنامج.

وعليك أيضًا تصحيح خطأ آخر في الدالة sheet_Names و COLS_V، وفي الدالة sheet_Names يجب أن تقوم بإرجاع A بدلاً من q.

وفي الدالة COLS_V يجب أن تقوم بطباعة B بدلاً من q، وإليك الكود بعد التعديل:

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

def COLS_V(BOOK1):
    B = BOOK1.column_values()
    print(B)

وبعد التعديل من المفترض أن تستدعى الدالة COLS_V(BOOK1) فقط عند النقر على زر "print" في واجهة البرنامج.

  • 0
نشر (معدل)

أشكرك جزيل الشكر

إستفسار لو سمحت ( ما وظيفة  lambda )

قمت بمراجعة التعديلات 

وحدثت معي مشكلة وهي في البداية وعند الضغط للمرة الأولى على الزر يعمل الكود ولايوجد مشكلة ولاكن عند الضغط على الزر من جديد تحدث هنا المشكلة السؤال هنا لماذا تحدث هذه المشكلة؟

هذا نص الخطأ

TypeError: 'list' object is not callable

تم التعديل في بواسطة Ali Ali49
  • 0
نشر

وظيفة lambda في Python تستخدم لإنشاء وظائف مجهولة (anonymous functions)، وتسمح لك بتعريف وظيفة صغيرة دون الحاجة إلى تسميتها بشكل صريح، وتستخدم lambda في السياقات التي تحتاج فيها إلى وظيفة بسيطة وقصيرة.

وبخصوص الزر الذي تستخدمه في واجهة البرنامج، تحتاج إلى تعيين دالة (function) للقيام بإجراء معين عند النقر على الزر، وباستخدام lambda، يتم تعريف دالة مجهولة بشكل فوري لتنفيذ الأمر الذي ترغب فيه عند النقر على الزر.

بالنسبة للخطأ (TypeError: 'list' object is not callable)، فهناك تعارض في تسمية المتغيرات.

وفي الكود الأول لديك، قمت بتسمية المتغير الذي يحمل قائمة القيم بنفس اسم الوظيفة column_values، وبالتالي، عند استدعاء الوظيفة للمرة الثانية، يتم تجاوز الدالة واستدعاء القائمة نفسها، وهذا هو سبب ظهور الخطأ.

أي عليك بتغيير اسم المتغير الذي يحمل القائمة إلى اسم مختلف مثلاً تغييره إلى column_values_list كما يلي:

class book_E:
    def __init__(self, BATH):
        self.BATH = BATH
        self.workbook = load_workbook(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

ثم في الكود الذي يعرض واجهة البرنامج، استخدم الدالة COLS_V مباشرة بدون استدعاء print:

def COLS_V(BOOK1):
    B = BOOK1.column_values()
    print(B)

 

  • 0
نشر (معدل)

أشكر أخي ( لقد فهمت الأن سبب المشكلة ) في الحقيقة أخي أنا أتعلم من هذه الأخطاء التي تحدث .

طلب أخر أخي

أنا فعلا لأحتاج أن أطبع 

def COLS_V(BOOK1):
    B = BOOK1.column_values()
    print(B

ولكن وضعتها لأرى عمل الكود

ولاكن أنا أحتاج أن ينفذ الكود داخل أداة combobox in tkinter عند الضغط على الزر تتحمل list  بالكود السابق إلى هذه الأداة

هل ينفع الأمر هكذا

column_values = ""

def COLS_V(BOOK1):
    q = BOOK1.column_values()
    column_values = q
    
b1 = ttk.Button(widgets_frame, text="print", bootstyle=("info", "outline"),command=lambda:COLS_V(BOOK1))
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")

ما الكود السليم في هذه الحالة؟

أشكر مساعدتكم

 

تم التعديل في بواسطة 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...