Home  Contents

Widgets II in PyGTK

سنتابع فى هذه الجزئية تقديمنا لبعض اهم الويدجات فى PyGTK

Entry

هى ويدجت مسئولة عن ادخال سطر واحد نصى

entry.py
 
#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example demonstrates the Entry widget
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()
        
        self.set_title("Entry")
        self.set_size_request(250, 200)
        self.set_position(gtk.WIN_POS_CENTER)

        fixed = gtk.Fixed()

        self.label = gtk.Label("...")
        fixed.put(self.label, 60, 40)

        entry = gtk.Entry()
        entry.add_events(gtk.gdk.KEY_RELEASE_MASK)
        fixed.put(entry, 60, 100)

        entry.connect("key-release-event", self.on_key_release)

        self.connect("destroy", gtk.main_quit)
        self.add(fixed)
        self.show_all()

    def on_key_release(self, widget, event):
        self.label.set_text(widget.get_text())
        
PyApp()
gtk.main()

فى المثال نعرض حقل ادخال و label ، ويتم تحديث النص الظاهر على ال label بناءا على المدخلات فى حقل الإدخال

 entry = gtk.Entry()

انشاء الويدجت

 entry.connect("key-release-event", self.on_key_release)

اذا تغير الكتابة على الويدجت Entry نستدعى الطريقة on_key_release

 def on_key_release(self, widget, event):
     self.label.set_text(widget.get_text())

نحصل على النص الذى تم ادخاله لحقل الإدخال ونضعه على ال label


Entry Widget

Figure: Entry Widget



HScale

ال Hscale -منزلق افقى- هى ويدجت يسمح للمستخدم بإدخال قيمة عن طريق سحب سهم يشير لقيم فى فترة محددة، فى مثالنا نعرض اداة للتحكم فى الصوت



hscale.py
 
#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example demonstrates the HScale widget
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009


import gtk
import sys


class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Scale")
        self.set_size_request(260, 150)
        self.set_position(gtk.WIN_POS_CENTER)

        scale = gtk.HScale()
        scale.set_range(0, 100)
        scale.set_increments(1, 10)
        scale.set_digits(0)
        scale.set_size_request(160, 35)
        scale.connect("value-changed", self.on_changed)

        self.load_pixbufs()
        
        self.image = gtk.Image()
        self.image.set_from_pixbuf(self.mutp)

        fix = gtk.Fixed()
        fix.put(scale, 20, 40)
        fix.put(self.image, 219, 50)

        self.add(fix)

        self.connect("destroy", lambda w: gtk.main_quit())
        self.show_all()
        
    def load_pixbufs(self):
    
        try:
            self.mutp = gtk.gdk.pixbuf_new_from_file("mute.png")
            self.minp = gtk.gdk.pixbuf_new_from_file("min.png")
            self.medp = gtk.gdk.pixbuf_new_from_file("med.png")
            self.maxp = gtk.gdk.pixbuf_new_from_file("max.png")
            
        except Exception, e: 
            print "Error reading Pixbufs"
            print e.message
            sys.exit(1)


    def on_changed(self, widget):
        val = widget.get_value()

        if val == 0:
            self.image.set_from_pixbuf(self.mutp)
        elif val > 0 and val <= 30:
            self.image.set_from_pixbuf(self.minp)
        elif val > 30 and val < 80:
            self.image.set_from_pixbuf(self.medp)
        else: 
            self.image.set_from_pixbuf(self.maxp)
                 
        

PyApp()
gtk.main()

فى المثال بالأعلى، لدينا منزلق افقى و صورة وبسحب المقياس يتم تغيير تلك الصورة بصورة ملائمة للقيمة المختارة

 scale = gtk.HScale()

انشاء المنزلق الأفقى

 scale.set_range(0, 100)

تحديد الحدود عليه من 0 الى 100

 scale.set_increments(1, 10)

الطريقة set_increments تحدد مقدار الزيادة ومساحة الصفحة للمدى

 scale.set_digits(0)

نريد اعداد صحيحة على المنزلق لذا نضع عدد الخانات ال decimal المطلوبة ل 0



 if val == 0:
     self.image.set_from_pixbuf(self.mutp)
 elif val > 0 and val <= 30:
     self.image.set_from_pixbuf(self.minp)
 elif val > 30 and val < 80:
     self.image.set_from_pixbuf(self.medp)
 else: 
     self.image.set_from_pixbuf(self.maxp)

نقوم بتغيير الصورة بناء على قيمة المنزلق


HScale Widget

Figure: HScale Widget



ToggleButton

نأتى لويدجت ToggleButton وهو مشابه كثيرا لصندوق الإختبار CheckBox وله حالتين ايضا مضغوط او غير مضغوط.. تستطيع التحويل بينهم بالضغط عليه.

togglebuttons.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example demonstrates the ToggleButton widget
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009

import gtk

class PyApp(gtk.Window):
    def __init__(self):
        super(PyApp, self).__init__()

        self.color = [0, 0, 0]
        
        self.set_title("ToggleButtons")
        self.resize(350, 240)
        self.set_position(gtk.WIN_POS_CENTER)
        self.connect("destroy", gtk.main_quit)

        red = gtk.ToggleButton("Red")
        red.set_size_request(80, 35)
        red.connect("clicked", self.onred)
        green = gtk.ToggleButton("Green")
        green.set_size_request(80, 35)
        green.connect("clicked", self.ongreen)
        blue = gtk.ToggleButton("Blue")
        blue.set_size_request(80, 35)
        blue.connect("clicked", self.onblue)

        self.darea = gtk.DrawingArea()
        self.darea.set_size_request(150, 150)
        self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))

        fixed = gtk.Fixed()
        fixed.put(red, 30, 30)
        fixed.put(green, 30, 80)
        fixed.put(blue, 30, 130)
        fixed.put(self.darea, 150, 30)

        self.add(fixed)

        self.show_all()

    def onred(self, widget):
        if widget.get_active():
            self.color[0] = 65535
        else: self.color[0] = 0

        self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0], 
            self.color[1], self.color[2]))

    def ongreen(self, widget):
        if (widget.get_active()):
            self.color[1] = 65535
        else: self.color[1] = 0

        self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0],
            self.color[1], self.color[2]))

    def onblue(self, widget):
        if (widget.get_active()):
            self.color[2] = 65535
        else: self.color[2] = 0

        self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0], 
            self.color[1], self.color[2]))


PyApp()
gtk.main()

فى مثالنا نعرض 3 toggle buttons ومساحة للرسم DrawingArea ، ونحدد الخلفية للأسود، وعند تغيير حالة اى زر يتم تحديد قيم الأحمر والأخضر والأزرق من قيمة اللون.. فيعتمد اللون على اى من الأزرار مضغوط

 self.color = [0, 0, 0]

هذه هى قيمة اللون اللذى سيتم تحديثه عبر ال toggle buttons

 red = gtk.ToggleButton("Red")
 red.set_size_request(80, 35)
 red.connect("clicked", self.onred)

انشاء كان من الصف ToggleButton وحددنا المساحة الخاصة ب ل 80*35 بكسل، وكل زر له معالج ل – Clicked- الخاص به

 self.darea = gtk.DrawingArea()
 self.darea.set_size_request(150, 150)
 self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("black"))

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



 if widget.get_active():
     self.color[0] = 65535
 else: self.color[0] = 0

اذا ماتم الضغط عليه يتم تعديل قيم ال R وال G وال B

 self.darea.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(self.color[0], 
            self.color[1], self.color[2]))

نحدث لون منطقة الرسم


ToggleButton widget

Figure: ToggleButton widget



Calendar

الويدجت الأخير هو Calendar يستخدم للتعامل مع التواريخ

calendar.py

#!/usr/bin/python

# ZetCode PyGTK tutorial 
#
# This example demonstrates the Calendar widget
#
# author: jan bodnar
# website: zetcode.com 
# last edited: February 2009


import gtk

class PyApp(gtk.Window):

    def __init__(self):
        super(PyApp, self).__init__()

        self.set_title("Calendar")
        self.set_size_request(300, 270)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_border_width(2)

        self.label = gtk.Label("...")

        calendar = gtk.Calendar() 
        calendar.connect("day_selected", self.on_day_selected)

        fix = gtk.Fixed()
        fix.put(calendar, 20, 20)
        fix.put(self.label, 40, 230)

        self.add(fix)

        self.connect("destroy", gtk.main_quit)
        self.show_all()
        
    def on_day_selected(self, widget):
        (year, month, day) = widget.get_date()
        self.label.set_label(str(month) + "/" + str(day) + "/" + str(year))
    
        

PyApp()
gtk.main()

لدينا ويدجت Calendar لنختار منه تاريخ ماو label لعرض ذلك التاريخ المختار

 calendar = gtk.Calendar() 

انشاء الويدجت

 (year, month, day) = widget.get_date()
 self.label.set_label(str(month) + "/" + str(day) + "/" + str(year))

فى الطريقة on_day_selected نحصل على التاريخ الحالى المختار وونقوم بتحديث محتوى ال label




Calendar

Figure: Calendar



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



Home ‡ Contents ‡ Top of Page