Uygulama 7 | Mini Tarayıcı

tkinter konusunu anlatırken basit bir tarayıcı yapacağımdan bahsetmiş, ben yapana kadar sizin denemenizi istemiştim.

Bir geri dönüş olmadı ama ben yine de yaptım. Bu uygulamada bunu göreceğiz. Kullanıcı, girdi yerine bir URL girecek, biz de oraya gitmeyi deneyeceğiz.

Bunun için ilk önce bazı modülleri import etmemiz lazım. Sırasıyla;

from tkinter import *

from tkinter import messagebox

import requests

import webbrowser as web

Her şeyden önce bir tkinter objesi oluşturmamız ve penceremizi dizayn etmemiz lazım. Bunun için oldukça temel olan tkinter komutlarını veriyorum. Burada pek detaya girmeyeceğim çünkü anlatacak bir tarafları yok.

Şimdi, bir adet Entry() objesi oluşturmamız lazım çünkü kullanıcıdan URL bilgisi alacağız.

Bence güzel oldu. Entry() objesini, getURL isimli bir değişkene verdim. Sonrasında getURL.place() diyerek objemi hoşuma giden bir noktaya yerleştirdim.

Şimdi, bu Entry() objesinin yanına veya altına bir buton koymamız lazım. Kullanıcı, Entry() objesine bir URL girdiğinde butona tıklayarak sorgu yapabilmeli. Bu yüzden bir Button() objesi oluşturuyorum.

searchButton isimli bir değişken içerisinde Button() objemi oluşturdum ve bunu, place() fonksiyonu sayesinde Entry() objesinin hemen yanına yerleştirdim.

Bu noktada isterseniz bir Label() objesi oluşturup uygun bir noktaya isminizi de yerleştirebilirsiniz. Ancak ben sade olması taraftarıyım.

Şimdi, buraya dikkat edelim. Kullanıcı, URL bilgisini girip butona tıkladığında o URL adresine gitmemiz lazım. Bunun için, Button() yani searchButton objesine command= diyerek bir fonksiyon tanımlamamız lazım.

Denemelerimi yaparken blog-cyberworm.com ile https://blog-cyberworm.com ifadelerinin ayrı ayrı ele alındığını, https:// başlığı olmadan girilen URL adresinin hatalara yol açtığını gördüm. O yüzden birazdan yazacağımız fonksiyonlarda bunu dikkate almamız gerekiyor.

withProtocol() isimli bir fonksiyon açıyorum ve içerisine, kullanıcının Entry() içerisine girdiği girdiyi tutan kodu yazdım. Hatırlayacağınız üzere get() fonksiyonu, değer tutucu bir fonksiyondu ve buradaki kodda getURL için girilen değeri, getTheURL değişkeninde tutuyoruz. Artık işlemlerimiz getTheURL değişkeni çevresinde gerçekleşecek.

Şimdi, webbrowser modülü ile girilen bu URL adresine yani getTheURL değişkeninin tuttuğu değere gitmemiz lazım. Ancak gitmeden önce, URL adresinin erişilebilir olup olmadığını da bilmemiz lazım. O yüzden ilk önce o URL adresine bir requests.get() isteği atmamız ve isteğin cevabının 200 OK olması koşulunda URL adresine gitmemiz lazım.

15. satırda bunu gerçekleştiriyoruz. URL adresine bir GET Request atıyoruz ve bunun döndürdüğü değeri response isimli bir değişkende saklıyoruz. Sonrasında if response.ok: ifadesi ile URL adresinin 200 OK cevabını döndürmesi yani URL adresinin erişilebilir olması durumunda web.open(getTheURL) diyoruz ve URL adresini açıyoruz. Eğer response değeri ok değil ise kullanıcıya messagebox ile bir uyarı gösteriyoruz.

Son olarak, biraz önce oluşturduğumuz butona, bu fonksiyonu tanıtmamız lazım.

Fonksiyonu butona gömdükten sonra kodu deneyebiliriz.

https:// ile birlikte yazdığımızda sorunsuz bir şekilde çalışıyor. Bir de artık yayında olmayan eski sitemizi aramayı deneyelim.

Eski sitemizin adresini verdiğimizde uyarı mesajının geldiğini görüyoruz. Çünkü site gerçekten de çalışmıyor.

Aynı kodlar ile https:// başlığı olmadan bir URL girmeyi denerseniz hata alırsınız. Bu yüzden bu sorunu da aşmamız lazım. Ne de olsa kullanıcı https:// yazmak zorunda değil. O yüzden bir fonksiyon daha açıyorum.

Biraz önceki withProtocol() fonksiyonumuz, kullanıcının https:// başlığıyla hareket etmesini kontrol ediyordu. Şimdi, withoutProtocol() fonksiyonumuz ise kullanıcının https:// başlığını yazmaması durumunu kontrol edecek. Dolayısıyla fonksiyonun içerisine bu başlığı bir argüman olarak verdim (protocol="https://"). Bu, kullanıcıdan alınacak bir parametredir. Ayrıca fonksiyonun içerisinde, biraz önce yaptığımız gibi get() fonksiyonunu kullandık. Bu sayede kullanıcının Entry() kısmına gireceği değer, getTheURL isimli değişkende tutulacak.

Şimdi, kullanıcının Entry() kısmına girdiği URL içerisinde https:// olup olmadığını öğrenmemiz ve ona göre işlemler yapmamız lazım.

Bunun için fonksiyona verdiğim argümanı kullanıyorum ve if protocol not in getTheURL diyorum. Bunun Türkçe karşılığı şöyledir: "Eğer fonksiyona verdiğim protocol değeri getTheURL değişkeni içinde yoksa...".

Bu koşulun sağlanması durumunda fstring yapısını kullanarak protocol ile kullanıcının verdiği URL adresini birleştiriyoruz. Burada, kullanıcı eğer blog-cyberworm.com yazarsa biz arka planda bunu https://blog-cyberworm.com diye aratıyoruz. Yani kullanıcının haberi olmadan onun hata almamasını, gerekli sorguyu yapabilmesini sağlıyoruz.

Normalde https:// başlığı olmadan girilen URL adresleri bize hata veriyordu. İşte, kullanıcı böyle bir şey yaparsa biz arka planda bu hatayı düzeltiyoruz ve URL adresine https:// başlığını ekleyerek bir GET Request atıyoruz.

Peki, eğer URL içinde https:// varsa ne olacak? Biz zaten bunun için biraz önce withProtocol() şeklinde bir fonksiyon tanımladık ve içerisine, URL adresinin normal bir şekilde yani https:// başlığı ile girilmesi dahilinde işlemler gerçekleştirdik, URL adresini açtık. O zaman bu noktada else: bloğu açıp bu fonksiyonu çağırabiliriz diye düşünüyorum.

Koddaki iki fonksiyonu da okursanız aslında bütün olayın withoutProtocol() fonksiyonunda olduğunu görüyoruz. Ancak biz, Button() objesine withProtocol() fonksiyonunu tanımlamıştık.

Butona tıkladığımızda withProtocol() fonksiyonu çalışacak. Ancak kullanıcının, https:// başlığını girmemesi dahilinde withoutProtocol() fonksiyonu devreye girmeyecek. Çünkü onu tetikleyen hiçbir şey yok.

Bu yüzden Button() objeme, withProtocol() fonksiyonu yerine withoutProtocol() fonksiyonunu gömüyorum. Bu sayede butona tıklandığında ilk önce https:// başlığı kontrol edilecektir. Eğer başlık varsa sorun yoktur, URL açılır ama başlık yoksa withProtocol() fonksiyonu çağırılacaktır. Bir zincir gibi hepsini birbirine bağladık ve bence güzel bir algoritma çalışması oldu.

Buton işini de hallettiğimize göre withoutProtocol() fonksiyonuna geri dönebiliriz. https:// başlığı mevcut değilse onu biz ekliyoruz. Ancak henüz bir işlem yapamadık. Yani bu fonksiyon pek de işe yaramayan bir yapıda. O yüzden başlık ile URL adresini birleştirdikten sonra buna bir istek atmamız, cevabın 200 OK olarak gelmesi durumunda da URL adresini açmamız gerekiyor.

Kodu alıp deneyebilir, geliştirebilirsiniz. Örneğin site ile alakalı birkaç seçenek sunun. Bu seçenekler arasında kaynak kodunu çekmek, post isteği atmak gibi özellikler olsun. Bunları da bir Radiobutton ile yapıp arama ile seçenekleri gruplamak adına Frame kullanabilirsiniz. Hatta "Gelişmiş" şeklinde bir buton yapıp o butona tıklandığında yeni bir pencere açabilirsiniz. Bu pencerenin içinde de az önce sözüne ettiğim özellikleri ekleyebilirsiniz. Her şey hayal gücünüze kalmış. Sevgiler.

Kodun Kesintisiz Hâli


Yayınlanma Tarihi: 2022-12-12 22:15:12

Son Düzenleme Tarihi: 2022-12-19 17:51:26