Herkese Merhabalar. İkinci açtığım konu ile sizlerleyim. Nasılsınız umarım iyisinizdir. Dertleri tasaları şöyle birkaç dakikalığına kenara atalım hazırsanız konuya geçelim.


Hepimiz zaman zaman kullandığımız programlardan çıkış yaparken üstte gördüğünüz gibi pencerelere maruz kalmışızdır. ve "Bu iletiyi bir daha gösterme" dediğimizde bu pencerenin bir daha çıktığına şahit olmamışızdır.
Hiç düşündünüz mü?
-Acaba bu nasıl yapılıyor ? Bende bunu yapabilir miyim?
Bu yazıdan sonra anlayacak ve deneyerek göreceksiniz ki yapabilceksiniz!
Önce kodu bırakıyorum daha sonra açıklamasını yapıcam:
Kodların daha okunabilirliği açısından method isimlendirmelerimi olabilidiğince Türkçe isim vermeye özen gösterdim. Şimdi yorum satırlarıyla açıklamalara geçiyorum...


Hepimiz zaman zaman kullandığımız programlardan çıkış yaparken üstte gördüğünüz gibi pencerelere maruz kalmışızdır. ve "Bu iletiyi bir daha gösterme" dediğimizde bu pencerenin bir daha çıktığına şahit olmamışızdır.
Hiç düşündünüz mü?
-Acaba bu nasıl yapılıyor ? Bende bunu yapabilir miyim?
Bu yazıdan sonra anlayacak ve deneyerek göreceksiniz ki yapabilceksiniz!
Önce kodu bırakıyorum daha sonra açıklamasını yapıcam:
Kodların daha okunabilirliği açısından method isimlendirmelerimi olabilidiğince Türkçe isim vermeye özen gösterdim. Şimdi yorum satırlarıyla açıklamalara geçiyorum...
Python:
import tkinter as tk # "tkinter" modülünü "tk" kısaltması ile kullanabilmek için projeye ekliyorum
from configparser import ConfigParser # "configparser" modülünden "ConfigParser" sınıfını çağırıyorum
import os # Dosya işlemleri yapacağımızdan os modülünü eklemekte yararlı buldum
#-------------------------------------------------------------------#
# #
# Başlangıç olarak okumaya "birinci_pencere" methodundan başlayalım #
# #
#-------------------------------------------------------------------#
__AUTHOR__ = "Helmsys" # kendimin yazdığı koda kendi adımı da yazmasam olmazdı =)
class Arayüz(tk.Tk): # Arayüz adında ve "tkinter" modülünden "Tk" sınıfını "parent class" olarak yani miras sınıf olarak aldım. Almasaydım daha da farklı yapabilirdik sınıfta kullanmayabilirdik ama daha düzenli gözükmesi açısından bunu böyle yapmak istedim
def __init__(self,cfg): # sınıf çağırıldığında çalışan ilk method "__init__" methodu. Birinci parametre olarak "self" pythonda sınıflarda ilk parametre her zaman belirlediğimiz birşey olmalı klasik self dedik
super(Arayüz,self).__init__() # super sınıfını kullanmamızın sebebi miras olarak aldığımız "Tk" sınıfını kullanabilmek için
self.cfg = cfg # "__init__" methoduna verdiğimiz ikinci paremetreyi "self.cfg" adındaki değişkene atadım artık dışarıdan değer alan sınıfımız bu değişken sayesinde çalışabilecek
if not os.path.exists("test.ini"): # burada dosya yolu belirtmedim siz belirtebilirsiniz. "eğer belirlenen dosya yok ise"
self.ayar() # self.ayar() methodunu çağır
self.birinci_pencere() # belirlenen dosya varsa else kullanmaya gerek kalmadan bu satıra geçerek "self.birinci_pencere()" methodunu.ağır
def ayar(self): # ".ini" dosyası oluşturmak için oluşturduğum bir method
with open("test.ini","w") as f: # "test.ini" adında dosyayı oluşturup "w" kipinde yanı yazma kipinde aç bunu "f" ile temsil et
self.cfg["CHECK_BUTON"] = {"Durum":"false"} # "__init__" methoduna verdiğimiz ikinci paremetreyi kullanıyoruz ( ["BAŞLIK"] = {"değer": "belirle"} )
self.cfg.write(f) # belirlediğimiz değeri bu oluşturduğumuz dosyaya yaz
def checkKontrol(self): # "self.checkButton" un tetiklediği method
if self.variable.get() == True: # eğer "self.checkButton"a tıklarsak
self.cfg.read("test.ini")# ".ini" dosyasını oku
if self.cfg["CHECK_BUTON"]["Durum"] == "false":# okunan "Durum" anahtarının değeri "false" ise
with open("test.ini","w") as g: # "test.ini" adında dosyayı oluşturup "w" kipinde yanı yazma kipinde aç bunu "g" ile temsil et
self.cfg.set("CHECK_BUTON","Durum","true") # durum anahtarının değerini "true" olarak değiştir
self.cfg.write(g) # bu değişikliği de dosyaya yaz
def birinci_pencere(self): # Bir arayüz oluşturmak için method tanımlıyorum
self.geometry("500x600") # Bu arayyüzün boyutunu 500'e 600 olarak ayarlıyorum
tk.Label(self,text="Ana menü",font=("arial",20,"bold")).pack() # Bir başlık oluşturuyorum
self.cfg.read("test.ini") # "__init__" methoduna verdiğimiz ikinci paremetredeki oluşturduğumuz ".ini" dosyasını okuyoruz
if self.cfg["CHECK_BUTON"]["Durum"] == "false": # okunan bu değerdeki "Durum" anahtarının değeri false ise
self.protocol("WM_DELETE_WINDOW",lambda: self.ikinci_pencere()) # pencereyi kapama tuşuna basıldığında "self.ikinci pencere" methodunu çağır
# lambda anahtar kelimesi tek satırlık fonksiyon yazmamıza yarar
# bu lambda fonksiyonu ile başka bir fonksiyonu çağırıyoruz çağırmamızın sebebi
# program başladığında oluşturduğumuz method çağırılmasın biz tıkladığımızda çağırılsın.
def ikinci_pencere(self): # ikinci bir pencere oluşturuyorum sorgu gösteren bir pencere
self.toplevel = tk.Toplevel() # dikkat ederseniz ana pencere değil alternatif bir pencere olduğu için "tk" olarak kısalttığım "tkinter" modülünden "Toplevel" snıfını kullandım
self.toplevel.geometry("290x110") # bu pencereyi 290'a 110 olarak ayarlayalım (bunlar pixelcinsinden yani "cm" gelmesin aklınıza)
self.variable = tk.BooleanVar() # bi alttaki değişkende tıklamanın değerini algılayabilmek için "True-False" değeri yani bool bir değer döndüren ayrı bir sınıfı çağırıyoruz
self.checkButton = tk.Checkbutton(self.toplevel,text="Bu pencereyi bir daha gösterme",font=("arial",9,"italic"),variable=self.variable,command=self.checkKontrol) # "variable" parametresine yazdığım argumana dikkat ederseniz üstteki değişkeni burada kullandığımı görebilirsiniz. tıklandığında çalışacak methodu da "command" parametresine arguman olarak verdim.
self.checkButton.place(x=20,y=80) # oluşturduğumuz alternatif arayüzde bir yere konumlandırdım
tk.Label(self.toplevel,text="Çıkmak istediğinizden eminmisiniz?",font=("arial",10,"italic")).pack() # kullanıcının bilgi sahibi olacağı bir "Label" tanımladık
self.okButton = tk.Button(self.toplevel,text="Evet",command=lambda: self.destroy()) # "evet"e basınca komple programdan çıkmak için bir buton oluşturuyorum. Bu işlemi yapması için "command" parametresine "self.destroy" argumanını gönderiyorum
self.okButton.place(x=250,y=40) # konumlandırıyorum
self.cancelButton = tk.Button(self.toplevel,text="Hayır",command=lambda: self.toplevel.destroy()) # çıkmak istemiyorsak "hayır" butonuna basarız ve yalnızca alternatif arayüzü kapatması için "command" parametresine "self.toplevel.destroy()" argumanını gönderdim
self.cancelButton.place(x=198,y=40) # konumlandırıyorum
if __name__ == "__main__":
config = ConfigParser() # ini dosyasını oluşturmak, işlem yapmak, vs.... için config adında bir örnek oluşturup ConfigParser sınıfını kullanıyorum
Arayüz(cfg=config).mainloop() # "__init__" methoduna verdiğimiz ikinci paremetreyi burada örneklediğimiz "config" örneklemesini/değişkenini arguman olarak veriyoruz. sonra mainloop diyerek bu işlerin görünür olmasını sağlıyoruz.
Kod ilk olarak çalıştığında ".py" dosyasının bulunduğu dizine "test.ini" adında bir dosya oluşturur.

Oluşturulduğunda değeri aşağıdaki gibi olur ve kapamak için "X" butonuna bastığımızda resimdeki gibi bir pencere açılır:


Bu durumda kutucuğu işaretlemeden çıkarsak birkez daha yaptığımız programı açıp kapatmaya kalktığımızda aynı pencere tekrar görünecek.
Kutucuğu işaretleyip çıkış yaparsak oluşturduğumuz ".ini" dosyasında şöyle bir değişiklik oluyor.


Oluşan bu değişiklik ile ilgili pencere bir daha gözükmüyor.
Umarım yardımcı ve yararlı olmuştur...

Oluşturulduğunda değeri aşağıdaki gibi olur ve kapamak için "X" butonuna bastığımızda resimdeki gibi bir pencere açılır:


Bu durumda kutucuğu işaretlemeden çıkarsak birkez daha yaptığımız programı açıp kapatmaya kalktığımızda aynı pencere tekrar görünecek.
Kutucuğu işaretleyip çıkış yaparsak oluşturduğumuz ".ini" dosyasında şöyle bir değişiklik oluyor.


Oluşan bu değişiklik ile ilgili pencere bir daha gözükmüyor.
Umarım yardımcı ve yararlı olmuştur...
Son düzenleme:


