مدونتى حيث اشارك اهتماماتي البرمجية و الفلاحية و الثقافية

فهم الودجة combo في tkinter

التطبيق الصغير أدناه يوضح لك كيفية بناء صنف جديد من ودجة  مكعبة من النوع كومبو. ويعرف هذا النوع على أنه ودجة تربط بين حقل الادخال وعلبة القائمة : يمكن للمستخدم الدخول إلى عناصر القائمة بالضغط على اسمها، أو إذا كان العنصر غير موجود يمكن كتابة اسم عنصر جديد من خلال حقل الادخال. نحن بسطنا الشكل فقط من خلال ترك اللائحة واضحة تماما لكن من المكن تحسين هذه الودجة بحيث يتم اضافة زر صغير للشكل التقليدي لحقل يساهم في ظهور القائمة، ويتم إخفاء هذا في البداية.
و كما تصورنا، الودجة الخاصة بنا combo سيتم تجميعها في كيان واحد من 3 ويدجات tkinter أساسية : حقل إدخال، مربع القائمة listbox وشريط تمرير.
مربع القائمة وشريط التمرير سيتم ربطهم، لأن شريط التمرير يسمح بالتحكم بعناصر القائمة. وسيتم أيضا التأكد من أن شريط التمرير سيكون متناسبا مع ارتفاع العلبة بصرف النظر عن الحجم الاولي.
سوف نضع علبة القائمة و شريط التمرير جنبا إلى جنب في إطرا Frame() ، ووضعه مع محتوياته في أسفل حقل الادخال، في إطار آخر. وسوف تكون جميع الويدجات التي لدينا مركبة في عنصر واحد.
لأختبار الودجة الخاصة بنا، سوف نقوم بتضمينها في تطبيق بسيط جدا : عندما يقوم المستخدم باختيار أحد الالوان من القائمة (يمكن أيضا إدخال اسم اللون مباشرة في حقل الدخال)، وهذا سيؤدي تلقائيا الى تغيير لون خلفية النافذة الرئيسة. في هذه النافذة الاساسية، سوف نضيف ملصق وزر، لتفهم اكثر كيفية الوصول إلى الاختيار الذي يتم اختياره في مكعب الكومبو(الزر يقوم بعرض اخر لون تم اختياره او التأشير عليه).

#! /usr/bin/env python
# -*- coding:Utf8 -*-

from tkinter import *

#الصنف او الكلاس الاساسي لمربع الكومبو
class ComboBox(Frame):
    "ودجة مكونة من حقل للأدخال و علبة قائمة"
    def __init__(self, boss, item='', items=[], command ='', width =10,listSize =5):
        Frame.__init__(self, boss)   # منشئ الصنف الاصل
                                     # (<boss> هو مرجع الودجة السيد)
        self.items =items            # العناصر التي سيتم اضافتها الى القائمة
        self.command =command        # الامر الذي سيتم استدعائه عند ال clic او <enter>
        self.item =item              # العنصر المضاف او الممختار
        # حقل الادخال :
        self.entree =Entry(self, width =width)          # طول الحروف
        self.entree.insert(END, item)
        self.entree.bind("<Return>", self.sortieE)
        self.entree.pack(side =TOP)
        # علبة القائمة بالاضافة لشريط التحريك (scroll bar) :
        cadreLB =Frame(self)                 # اطار يجمع العنصرين
        self.bListe =Listbox(cadreLB, height =listSize, width =width-1)
        scrol =Scrollbar(cadreLB, command =self.bListe.yview)
        self.bListe.config(yscrollcommand =scrol.set)
        self.bListe.bind("<ButtonRelease-1>", self.sortieL)
        self.bListe.pack(side =LEFT)
        scrol.pack(expand =YES, fill =Y)
        cadreLB.pack()
        # اضافة العناصر المختارة الى القائمة :
        for it in items:
            self.bListe.insert(END, it)
    def sortieL(self, event =None):
        # استخراج العنصر المختار من القائمة :
        index =self.bListe.curselection()      # إرجاع مصفوفة مغلقة للمؤشر
        ind0 =int(index[0])                    # نحتفظ بالاول فقط
        self.item =self.items[ind0]
        # تحديث حقل الادخال بالعنصر المختار :
        self.entree.delete(0, END)
        self.entree.insert(END, self.item)
        # تنفيد الامر بالعنصر المختار كبرامتر :
        self.command(self.item)
    def sortieE(self, event =None):
        # شغيل الامر المحدد مع يبرامتر تم ترميزه كما هو :
        self.command(self.entree.get())
    def get(self):
        # اظهار اخر عنصر تم اختياره في القائمة
        return self.item
if __name__ =="__main__":
#تشكيل البرنامج و الاوامر خارج الكومبو
    def changeCoul(col):
        fen.configure(background = col)

    def changeLabel():
        lab.configure(text = combo.get())

    couleurs = ('navy', 'royal blue', 'steelblue1', 'cadet blue',
                'lawn green', 'forest green', 'yellow', 'dark red',
                'grey80','grey60', 'grey40', 'grey20', 'pink')
    fen =Tk()
    combo =ComboBox(fen, item ="فارغ", items =couleurs, command =changeCoul,
                    width =15, listSize =6)
    combo.grid(row =1, columnspan =2, padx =10, pady =10)
    bou = Button(fen, text ="تجربة", command =changeLabel)
    bou.grid(row =3, column =0, padx =8, pady =8)
    lab = Label(fen, text ="مرحبا", bg ="ivory", width =15)
    lab.grid(row =3, column =1, padx =8)
    fen.mainloop()


--بتصرف--