forked from yazbel/python-istihza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnesne_tabanli_programlama6.html
831 lines (747 loc) · 75.5 KB
/
nesne_tabanli_programlama6.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
<!DOCTYPE html>
<html lang="tr">
<html lang="tr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta content="Bu bölümde nesne tabanlı programlamadan söz edeceğiz." name="description" />
<meta content="python, python3, nesne, oop, sınıf, class, miras alma, inheritance, nesne yönelimli programlama, nesne tabanlı programlama, object oriented programming, self, instantiation, instance, örnek, örneklendirme, örnekleme" name="keywords" />
<title>Nesne Tabanlı Programlama (Devamı) — Python 3 için Türkçe Kılavuz</title>
<link rel="stylesheet" href="_static/pyramid.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/language_data.js"></script>
<script src="_static/translations.js"></script>
<link rel="search" title="Ara" href="search.html" />
<link rel="next" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama7.html" />
<link rel="prev" title="Nesne Tabanlı Programlama (Devamı)" href="nesne_tabanli_programlama5.html" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="_static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head><body>
<div class='header'><a href='https://yazbel.com'>yazbel.com</a></div>
<ul class='navbar'>
<li><a href="#"><del>pdf desteği sonlanmıştır</del></a></li>
<li class="forum"><a href="http://forum.yazbel.com">forum</a></li>
</ul>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="N">sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama5.html" title="Nesne Tabanlı Programlama (Devamı)"
accesskey="P">önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Nesne Tabanlı Programlama (Devamı)</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body" role="main">
<div class="section" id="nesne-tabanli-programlama-devami">
<h1>Nesne Tabanlı Programlama (Devamı)<a class="headerlink" href="#nesne-tabanli-programlama-devami" title="Bu başlık için kalıcı bağlantı">¶</a></h1>
<div class="admonition warning">
<p class="admonition-title">Uyarı</p>
<p>Bu makale yoğun bir şekilde geliştirilmekte, içeriği sık sık
güncellenmektedir.</p>
</div>
<p>Geçen bölümde verdiğimiz bilgiler sayesinde miras alma konusunun temelini
oluşturan taban sınıf, alt sınıf ve türeme gibi kavramlarla birlikte <code class="docutils literal notranslate"><span class="pre">super()</span></code>
ve <cite>object</cite> gibi araçların ne olduğunu ve ne işe yaradığını da öğrendik.
Dolayısıyla artık miras alma mekanizmasına dair daha renkli, daha teşvik edici
örnekler verebiliriz. Böylece, belki de gözünüze ilk bakışta pek de matah bir
şey değilmiş gibi görünen bu ‘miras alma’ denen mekanizmanın aslında ne kadar
önemli bir konu olduğuna sizleri ikna edebiliriz.</p>
<p>Bu bölümde ayrıca geçen bölümlerde incelemeye fırsat bulamasak da nesne tabanlı
programlama kapsamında incelememiz gereken başka konuları da ele alacağız.</p>
<p>Nesne tabanlı programlamadan ilk bahsettiğimiz derste, nesne tabanlı programlama
yaklaşımının grafik arayüz tasarımı için biçilmiş kaftan olduğundan söz etmiştik
hatırlarsanız. Bu bölümde inceleyeceğimiz konuların bazılarını grafik arayüz
tasarımı eşliğinde anlatacağız. Grafik arayüz programlamanın bize sunduğu
düğmeli-menülü görsel programların, nesne tabanlı programlamaya ilişkin soyut
kavramları somut bir düzleme taşımamıza imkan tanıması sayesinde, nesne tabanlı
programlamaya ilişkin çetrefilli konuları daha rahat anlama fırsatı
bulacağız.</p>
<div class="section" id="tkinter-hakkinda">
<h2>Tkinter Hakkında<a class="headerlink" href="#tkinter-hakkinda" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Hatırlarsanız, önceki derslerimizde birkaç kez Tkinter adlı bir modülden söz
etmiştik. Tkinter, Python kurulumu ile birlikte gelen ve pencereli-menülü modern
programlar yazmamızı sağlayan grafik arayüz geliştirme takımlarından biridir.</p>
<p>Tkinter bir standart kütüphane paketi olduğu için, Python programlama dilini
kurduğunuzda Tkinter de otomatik olarak kurulur<a class="footnote-reference superscript" href="#id2" id="id1">1</a>.</p>
<p>Elbette Python’da grafik arayüzlü programlar yazmamızı sağlayacak tek modül
Tkinter değildir. Bunun dışında PyQt, PyGI ve Kivy gibi alternatifler de
bulunur. Ancak Tkinter’in öteki alternatiflere karşı en büyük üstünlüğü hem
öbürlerine kıyasla çok daha kolay olması hem de Python’la birlikte gelmesidir.
PyQt, PyGI ve Kivy’yi kullanabilmek için öncelikle bunları bilgisayarınıza
kurmanız gerekir. Ayrıca Tkinter dışındaki alternatifleri kullanarak yazdığınız
programları dağıtırken, bu arayüz kütüphanelerini kullanıcılarınızın
bilgisayarına ya kendiniz kurmanız ya da kullanıcılarınızdan bu
kütüphaneleri kurmasını talep etmeniz gerekir.</p>
<p>Ben size, ilerde başka arayüz takımlarına geçiş yapacak da olsanız, Tkinter’i
mutlaka öğrenmenizi tavsiye ederim. Hem nesne tabanlı programlama hem de grafik
arayüz geliştirme kavramlarını öğrenmek açısından Tkinter son derece uygun bir
ortamdır.</p>
<p>Biz bu bölümde Tkinter modülünü kullanarak, prosedürel programlama, nesne
tabanlı programlama, sınıflar, miras alma ve nesne programlamaya ilişkin öteki
konular üzerine ufak tefek de olsa bazı çalışmalar yapacağız. Bu çalışmalar
sayesinde bir yandan öğrendiğimiz eski konulara ilişkin güzel bir pratik yapma
imkanı bulacağız, bir yandan Tkinter’in çalışmalarımızın sonucunu görsel bir
şekilde izleme imkanı sağlaması sayesinde nesne tabanlı programlamanın
çetrefilli kavramlarını anlamamız kolaylaşacak, bir yandan da ilk kez gördüğümüz
kodları anlama ve bunlar hakkında fikir yürütme kabiliyeti kazanacağız. Yani bir
taşla tamı tamına üç kuş vurmuş olacağız…</p>
</div>
<div class="section" id="prosedurel-bir-ornek">
<h2>Prosedürel Bir Örnek<a class="headerlink" href="#prosedurel-bir-ornek" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Başta da söylediğimiz gibi, nesne tabanlı programlama, grafik arayüzlü
programlar geliştirmek için son derece uygun bir programlama yaklaşımıdır. Zaten
kendi araştırmalarınız sırasında da, etraftaki grafik arayüzlü programların
büyük çoğunluğunun nesne tabanlı programlama yaklaşımıyla yazıldığını
göreceksiniz. Biz de bu derste vereceğimiz Tkinter örneklerinde sınıflı yapıları
kullanacağız. Ancak dilerseniz Tkinter’in nasıl bir şey olduğunu daha kolay
anlayabilmek için öncelikle nesne tabanlı yaklaşım yerine prosedürel yaklaşımı
kullanarak birkaç küçük çalışma yapalım. Zira özellikle basit kodlarda,
prosedürel yapıyı anlamak nesne tabanlı programlama yaklaşımı ile yazılmış
kodları anlamaktan daha kolaydır. Ancak tabii ki kodlar büyüyüp karmaşıklaştıkça
sınıflı yapıları kullanmak çok daha akıllıca olacaktır.</p>
<p>O halde gelin isterseniz Tkinter modülünü nasıl kullanacağımızı anlamak için,
bir metin dosyası açıp içine şu kodları yazalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tkinter</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Bu kodları herhangi bir Python programı gibi kaydedip çalıştırdığınızda boş bir
pencerenin açıldığını göreceksiniz. İşte böylece siyah komut satırından renkli
grafik arayüze geçiş yapmış oldunuz. Hadi hayırlı olsun!</p>
<p>Gördüğünüz gibi, bu kodlarda sınıfları kullanmadık. Dediğimiz gibi, ilk etapta
Tkinter’i daha iyi anlayabilmek için sınıflı yapılar yerine prosedürel bir
yaklaşımı benimseyeceğiz.</p>
<p>Burada öncelikle Tkinter modülünü içe aktardığımıza dikkat edin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span>
</pre></div>
</div>
<p>Modülü bu şekilde içe aktardığımız için, modül içindeki nitelik ve metotlara
erişmek istediğimizde modülün adını kullanmamız gerekecek. Mesela yukarıda
modülün adını kullanarak, <cite>tkinter</cite> modülü içindeki <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfını
örnekledik:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span> <span class="o">=</span> <span class="n">tkinter</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
</pre></div>
</div>
<p>Dilerseniz içe aktarma işlemini şu şekilde yaparak işlerimizi biraz daha
kolaylaştırabiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
</pre></div>
</div>
<p>Böylece <cite>tkinter</cite> modülünün nitelik ve metotlarına ‘tkinter’ yerine ‘tk’
önekiyle erişebiliriz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
</pre></div>
</div>
<p>Yukarıdaki kodları yazdığımızda, yani <cite>tkinter</cite> modülünün <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfını
örneklediğimiz anda aslında penceremiz oluştu. Ancak bu pencere örnekleme ile
birlikte oluşmuş olsa da, Tkinter’in iç işleyişi gereği, ‘ana döngü’ adlı bir
mekanizma çalışmaya başlamadan görünür hale gelmez. İşte bu özel ana döngü
mekanizmasını çalıştırmak ve böylece oluşturduğumuz pencereyi görünür hale
getirmek için, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıf örneklerinin <code class="docutils literal notranslate"><span class="pre">mainloop()</span></code> adlı bir metodunu
çalıştıracağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfını <cite>pencere</cite> adıyla örnekledikten sonra <code class="docutils literal notranslate"><span class="pre">Tk()</span></code>
sınıfının <code class="docutils literal notranslate"><span class="pre">mainloop()</span></code> adlı metoduna <cite>pencere</cite> örneği üzerinden eriştik.</p>
<p>Bu ana döngü mekanizmasının benzerlerini Tkinter’in dışındaki öbür grafik arayüz
tasarım araçlarında da göreceksiniz.</p>
<p>Bu arada, yukarıdaki prosedürel örnekte bile, biz istemesek de sınıflarla
muhatap olduğumuza dikkatinizi çekmek isterim. Çünkü kullandığımız <cite>tkinter</cite>
modülünün kendisi halihazırda birtakım sınıflardan oluşuyor. Dolayısıyla bu
modülü içe aktardığımızda, kodlarımızın içine pek çok sınıfı ister istemez dahil
etmiş oluyoruz. Esasında sırf bu durum bile, grafik arayüzlü programlarda neden
nesne tabanlı programlamanın tercih edildiğini gayet güzel gösteriyor bize.
Neticede, kullandığımız harici kaynaklardan ötürü her şekilde sınıflarla ve
nesne tabanlı yapılarla içli dışlı olacağımız için, kendi yazdığımız kodlarda da
nesne tabanlı yapılardan kaçmamızın hiçbir gerekçesi yok.</p>
<p>Neyse… Biz konumuza dönelim…</p>
<p>Yukarıda Tkinter modülünü kullanarak boş bir pencere oluşturduk. Gelin
isterseniz bu boş pencere üzerinde birtakım değişiklikler yapalım.</p>
<p>Öncelikle <cite>tkinter</cite> modülümüzü içe aktaralım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
</pre></div>
</div>
<p>Şimdi bu modülün <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> adlı sınıfını örnekleyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
</pre></div>
</div>
<p>Böylece penceremizi oluşturmuş olduk. Tkinter’le verdiğimiz ilk örnekte de
gördüğünüz gibi, Tkinter’le oluşturulan boş bir pencere öntanımlı olarak 200
piksel genişliğe ve 200 piksel yüksekliğe sahip olacaktır. Ancak isterseniz,
<code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfının <code class="docutils literal notranslate"><span class="pre">geometry()</span></code> adlı metodunu kullanarak, pencere boyutunu
ayarlayabilirsiniz (<code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfının hangi metotlara sahip olduğunu görmek
için <code class="docutils literal notranslate"><span class="pre">dir(pencere)</span></code> komutunu verebileceğinizi biliyorsunuz):</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">geometry</span><span class="p">(</span><span class="s1">'200x70'</span><span class="p">)</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Kendi yazdığımız sınıflardaki nitelik ve metotlara nasıl erişiyorsak, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code>
sınıfının nitelik ve metotlarına da aynı şekilde eriştiğimize dikkat edin.
Neticede bizim yazdıklarımız da sınıftır, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> da sınıftır. <code class="docutils literal notranslate"><span class="pre">Tk()</span></code>
sınıfının bizimkilerden tek farkı, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfının Python geliştiricilerince
yazılmış olmasıdır. Yazarları farklı olsa da bütün sınıflar aynı kurallara
tabidir. Dolayısıyla ilgili sınıfı kullanabilmek için önce sınıfımızı
örnekliyoruz, ardından da bu sınıf içinde tanımlı olan nitelik ve metotlara
noktalı gösterim tekniğini kullanarak ulaşıyoruz. Burada da <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıf
örneklerinin <code class="docutils literal notranslate"><span class="pre">geometry()</span></code> metodunu kullanarak 200x200 yerine 200x70
boyutlarında bir pencere oluşturduk:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span><span class="o">.</span><span class="n">geometry</span><span class="p">(</span><span class="s1">'200x70'</span><span class="p">)</span>
</pre></div>
</div>
<p>Şimdi bu boş pencereye bir etiket bir de düğme ekleyelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">geometry</span><span class="p">(</span><span class="s1">'200x70'</span><span class="p">)</span>
<span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Tamam'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Burada <cite>tkinter</cite> modülünün <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfına ek olarak, aynı modülün <code class="docutils literal notranslate"><span class="pre">Label()</span></code>
ve <code class="docutils literal notranslate"><span class="pre">Button()</span></code> adlı iki sınıfını daha kullandık. <code class="docutils literal notranslate"><span class="pre">Label()</span></code> sınıfı etiketler,
<code class="docutils literal notranslate"><span class="pre">Button()</span></code> sınıfı ise düğmeler oluşturmamızı sağlıyor. Bu sınıfların örnekleri
üzerinde çalıştırdığımız <code class="docutils literal notranslate"><span class="pre">pack()</span></code> metodunu ise, etiket ve düğmeleri pencere
üzerine yerleştirmek için kullanıyoruz.</p>
<p><code class="docutils literal notranslate"><span class="pre">Label()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Button()</span></code> sınıflarının <cite>text</cite> adlı bir parametre aldığını
görüyorsunuz. Bu parametrenin değeri, etiket veya düğmenin üzerinde ne
yazacağını gösteriyor.</p>
<p>Bu kodları da tıpkı başka Python programlarını çalıştırdığınız gibi
çalıştırabilirsiniz.</p>
<p>Bu arada, Tkinter’de bir şeyi oluşturmanın ve görünür hale getirmenin iki farklı
işlem gerektirdiğine özellikle dikkat edin. Mesela üzerinde ‘Merhaba Zalim
Dünya’ yazan bir etiket oluşturmak için şu kodu kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu etiketi pencere üzerine yerleştirmek, yani görünür hale getirmek için ise şu
komutu kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
</pre></div>
</div>
<p>Aynı şekilde bir düğme oluşturmak için de şu komutu kullanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Tamam'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
</pre></div>
</div>
<p>Böylece üzerinde ‘Tamam’ yazan ve tıklandığında pencereyi kapatan bir düğme
oluşturmuş oluyoruz. Düğmenin üzerine tıklandığında ne olacağını <code class="docutils literal notranslate"><span class="pre">Button()</span></code>
sınıfının <cite>command</cite> parametresi aracılığıyla belirledik. Bu parametreye,
<cite>pencere</cite> örneğinin <code class="docutils literal notranslate"><span class="pre">destroy()</span></code> metodunu verdiğimizde pencereye kapatma
sinyali gönderilecektir. Yalnız bu metodu yazarken parantez işaretlerini
kullanmadığımıza dikkat edin. Eğer metodu <code class="docutils literal notranslate"><span class="pre">pencere.destroy()</span></code> şeklinde
parantezli bir biçimde yazarsak, kapatma komutu daha düğmeye basmadan çalışacak
ve bu durumda düğmemiz düzgün işlemeyecektir.</p>
<p>Tıpkı etikette olduğu gibi, düğmemizi de pencere üzerine yerleştirmek, yani
görünür hale getirmek için <code class="docutils literal notranslate"><span class="pre">pack()</span></code> metodundan yararlanıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
</pre></div>
</div>
<p>Bunun, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfı ile <code class="docutils literal notranslate"><span class="pre">mainloop()</span></code> metodu arasındaki ilişkiye benzediğine
dikkatinizi çekmek isterim: Tıpkı <code class="docutils literal notranslate"><span class="pre">pack()</span></code> metoduna benzer bir şekilde,
<code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfı yardımıyla da bir pencere oluşturduktan sonra, bu pencerenin
görünür hale gelebilmesi için <code class="docutils literal notranslate"><span class="pre">mainloop()</span></code> metodunu çalıştırmamız gerektiğini
hatırlıyorsunuz.</p>
<p>Bu kodlarda Tkinter’e ilişkin ayrıntılardan ziyade, sınıflı yapıları kodlarımıza
nasıl dahil ettiğimize ve bunları nasıl kullandığımıza odaklanmanızı istiyorum.
Gördüğünüz gibi, <cite>tkinter</cite> modülünden içe aktardığımız <code class="docutils literal notranslate"><span class="pre">Tk()</span></code>, <code class="docutils literal notranslate"><span class="pre">Label()</span></code> ve
<code class="docutils literal notranslate"><span class="pre">Button()</span></code> gibi sınıfların metot ve niteliklerini, mesela tıpkı karakter
dizilerinin metot ve niteliklerini kullanır gibi kullanıyoruz.</p>
<p>Yukarıdaki örnekte, <cite>tkinter</cite> modülünün sınıflarını, kodlarımız içine prosedürel
olarak dahil ettik. Yani her sınıfı, belli bir sıraya göre kodlarımız içinde
belirtip, bunları adım adım çalıştırdık. Prosedürel programlamada kodların
yazılış sırası çok önemlidir. Bunu kanıtlamak için çok basit bir örnek verelim:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">çıkış</span><span class="p">():</span>
<span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">çıkış</span><span class="p">)</span>
<span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="n">çıkış</span><span class="p">)</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Burada her zamanki gibi öncelikle gerekli modülü içe aktardık:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
</pre></div>
</div>
<p>Daha sonra <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfı yardımıyla penceremizi oluşturduk:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
</pre></div>
</div>
<p>Ardından <code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> adlı bir fonksiyon tanımladık:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">çıkış</span><span class="p">():</span>
<span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
</pre></div>
</div>
<p>Bu fonksiyon, pencere kapatılırken hangi işlemlerin yapılacağını belirliyor.
Buna göre, programdan çıkılırken sırasıyla şu işlemleri gerçekleştiriyoruz:</p>
<ol class="arabic simple">
<li><p>Etiketin <cite>text</cite> parametresini ‘Elveda zalim dünya…’ olarak değiştiriyoruz.</p></li>
<li><p>Düğmenin <cite>text</cite> parametresini ‘Bekleyin…’ olarak değiştiriyoruz.</p></li>
<li><p>Düğmenin <cite>state</cite> parametresini ‘disabled’ olarak değiştirerek düğmeyi basılamaz
hale getiriyoruz.</p></li>
<li><p>2000 milisaniye (yani 2 saniye) sonra ise <code class="docutils literal notranslate"><span class="pre">pencere.destroy()</span></code> komutunu
işleterek pencerenin kapanmasını sağlıyoruz.</p></li>
</ol>
<p><code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonunu tanımladıktan sonra <code class="docutils literal notranslate"><span class="pre">Label()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Button()</span></code>
düğmeleri aracılığıyla etiket ve düğmelerimizi oluşturuyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">çıkış</span><span class="p">)</span>
<span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
</pre></div>
</div>
<p>Buna göre, düğmeye basıldığında, <cite>command</cite> parametresinin değeri olan
<code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonu çalışmaya başlayacak ve fonksiyon gövdesinde
tanımladığımız işlemler gerçekleşecek.</p>
<p>Bildiğiniz gibi, bir program penceresinde, o programı kapatmayı sağlayacak
düğmelerin yanı sıra, bir de en üst sağ (veya sol) köşede program penceresini
kapatan bir ‘X’ düğmesi bulunur. İşte bu ‘X’ düğmesine basıldığında da pencere
kapanmadan önce <code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonunun çalışması için şu kodu yazıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="n">çıkış</span><span class="p">)</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">protocol()</span></code> de tıpkı <code class="docutils literal notranslate"><span class="pre">geometry()</span></code> gibi, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfının metotlarından
biridir. Bu metodu <cite>WM_DELETE_WINDOW</cite> argümanıyla birlikte kullanarak, pencere
üzerindeki ‘X’ düğmesine basıldığında neler olacağını tanımlayabiliyoruz.</p>
<p>Son olarak da ana döngü mekanizmasını çalıştırıyoruz ve penceremizi görünür hale
getiriyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Bu prosedürel kodları tekrar önümüze alalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">çıkış</span><span class="p">():</span>
<span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">çıkış</span><span class="p">)</span>
<span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="n">çıkış</span><span class="p">)</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>En başta da söylediğimiz gibi, bu kodlarda, satır sıraları çok önemlidir. Mesela
burada düğmeyi oluşturan kodlarla <code class="docutils literal notranslate"><span class="pre">pencere.protocol()</span></code> kodlarının çalışması
için bunların mutlaka <code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonu tanımlandıktan sonra yazılması
gerekir. Eğer bu kodları şöyle yazarsanız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="n">çıkış</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">çıkış</span><span class="p">():</span>
<span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="n">pencere</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">çıkış</span><span class="p">)</span>
<span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>… programınız çalışmayacaktır.</p>
<p>Bu durum, programcıyı, istediği kod düzenini oturtmak konusunda epey kısıtlar.
Ama eğer nesne tabanlı programlama yaklaşımını kullanırsak kod akışını
belirlerken daha özgür olabiliriz. Ayrıca prosedürel yaklaşımda kodlar büyüdükçe
programınızın çorbaya dönme ihtimali nesne tabanlı programlama yaklaşımına göre
daha fazladır. Ancak elbette nesne tabanlı programlama yaklaşımını kullanmak tek
başına düzgün ve düzenli kod yazmanın teminatı değildir. Nesne tabanlı
programlama yaklaşımını kullanarak da gayet sebze çorbası kıvamında kodlar
yazabilirsiniz. En başta da söylediğimiz gibi, nesne tabanlı programlama bir
seçenektir. Eğer istemezseniz, nesne tabanlı programlama yaklaşımını kullanmak
zorunda değilsiniz. Ama elinizde böyle bir imkanınız olduğunu ve başkalarının da
bu yaklaşımdan yoğun bir şekilde faydalandığını bilmek çok önemlidir.</p>
</div>
<div class="section" id="sinifli-bir-ornek">
<h2>Sınıflı Bir Örnek<a class="headerlink" href="#sinifli-bir-ornek" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bir önceki başlıkta Tkinter’i kullanılarak prosedürel bir kod yazdık. Peki acaba
yukarıdaki kodları nesne tabanlı olarak nasıl yazabiliriz?</p>
<p>Dikkatlice bakın:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="k">class</span> <span class="nc">Pencere</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">çıkış</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">Pencere</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Bu kodlarda gördüğünüz bütün satırları anlayacak kadar nesne tabanlı programlama
bilgisine sahipsiniz. Ama gelin biz yine de bu kodları sizin için tek tek ve
tane tane açıklayalım.</p>
<p>Öncelikle <cite>tkinter</cite> modülünü <cite>tk</cite> adıyla içe aktarıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
</pre></div>
</div>
<p>Daha sonra <code class="docutils literal notranslate"><span class="pre">Pencere()</span></code> adlı sınıfımızı tanımlamaya başlıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Pencere</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">):</span>
<span class="o">...</span>
</pre></div>
</div>
<p>Burada öncelikle <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfını miras aldığımıza dikkat edin. Bu sayede bu
sınıfın içindeki bütün nitelik ve metotları kendi uygulamamız içinden
çağırabileceğiz.</p>
<p>Penceremiz oluşur oluşmaz pencere üzerinde bir etiket ile bir düğme olmasını
planlıyoruz. Pencere oluşur oluşmaz işletilecek kodları tanımlamak için bir
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metoduna ihtiyacımız olduğunu biliyorsunuz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Pencere</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="o">...</span>
</pre></div>
</div>
<p>Ancak kendi <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodumuzu tanımlarken, <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfının kendi
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodundaki işlemleri de gölgelemememiz lazım. Dolayısıyla
orijinal <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodunu kendi <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodumuza aktarmak için
<code class="docutils literal notranslate"><span class="pre">super()</span></code> fonksiyonundan yararlanacağız:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Pencere</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
</pre></div>
</div>
<p>Artık taban sınıfın <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodunu kendi tanımladığımız alt sınıfın
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu içinden özelleştirmeye başlayabiliriz. Öncelikle şu satırı
yazıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">protocol()</span></code> metodunun öntanımlı davranışı, pencerenin ‘X’ düğmesine
basıldığında programı sonlandırmaktır. İşte biz bu öntanımlı davranışı
değiştirmek için <code class="docutils literal notranslate"><span class="pre">protocol()</span></code> metodunu içeren kodu tekrar tanımlıyoruz ve
‘X’ düğmesine basıldığında <code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonunun çalışmasını sağlıyoruz.</p>
<p>Daha sonra normal bir şekilde etiketimizi ve düğmemizi tanımlıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="bp">self</span><span class="o">.</span><span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
</pre></div>
</div>
<p>İki farklı yerde atıfta bulunduğumuz <code class="docutils literal notranslate"><span class="pre">çıkış()</span></code> fonksiyonumuz ise şöyle:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">çıkış</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
</pre></div>
</div>
<p>Son olarak da şu kodları yazıp programımızı tamamlıyoruz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">pencere</span> <span class="o">=</span> <span class="n">Pencere</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Elbette zevkler ve renkler tartışılmaz, ancak ben yukarıdaki kodları, prosedürel
kodlara göre çok daha düzgün, düzenli, anlaşılır ve okunaklı bulduğumu, bu
kodlara baktığımda, programı oluşturan parçaların prosedürel kodlara kıyasla
daha yerli yerinde olduğunu düşündüğümü söylemeden de geçmeyeceğim…</p>
<p>Eğer siz aksini düşünüyorsanız sizi prosedürel yolu tercih etmekten alıkoyan
hiçbir şeyin olmadığını da bilin. Ancak tabii ki bu, nesne tabanlı
programlamadan kaçabileceğiniz anlamına da gelmiyor! Unutmayın, bu yaklaşımı siz
kullanmasanız da başkaları kullanıyor.</p>
</div>
<div class="section" id="coklu-miras-alma">
<h2>Çoklu Miras Alma<a class="headerlink" href="#coklu-miras-alma" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Python’da bir sınıf, aynı anda birden fazla sınıfı da miras alabilir. Eğer
yazdığınız bir uygulamada birden fazla taban sınıftan nitelik ve metot miras
almanız gerekirse bunu şu şekilde gerçekleştirebilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">Sınıf</span><span class="p">(</span><span class="n">taban_sınıf1</span><span class="p">,</span> <span class="n">taban_sınıf2</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Bu şekilde hem <cite>taban_sınıf1</cite> hem de <cite>taban_sınıf2</cite>’de bulunan nitelik ve
metotlar aynı anda <cite>Sınıf</cite> adlı sınıfa dahil olacaktır.</p>
<p>Ufak bir örnek verelim. Diyelim ki elimizde şu sınıflar var:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">c1</span><span class="p">:</span>
<span class="n">sn1</span> <span class="o">=</span> <span class="s1">'sn1'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön1</span> <span class="o">=</span> <span class="s1">'ön1'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm1</span> <span class="o">=</span> <span class="s1">'öm1'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm1</span>
<span class="k">class</span> <span class="nc">c2</span><span class="p">:</span>
<span class="n">sn2</span> <span class="o">=</span> <span class="s1">'sn2'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön2</span> <span class="o">=</span> <span class="s1">'ön2'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm2</span> <span class="o">=</span> <span class="s1">'öm2'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm2</span>
<span class="k">class</span> <span class="nc">c3</span><span class="p">:</span>
<span class="n">sn3</span> <span class="o">=</span> <span class="s1">'sn3'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön3</span> <span class="o">=</span> <span class="s1">'ön3'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön3</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot3</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm3</span> <span class="o">=</span> <span class="s1">'öm3'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm3</span>
</pre></div>
</div>
<p>Burada üç farklı sınıf ve her bir sınıfın içinde de birer sınıf niteliği, birer
<code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu, birer örnek niteliği ve birer örnek metodu görüyoruz.</p>
<p>Şimdi bu üç sınıfı birden taban sınıf olarak miras alan dördüncü bir sınıf
tanımlayalım:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">c4</span><span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">,</span> <span class="n">c3</span><span class="p">):</span>
<span class="k">pass</span>
</pre></div>
</div>
<p>Burada, taban sınıf vazifesi görecek sınıfların adını <code class="docutils literal notranslate"><span class="pre">c4</span></code> sınıfının
parantezleri arasına tek tek yerleştirdiğimize dikkat edin. Bu şekilde <code class="docutils literal notranslate"><span class="pre">c1</span></code>,
<code class="docutils literal notranslate"><span class="pre">c2</span></code> ve <code class="docutils literal notranslate"><span class="pre">c3</span></code> adlı sınıfları aynı anda miras almış oluyoruz. İşte bu
mekanizmaya Python’da çoklu miras alma (<em>multiple inheritance</em>) adı veriliyor.</p>
<p>Tek bir sınıfı miras aldığınızda hangi kurallar geçerliyse, birden fazla sınıfı
miras aldığınızda da temel olarak aynı kurallar geçerlidir. Ancak çoklu miras
almada birden fazla sınıf söz konusu olduğu için, miras alınan sınıfların da
kendi aralarında veya başka sınıflarla nitelik ve/veya metot alışverişi yapması
halinde ortaya çıkabilecek beklenmedik durumlara karşı dikkatli olmalısınız.
Ayrıca çoklu miras alma işlemi sırasında, aynı adı taşıyan metotlardan yalnızca
birinin miras alınacağını da unutmayın.</p>
<p>Örneğin:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">c1</span><span class="p">:</span>
<span class="n">sn1</span> <span class="o">=</span> <span class="s1">'sn1'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön1</span> <span class="o">=</span> <span class="s1">'ön1'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm1</span> <span class="o">=</span> <span class="s1">'öm1'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm1</span>
<span class="k">def</span> <span class="nf">ortak_metot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">om</span> <span class="o">=</span> <span class="s1">'ortak metot_c1'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">om</span>
<span class="k">class</span> <span class="nc">c2</span><span class="p">:</span>
<span class="n">sn2</span> <span class="o">=</span> <span class="s1">'sn2'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön2</span> <span class="o">=</span> <span class="s1">'ön2'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön2</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm2</span> <span class="o">=</span> <span class="s1">'öm2'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm2</span>
<span class="k">def</span> <span class="nf">ortak_metot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">om</span> <span class="o">=</span> <span class="s1">'ortak metot_c2'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">om</span>
<span class="k">class</span> <span class="nc">c3</span><span class="p">:</span>
<span class="n">sn3</span> <span class="o">=</span> <span class="s1">'sn3'</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ön3</span> <span class="o">=</span> <span class="s1">'ön3'</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ön3</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">örn_metot3</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">öm3</span> <span class="o">=</span> <span class="s1">'öm3'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">öm3</span>
<span class="k">def</span> <span class="nf">ortak_metot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">om</span> <span class="o">=</span> <span class="s1">'ortak metot_c3'</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">om</span>
<span class="k">class</span> <span class="nc">c4</span><span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">,</span> <span class="n">c3</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
</pre></div>
</div>
<p>Burada, aynı adı taşıyan <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> ve <code class="docutils literal notranslate"><span class="pre">ortak_metot()</span></code> adlı metotlardan
yalnızca biri miras alınacaktır. Bunlardan hangisinin miras alınacağını az çok
tahmin etmişsinizdir. Evet, doğru bildiniz. Miras alma listesinde hangi sınıf
önde geliyorsa onun metotları miras alınacaktır:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="n">s</span> <span class="o">=</span> <span class="n">c4</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">ortak_metot</span><span class="p">())</span>
</pre></div>
</div>
<p>Gördüğünüz gibi, <code class="docutils literal notranslate"><span class="pre">c4()</span></code> sınıfı önce <code class="docutils literal notranslate"><span class="pre">c1</span></code> sınıfını miras aldığı için hep
<code class="docutils literal notranslate"><span class="pre">c1</span></code> sınıfının metotları öncelik kazanıyor.</p>
<p>Eğer sınıfları <code class="docutils literal notranslate"><span class="pre">class</span> <span class="pre">c4(c2,</span> <span class="pre">c3,</span> <span class="pre">c1):</span></code> şeklinde miras alsaydık, bu kez de
<code class="docutils literal notranslate"><span class="pre">c2</span></code> sınıfının metotları öncelik kazanacaktı.</p>
<p>Elbette, Python’ın sizin için belirlediği öncelik sırası yerine kendi
belirlediğiniz öncelik sırasını da dayatabilirsiniz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">c4</span><span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">,</span> <span class="n">c3</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">c2</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">ortak_metot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">c3</span><span class="o">.</span><span class="n">ortak_metot</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
</pre></div>
</div>
<p>Burada <code class="docutils literal notranslate"><span class="pre">c2</span></code> sınıfının <code class="docutils literal notranslate"><span class="pre">__init__()</span></code> metodu ile <code class="docutils literal notranslate"><span class="pre">c3</span></code> sınıfının
<code class="docutils literal notranslate"><span class="pre">ortak_metot</span></code>’una miras önceliği verdik.</p>
</div>
<div class="section" id="dahil-etme">
<h2>Dahil Etme<a class="headerlink" href="#dahil-etme" title="Bu başlık için kalıcı bağlantı">¶</a></h2>
<p>Bir sınıftaki nitelik ve metotları başka bir sınıf içinde kullanmanın tek yolu
ilgili sınıf veya sınıfları miras almak değildir. Hatta bazı durumlarda, miras
alma iyi bir yöntem dahi olmayabilir. Özellikle birden fazla sınıfa ait nitelik
ve metotlara ihtiyaç duyduğumuzda, çoklu miras alma yöntemini kullanmak yerine,
dahil etme (<em>composition</em>) denen yöntemi tercih edebiliriz.</p>
<p>Peki nedir bu dahil etme denen şey? Adından da anlaşılacağı gibi, dahil etme
yönteminde, taban sınıfın nitelik ve metotlarını miras almak yerine, alt sınıf
içine dahil ediyoruz. Esasında biz bunun örneğini görmüştük. Şu kodu
hatırlıyorsunuz:</p>
<div class="highlight-py3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="k">class</span> <span class="nc">Pencere</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="s1">'WM_DELETE_WINDOW'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Label</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Merhaba Zalim Dünya'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s1">'Çık'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">çıkış</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">çıkış</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">etiket</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Elveda zalim dünya...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'text'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'Bekleyin...'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">düğme</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'disabled'</span>
<span class="bp">self</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="n">pencere</span> <span class="o">=</span> <span class="n">Pencere</span><span class="p">()</span>
<span class="n">pencere</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
</div>
<p>Burada aynı anda hem miras alma hem de dahil etme yönteminden yararlanıyoruz.
İlk önce <code class="docutils literal notranslate"><span class="pre">Tk()</span></code> sınıfını miras aldık. Böylece bu sınıfın nitelik ve
metotlarına doğrudan erişim elde ettik. Etiket ve düğme oluşturmamızı sağlayan
<code class="docutils literal notranslate"><span class="pre">Label()</span></code> ve <code class="docutils literal notranslate"><span class="pre">Button()</span></code> sınıflarını ise <code class="docutils literal notranslate"><span class="pre">Pencere()</span></code> sınıfımız içine dahil
ettik. Böylece bu sınıfların nitelik ve metotlarına sırasıyla <cite>self.etiket</cite> ve
<cite>self.düğme</cite> adları altında erişim kazandık.</p>
<p>Miras alma ve dahil etme yöntemleri arasında tercih yaparken genel yaklaşımımız
şu olacak: Eğer yazdığımız uygulama, bir başka sınıfın türevi ise, o sınıfı
miras alacağız. Ama eğer bir sınıf, yazdığımız uygulamanın bir parçası ise o
sınıfı uygulamamıza dahil edeceğiz.</p>
<p>Yani mesela yukarıdaki örnekte temel olarak yaptığımız şey bir uygulama
penceresi tasarlamaktır. Dolayısıyla uygulama penceremiz, <code class="docutils literal notranslate"><span class="pre">tk.Tk()</span></code> sınıfının
doğrudan bir türevidir. O yüzden bu sınıfı miras almayı tercih ediyoruz.</p>
<p>Pencere üzerine etiket ve düğme yerleştirmemizi sağlayan <code class="docutils literal notranslate"><span class="pre">Label()</span></code> ve
<code class="docutils literal notranslate"><span class="pre">Button()</span></code> sınıfları ise, uygulama penceresinin birer parçasıdır. Dolayısıyla
bu sınıfları uygulamamızın içine dahil ediyoruz.</p>
<p>Yukarıda anlattığımız iki farklı ilişki türü ‘olma ilişkisi’ (<em>is-a
relationship</em>) ve ‘sahiplik ilişkisi’ (<em>has-a relationship</em>) olarak
adlandırılabilir. Olma ilişkisinde, bir sınıf ötekinin türevidir. Sahip olma
ilişkisinde ise bir sınıf öteki sınıfın parçasıdır. Eğer iki sınıf arasında
‘olma ilişkisi’ varsa miras alma yöntemini kullanıyoruz. Ama eğer iki sınıf
arasında ‘sahiplik ilişkisi’ varsa dahil etme yöntemini kullanıyoruz.</p>
<p class="rubric">Dipnotları:</p>
<dl class="footnote superscript">
<dt class="label" id="id2"><span class="superscript"><a class="fn-backref" href="#id1">1</a></span></dt>
<dd><p>GNU/Linux dağıtımlarında, dağıtımı geliştiren ekip genellikle
Tkinter paketini Python paketinden ayırdığı için, Tkinter’i ayrıca kurmanız
gerekebilir. Eğer Python’ın etkileşimli kabuğunda <code class="docutils literal notranslate"><span class="pre">import</span> <span class="pre">tkinter</span></code> komutunu
verdiğinizde bir hata mesajı alıyorsanız <a class="reference external" href="https://forum.yazbel.com/">https://forum.yazbel.com/</a>
adresinden yardım isteyin. Eğer Windows kullanıyorsanız, böyle bir probleminiz
yok. Python’ı kurduğunuz anda Tkinter de emrinize amadedir.</p>
</dd>
</dl>
</div>
</div>
<div class='glyph'><a href='https://yazbel.com'>♣</a></div>
<div class='extrarelbar'>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
>sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama5.html" title="Nesne Tabanlı Programlama (Devamı)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Nesne Tabanlı Programlama (Devamı)</a></li>
</ul>
</div> </div>
<div class='addcomment'>Yorumlar</div>
<div class='how-to-use'>
<h3>Önemli Not</h3>
Eğer yazdığınız yorum içinde kod kullanacaksanız, kodlarınızı
<span class='tag'><pre><code></span> etiketleri içine alın. Örneğin:
<pre>
<span class='tag'><pre><code class="python"></span>
<span class='keyword'>print</span>(<span class='string'>"Merhaba Dünya!"</span>)
<span class='tag'></code></pre></span>
</pre>
</div>
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES * * */
var disqus_shortname = 'istihza';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
<script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-4eca48eb2d83faf9" async="async"></script>
<div class="clearer"></div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Gezinti</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="nesne_tabanli_programlama7.html" title="Nesne Tabanlı Programlama (Devamı)"
>sonraki</a></li>
<li class="right" >
<a href="nesne_tabanli_programlama5.html" title="Nesne Tabanlı Programlama (Devamı)"
>önceki</a> |</li>
<li class="nav-item nav-item-0"><a href=".">⌂</a></li>
<li class="nav-item nav-item-this"><a href="">Nesne Tabanlı Programlama (Devamı)</a></li>
</ul>
</div>
<div class="footer">
© Copyright 2007-2020, Fırat Özgül | <a href="https://yazbel.com">yazbel.com</a>.
Son güncelleme: 08.08.2020.
<a href="http://sphinx-doc.org/">Sphinx</a> 3.2.0 kullanılarak oluşturuldu.
<br>
<br>
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"><img
alt="Creative Commons License" style="border-width:0"
src="https://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png" /></a><br />
<br>
</div>
<!-- Start of StatCounter Code for Default Guide -->
<script type="text/javascript">
var sc_project=10396326;
var sc_invisible=1;
var sc_security="fb5cd679";
var scJsHost = (("https:" == document.location.protocol) ?
"https://secure." : "http://www.");
document.write("<sc"+"ript type='text/javascript' src='" +
scJsHost+
"statcounter.com/counter/counter.js'></"+"script>");
</script>
<noscript><div class="statcounter"><a title="hit counter"
href="http://statcounter.com/" target="_blank"><img
class="statcounter"
src="http://c.statcounter.com/10396326/0/fb5cd679/1/"
alt="hit counter"></a></div></noscript>
<!-- End of StatCounter Code for Default Guide -->
</body>
</html>