Home Map Index Search News Archives Links About LF
[Top bar]
[Bottom bar]
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

[Yazarın Fotoğrafı]
by Charles Vidal

Yazar hakkında:

Paris'teki bir gastronomic lug'ın başkanı. GNU ve açık kod felsefesini seviyor çünkü ikiside insanların bilgiyi paylaşmasına izin veriyor. Saksafonunu çalmak için daha çok zaman bulmak istiyor.

İçerik:

Tk'e giriş

Çeviri : Osman Solakoğlu

Tcl Tk logo

Özet:

Bu makale Tck grafik araçlarının özelliklerini tanıtır: Tk. Birkaç satırlık kodla bir arayüz (GUI: Graphical User Interface) yapmanın ne kadar kolay olduğunu göreceğiz.



 

Tk, Tcl için grafik araçları :WISH

Tk, Tcl diline grafik araçları sağlamak için yapılmıştır. Biz genellikle buna Tcl/Tk deriz (Tikel/Tikey diye okunur).

Tk, kullandığımız işletim sisteminin görünüşünde bir çok platformlu grafik araçları programı olarak tasarlanmıştır. Çok platformlu olan Tcl diline tam olarak entegre olur. Tcl/Tk'in en büyük avantajı basitliğidir. Bu ikili, hızlıca, taşınabilen uygulamalar yapmanızı sağlar. Tcl için tclsh'ın olması gibi, Tk için de wish vardır.

 

Merhaba Dünya !

Küçük bir giriş olması için klasik bir örneği nasıl programlayacağınızı göstereceğim. Bu örnek Tcl/Tk birleşmesinin olasılıklarını ve basitliğini gösteriyor.
pack [ label .l -text "Bonjour monde" ]

Bunu C dilinde yazılmış bir gtk programıyla karşılaştırırsanız farkı daha iyi anlarsınız...
#include <gtk/gtk.h>
Int main( int   argc,
          char *argv[] )
{
   /* GtkWidget widgetlar için depolama türüdür */
    GtkWidget *window;
    GtkWidget *button;

    gtk_init(&&argc, &&argv);
   /* yeni bir pencere oluştur */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    button = gtk_button_new_with_label ("Bonjour Monde");
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_widget_show (button);

    /* ve pencere */
    gtk_widget_show (window);
    gtk_main ();

    return(0);
}
... veya Motif'le karşılaştırın
/* COMPILE  cc xmhello.c -L/usr/X11R6/lib  -lXm -lXt -lX11 -lXmu -o xmhello */

#include <Xm/PushB.h>
#include <Xm/Form.h>

/* Widget */

	Widget      main_widget, pushb;

main(int argc, char **argv)
{
	Widget      form;
	Arg         args[1];
	int         ac = 0;
	XmString    label_str;

	main_widget = XtInitialize(argv[0], "test", NULL, 0, &&argc, argv);
	label_str = XmStringCreate("Bonjour Monde", XmSTRING_DEFAULT_CHARSET);
	XtSetArg(args[ac], XmNlabelString, label_str);
	ac++;
	pushb = XmCreatePushButton(main_widget, "hello", args, ac);
	XtManageChild(pushb);
	XtRealizeWidget(main_widget);
	XtMainLoop();
}
Fakat scriptik bir dilin kaynak koduyla, derlenmiş biçiminin karşılaştırması zordur. Bunun yanında, uygulamanın hafızadaki boyutu gibi diğer hususları da göz önüne almalıyız. Bu nedenle, tek söyleyebileceğimiz klasik "Merhaba dünya" programının Tk'le gerçekten kolay bir şekilde yapılabildiğidir. Araçların görünüşünden çok; genel kavramları ve düşünceleri dikkate almalıyız.
Tk Widget'ın görünüşünü değiştirmek için Qtk ve TkStep gibi birkaç yan program da vardır.
Tk araçlarının birçok dille kullanılabileceğini bilmek de ilginç gelebilecek noktalardan biridir. Birçok scriptic dil gibi Tcl/Tk da çok platformludur.  

Tk grafiksel nesne oluşturulması

Bu araçlar arayüz(GUI) hazırlamak için temel bir grafiksel nesneler(widget) takımı sağlar.

Mevcut tüm widgetların bir gösterisini izlemek için, /usr/local/lib/tk8.0/demos/ dizinine gidin ve widget'ı çalıştırın.

Bu grafiksel nesneler takımı sınırlandırılmıştır (ağaç widgetı,combobox ....). Bununla birlikte, bazı kişiler veya kuruluşlar bazı değerli ilaveler yapmışlardır.En ünlüsü : Tix the widgets Incr Tcl ve son zamanlarda müthiş BWidget, tüm ilaveler scriptics yöresinden elde eilebilir.

 

Arabirimdeki grafiksel nesnenin ağaç yapısı

Arabirimler, kendi özellikleriyle, pencerelerin (dikdörtgen) bir ağacıyla oluşturulur.
Ağaç yapısından "node"lar örneğin buton gibi bir grafiksel nesnenin taşıyıcısıdırlar. Tcl/Tk'deki ağaç yapısı şu şekilde tanımlanır: Wish programı çalıştırıldığında bir pencere ortaya çıkar. Bu, . (nokta) olarak isimlendirilen ana penceredir.  

Grafiksel nesnelerin oluşturulması: "merhaba dünya"

Bir grafiksel nesnenin oluşturulması için tcl komutu:
nesne_ismi .(taşıyıcı_ismi.)*grafiksel_nesne_ismi [özellik değeri]
Örnek: label .mylabel -text "merhaba dünya"

Gördüğünüz gibi işleyiş, önce grafiksel nesnenin adını vermekle, burda .label, sonra taşıyıcının adını vermekle ( . ana penceredir) ve en sonunda özelliklerin tanımlanmasıyla (-text " merhaba dünya ") gerçekleşir. Burda, grafiksel nesnenin oluşturulmasından sonra parametrelere ulaşmanın ve onları değiştirmenin mümkün olduğu dikkatimizi çekmeli.


ve şimdi etiket(label) "Bonjour Monde Fransızca :) " olur.
Şu komutla onu göstertebilirsiniz: puts [label .mylabel -text "merhaba dünya"] Etiket bir komutun sonucunu da gösterebilir:
.mylabel configure -text " Tarih: [exec date ]"
Seçenekleri listelemek için (verilen bir widget için), Wish'te etkileşimli yoldan çalışarak, configure komutuna verebilirsiniz.Bunun için, ".mylabel configure" yazın.
Bu, hata verir ve kullanabileceğiniz seçenekleri gösterir.
 

Layout: Widget konumları yöneticisi.

Hiçbirşey olmuyor, ekranda hiçbirşey görünmüyor diyebilirsiniz

Aslında etiket tipinde bir nesne oluşturdunuz ama bunun ekranda görünmesini istemediniz. Böyle oldu çünkü nesnenin ekranda görünmesi için bazı bilgiler gerekiyor ve siz bunu daha sağlamadınız. Bu gereken bilgi; nesnenin hangi layout'a (layout pencereleri konumlandırmaya yarayan bir yöneticidir) konulacağıdır.

Mevcut layoutlar:
  1. The packer
  2. The placer
  3. The grid
En basitini seçelim: the packer. Bu layout, nesneleri kullanıcının şartlarına göre kendi içine ekler. Daha fazla bilgi ileride verilecek.

Tüm özellikleriyle Merhaba Dünya
label .mylabel -text "merhaba dünya"
pack .mylabel

Veya tek satırda:
pack [label .mylabel -text "merhaba dünya"]


Buton Eğer buton oluşturursak:

button .myboutton -text "merhaba dünya" -command "exit"
pack .myboutton

Butonun parametre olarak komut (-command) özelliği (sadece bir) dikkatimizi çeker. Butona tıkladığımızda bu tcl komutu çalıştırılır. Bu örnekte, çalıştırılacak komut exit 'tir, Bu komut programdan çıkılmasını sağlar.

 

Grafiksel nesnelerin ve değişkenlerin ilişkilendirilmesi.

Tcl/Tk'nın gücü, grafiksel nesnelerin değişkenlere kolayca ilişkilendirilmesinde ortaya çıkar.The power of Tcl/tk is its great ease of associating graphical objects to a variable corresponding to their change of state. Grafiksel nesnenin durumunu öğrenmek için fonksiyon çağırmak zorunda değiliz. . Aynı yolla, eğer biri değişkeni değiştirirse bu, doğruca grafiksel nesneyi de etkiler. Görebileceğiniz gibi, bu özellik çok daha az kodla çalışmayı sağlar.

Örnek

Checkbutton ve radiobutton.

  1. Checkbuton, bir durumu gösterir.
    Bu buton bir boolean durumunu gösterir (işaretli veya değil). Biz bunu checkbutonun durumuna göre 0 (standart) veya 1 değerlerini alan bir değişkenle ilişkilendirebiliriz. Aynı zamanda, checkbutonun durumuna göre değişen değişkenin alacağı değerleri de tanımlayabiliriz.
    Örnek:

    checkbutton $w.b1 -text "Wipers OK" -variable wipers -relief flat -onvalue "Ok" -offvalue "not Ok"

  2. Radiobuton bir buton takımının durumunu gösteren butondur.
    Radiobutonlar genellikle gruplanmıştır.Bu, aralarından birtane seçmemize izin verir. Onları gruplamak için, hepsine aynı değişken adını verip radiobuton seçildiğinde alıcağı değeri bu değişkene aktarmalıyız.
    Örnek:



    radiobutton .b1 -text "Premier " -variable size -value 1
    radiobutton .b2 -text "Second " -variable size -value 2

Entry
Bu widget kullanıcının doldurabileceği bir satırlık metindir. Girilen bilgiye -textvariable komutuyla bir değişkeni ilişkilendirebiliriz.
Örnek:


entry .e -textvariable toto -width 40
 

Layout Yöneticisi

Grafiksel nesneler genellikle bir çerçeveye konur. Aynı çerçevede birden fazla layout yöneticisi kullanmamaya dikkat edin. Üç tane layout yöneticisi var:
  1. The packer: Bir yönlendirmeye bağlı olarak grafiksel nesneyi konumlandırır:
    1. top (üst)
    2. bottom (alt)
    3. right (sağ)
    4. left (sol)

    Örnek:
    pack [ button .b1 -text top ] -side top
    pack [ button .b2 -text bottom ] -side bottom
    pack [ button .b3 -text right ] -side right
    pack [ button .b4 -text right ] -side left
    

    Widget'ı ayrıca şu şekilde de ayarlayabiliriz: option -expand (yes|no) -fill ( x|y| both)

  2. The placer: Grafiksel Nesneyi x y konumlarına yerleştirebiliriz.

    Örnek: place [ label .l -text "With Place"] -x 100 -y 100 .l configure -bg red

  3. The grid widgetları satır ve sütunlardan oluşan sanal bir ızgaraya yerleştirir. Bu, liste kutucukları ve çok satırlı düzenleme kutucukları için ideal layouttur. Sözdizimi şöyledir: Önce widgetlar oluşturulur, örneğin .e_name, daha sonra şununla ekranda göstertilir:

    label .mainlbl2 -text "Label 2" -bd 2 -relief sunken
    grid .mainlbl2 -row 0 -column 1 -sticky news
    label .mainlbl1 -text "Label 1" -bd 2 -relief raised
    grid .mainlbl1 -row 0 -column 0 -sticky news
    label .mainlbl3 -text "Label 3" -bd 2 -relief solid
    grid .mainlbl3 -row 1 -column 0
    label .mainlbl4 -text "Label 4" -bd 2 -relief groove
    grid .mainlbl4 -row 1 -column 1

 

Oluşturulan widgetların listesi

winfo ile oluşturulmuş olan grafiksel nesnelerin listesini alabiliriz.

 winfo exists name_object
Oluşturulmuş olan tüm widgetların listesini almak için şu komutu kullanabiliriz:
winfo children .
Tcl/Tk'in bu işlevselliği başka hiçbir derlenmiş grafik araçlarında yoktur ( gtk, awt, motif ...).

 

Olaylar (event)

Tk'in olayı değerlendirmesi ve komut çalıştırması -command verilmesine bağlıdır. Kullannıcının olayları tem olarak yönetmek isteyebileceği veya bir widget için birkaç olay yönetmek isteyebileceği durumlar da var. canvas böyle bir widgettır.



bind widgetın_adı olayın_adı tcl_kodu.

 

Küçük bir örnek

Tar (gz) dosyasının içeriğini görmek için bir arabirim yapacağız..
Arabirim bir liste ve iki kaydırma çubuğundan oluşuyor.
Tcl scripti yapısını tanımlayalım:
  1. Arayüzü oluştururuz (proc makegui).
  2. Widgetın tüm yollarını (path) bir hashtable'a yerleştiririz tabgui.
  3. Parametre sayısını taratırız; eğer sayı sıfıra eşitse uygulama sonlanır.
  4. Handle'ı pipe'tan tar -tzvf name_file_tar programıyla açarız.
  5. Pipe'dan okunan her satırı listeye ekleriz.
Bir klavye olayı olan "Control C" kombinasyonunu uygulamayı sonlandırmak için kullanırız:
bind all <Control-c> {destroy .}

Bu sadece küçük bir örnekti, bunu geliştirebiliriz. Dosyanın sıkıştırılmış olup olmadığını bir tcl komutu olan string first ile test edebiliriz. Eğer kullanıcı herhangi bir parametre vermezse, tar dosyasını seçmek için bir dosya seçici ortaya çıkar. Arşivdeki dosyaların üzerinde oynamak için bir popmenu oluşturarak programı daha karmaşıklaştırabiliriz. Son olarak, üstte bir menü çubuğu oluşturarak kullanıcıya yeni dosya açmak, yeni arşiv yapmak gibi seçenekler sunabiliriz...
#!/bin/sh
# the next line restarts using wish \
exec wish8.0 "$0" "$@"

global tabgui

proc makegui { } {
global tabgui
#
# Liste için kaydırma çubuklarının oluşturulması
# dikey kaydırma çubuğu dikey olaray ekranı kaplayacak şekilde sağa konumlandırılır
# ve yatay kaydırma çubuğu yatay olarak ekranı kaplayacak şekilde aşağıya konumlandırılır
#
set tabgui(scrollv) [scrollbar .scrollv -command ".list yview"]
pack $tabgui(scrollv) -side right -fill y
set tabgui(scrollh) [scrollbar .scrollh -command ".list xview" -orient horizontal ]
pack $tabgui(scrollh) -side bottom -fill x
#
# Listenin oluşturulması, kaydırma çubuklarıyla ilişkilendirilmesi
#
#
set tabgui(list) [listbox .list  \
                -yscroll "$tabgui(scrollv) set" \
                -xscroll "$tabgui(scrollh) set" \
                -relief sunken -width 20 -height 20 \
        -setgrid yes ]
pack $tabgui(list) -side left -fill both -expand yes
wm minsize . 1 1
}

#
# Arabirimin oluşturulması
#
makegui

if $argc>0 {set tarfile [lindex $argv 0]} else {puts stderr "tar file missing" ; exit} 
set command "tar -tzvf $tarfile"
set tube [ open |$command r] 
 while {![eof $tube]} {
    set tarresult  [ gets $tube ] 
    $tabgui(list)  insert end $tarresult
}

bind all <Control-c> {destroy .}
 

Kaynaklar

 

Makale hakkındaki yorumlarınız için form

Her makale kendi yorum sayfasına sahiptir. Bu sayfada yorumlarınızı belirtebilir veya başka okuyucuların yorumlarına gözatabilirsiniz:
 Yorumlarınız İçin 

LinuxFocus Editörleri tarafından elde edilmiş yöreler
© Charles Vidal
LinuxFocus.org 2000

Bir hatayı LinuxFocus'a bildirmek veya yorum göndermek için buraya tıklayın
Çeviriler Hakkında:
fr -> -- Charles Vidal
fr -> en Charles Vidal
en -> tr Osman Solakoğlu

2000-10-28, generated by lfparser version 1.8