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

السؤال

Recommended Posts

  • 0
نشر
بتاريخ منذ ساعة مضت قال Ahmed Ahmed:

السلام عليكم

 

كيف أستطيع جلب بيانات عمود معين من ملف إكسل إلى أداة combobox بلغة البايثون

grab columns into combobox py python

المكتبات المستخدمة  tkinter  ,  openpyxl

أرجو التوضيح ولو بمثال عملي

أرجو تصحيح الكود

from tkinter import *

from tkinter import ttk

from openpyxl.workbook import workbook

from openpyxl import load_workbook

form_A=Tk()

form_A.geometry('500x500')

wb=load_workbook('2003-2004.xlsx')

ws=wb.active

colum_A = ws['A']

Combo1=ttk.Combobox(form_A,value=column_A)

Combo1.pack(pady=30)

form_A.mainloop()

  • 0
نشر
بتاريخ 6 ساعة قال Ahmed Ahmed:

أرجو تصحيح الكود

from tkinter import *

from tkinter import ttk

from openpyxl.workbook import workbook

from openpyxl import load_workbook

form_A=Tk()

form_A.geometry('500x500')

wb=load_workbook('2003-2004.xlsx')

ws=wb.active

colum_A = ws['A']

Combo1=ttk.Combobox(form_A,value=column_A)

Combo1.pack(pady=30)

form_A.mainloop()

مرحبا أحمد،

الشيفرة التي قمت بإرفاقها تقوم بما طلبته، حيث أنها تقوم بقراءة عمود في ملف إكسل وهو العمود A

colum_A = ws['A']

وتقوم بإضافته إلى ال combobox:

Combo1=ttk.Combobox(form_A,value=column_A)
#                                ^^^^^^^^
#                 قم باستعمال    colum_A

لكن عند عرض محتوى ال combobox نجد أنه يحتوي على قيم تبدأ ب Cell:

aaaa.png.9ce46a455443f4b64e073377de44f863.png

لتصحيح هذا الأمر قم بتغيير الشيفرة: 

Combo1=ttk.Combobox(form_A,value=colum_A)

إلى:

Combo1=ttk.Combobox(form_A,value=[cell.value for cell in colum_A])
#                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                                ننشئ مصفوفة تحتوي على قيم الخانات

وسوف تظهر النتيجة على الشكل التالي:

bbbbb.png.46bf72503cf01545b57e826842d3546c.png

بالتوفيق.

  • 0
نشر

أشكرك جزيل الشكر أخي < مسعود زاهي > بارك الله فيك على الإجابة.

أخي مسعود أطمع في مساعدة أخرى وقد عجزت عن تنفيذها 

ماذا لو كان لديا عمود أخر على سبيل المثال العمود B وأريد أن أجلب قيمة معينه من هذا العمود بناءا على القيمة التي تقابلها من العمود A  وذلك تكمله للمثال السابق عن الأختيار من combobox حيث أريد عرض النتيجة في مربع النص.

  • 0
نشر
بتاريخ 42 دقائق مضت قال Ahmed Ahmed:

أشكرك جزيل الشكر أخي < مسعود زاهي > بارك الله فيك على الإجابة.

أخي مسعود أطمع في مساعدة أخرى وقد عجزت عن تنفيذها 

ماذا لو كان لديا عمود أخر على سبيل المثال العمود B وأريد أن أجلب قيمة معينه من هذا العمود بناءا على القيمة التي تقابلها من العمود A  وذلك تكمله للمثال السابق عن الأختيار من combobox حيث أريد عرض النتيجة في مربع النص.

مرحبا مجددا أحمد،

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

class KeyValueCombobox(ttk.Combobox):

    def __init__(self, master=None, cnf={}, **options):

        self.dict = None

        if 'values' in options:
            if isinstance(options.get('values'), dict):
                self.dict = options.get('values')
                options['values'] = sorted(self.dict.keys())

     
        ttk.Combobox.__init__(self, **options)

    
    def get(self):                              
        if self.dict:
            return self.dict[ttk.Combobox.get(self)]
        else:
            return ttk.Combobox.get(self)

    def get_key(self):
        return ttk.Combobox.get(self)

    def get_value(self):                              
        return self.get()

KeyValueCombobox هو صنف جديد يرث من ttk.Combobox يسمح لنا بحفظ قاموس بدل مصفوفة. يمكننا استعماله على الشكل التالي:

colum_A = ws['A']

#بعد جلب العمود من الاكسل
# نحفظ القيم مع رقم الخانة في قاموس
items = {}
for key, cell in enumerate(colum_A):
    items[str(key)] = str(cell.value)

# نقوم بتمرير القاموس الى الصنف الذي أنشأناه
Combo1= KeyValueCombobox(form_A,values= items)

لمعرفة العنصر الذي اختاره المستخدم من ال Combobox ينبغي علينا استعمال التابع bind على الشكل التالي:

# هذه الدالة تعمل عند اختيار عنصر من 
# Combobox
def onSelect(event):
    # نحصل على قيمة الخانة
    # B
    # المقابلة للتي اخترناها من 
    # A
    cell_b = ws[f'B{Combo1.get_key()}']
    print(cell_b.value)
    
Combo1.bind('<<ComboboxSelected>>', onSelect)

بالتوفيق.

  • 0
نشر
بتاريخ 12 ساعة قال Ahmed Ahmed:

ألف تحية لك أخي مسعود وزادك الله علما نافعا 

شكرا جزيلا

الشرح بإذن الله واضح لاكن لو سمحت كيف أجعل قيمة الك Combobox التي تضهر للمستخدم قيم العمود A وليس رقم الخلية

إذا طبقت ما ذُكر سابقا فإن القيمة هي التي سوف تظهر ولن يظهر رقم الخلية.

قم بمشاركة الشيفرة البرمجية التي كتبتها مع التحديثات وأيضا أرفق ملف الاكسل الذي تعمل عليه وسوف نقوم بمساعدتك.

بالتوفيق.

  • 0
نشر

أخي لقد طرحت سؤالي بعد تجريب الكود وهذا ما ظهر لدي وهوا رقم الخلية وليس القيمة الموجودة بالخلية

أرجو تبسيط الكود أكثر أو طريقة أخرى لذلك

from tkinter import *
from tkinter import ttk
from openpyxl.workbook import workbook
from openpyxl import load_workbook

form_A=Tk()
form_A.geometry('500x500')

wb=load_workbook('2003-2004.xlsx')
ws=wb.active

class KeyValueCombobox(ttk.Combobox):

    def __init__(self, master=None, cnf={}, **options):

        self.dict = None

        if 'values' in options:
            if isinstance(options.get('values'), dict):
                self.dict = options.get('values')
                options['values'] = sorted(self.dict.keys())

     
        ttk.Combobox.__init__(self, **options)

    
    def get(self):                              
        if self.dict:
            return self.dict[ttk.Combobox.get(self)]
        else:
            return ttk.Combobox.get(self)

    def get_key(self):
        return ttk.Combobox.get(self)

    def get_value(self):                              
        return self.get()
colum_A = ws['A']
items = {}
for key, cell in enumerate(colum_A):
    items[str(key)] = str(cell.value)
Combo1= KeyValueCombobox(form_A,values= items)
def onSelect(event):
    cell_b = ws[f'B{Combo1.get_key()}']
    print(cell_b.value)
    
Combo1.bind('<<ComboboxSelected>>', onSelect)
Combo1.pack(pady=30)

form_A.mainloop()

2003-2004.xlsx

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...