(Güncelleme bilinci ile oluşturduğunuz programlarınız için bu konu rehber niteliğinde olabilir!)
Uzun bir aradan sonra herkese merhaba.
Bugün ki konuda başlıktada görüldüğü üzere python programlama dili ile yazdığınız bir programı sonradan yaptığınız değişiklikler ile kullanıcıya nasıl indirtirsiniz ?
Elimden geldiğince bu sorunun cevabını vermeye çalışacağım.
Şimdi Mantığı kısaca açıklıyorum:
Bir .exe dosyamız var adı da "program.exe" (isim vermekte özgürsünüz.) bu dosyamız güncel olan bir dosya değil. Güncel olan .exe dosyasını githubda tutuyoruz.
Program ilk çalıştığında bulunduğu dizine bir txt dosyası oluşturuyor içeriğinde de 0.1 yazıyor.
Daha sonra "Güncelle" butonuna basınca güncelleme işlemi başlıyor. (arayüzün donmaması için threadler ekleyebilirsiniz, progress bar ekleyebilirsiniz.... tamamen size kalmış)
Son olarak önceki dosya siliniyor ve yeni bir klasöre dosyayı indirip açıyor. Ve böylelikle güncelleme işlemi bitmiş oluyor.
Bu arada güncelleştiğinin anlaşılması açısından yalnızca uygulamanın arayüzdeki başlık rengini değiştiriyorum. Yapacağınız değişiklikler tamamen sizin hayal gücünüze kalmış
Mantığını kavradığımıza ve hayal gücünüze bağlı olarak değiştirebilirsiniz uyarısını da aldıktan sonra github adresimizde bir repo oluşturalım.
• Oluşturduğumuz reponun içerisine bir adet txt (txt tercih ettim isteyen .ini, .json kullanabilir
• Oluşturduğumuz "version.txt" nin içerisine update sistemimizde kayıtlı olarak kullandığımız versiyondan yüksek olmak zorunda. Örneğin update sistemimizdeki ayarladığımız versiyon 0.1 ise githudaki "version.txt" içerisine bu sayıdan büyük bir sayı yazmalıyız.
• Sonra, öncesinde yeni sürüm olarak tanımladığımız uygulamamızı(exe dosyasını) githubdaki oluşturduğumuz reponun içerisine yüklüyoruz.
Artık githuba yükleme işlemimiz bitmiş bulunmakta.
Geriye python betiği yazmak kalıyor.
Hadi yazmaya başlayalım!
updater.py
Python:
import sys
import requests
import os
from getpass import getuser
class ConsoleColors: # Konsol ekranınıda kullandığım için ve cafcaflı gözükmesi için renk kodları barındıran bir sınıf tanımlayıp içerisine değişkenler tanımlayıp atamalarını yapıyorum
PURPLE = '\033[95m'
CYAN = '\033[96m'
DARKCYAN = '\033[36m'
BLUE = '\033[94m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
RED = '\033[91m'
BOLD = '\033[1m'
DEFAULT = '\033[0m'
color = ConsoleColors() # renk kodlarının bulunduğu sınıftan instance oluşturuyorum
class UpdateSystem: # güncelleme sisteminin bulunduğu sınıfı tanımlıyorum
def __init__(self) -> None:
self.local_version_path = f"C:\\Users\\{getuser()}\\Desktop\\Coding\\Dogaclama\\Chill\\guncelleme_sistemi\\local_version.txt" # bilgisayarımızda muhafaza ettiğimiz versiyon numaramızın bulunduğu txt dosyası
self.txtExistChecked() # txt dosyası yoksa içerisine 0.1 yazarak oluşturuyor
def txtExistChecked(self) -> None:
if not os.path.exists(self.local_version_path): # belirtilen yolda ilgili dosya yoksa
with open(self.local_version_path,"w") as f: # Dosyayı oluşturuyorum
f.write("0.1") # içeriğine yazıyorum
def updateChecked(self) -> None:
try:
os.system("cls") # terminal fazla kalabalık gözükmesin diye cls komutu yazdırıp ekranı temizliyorum
version_link = "https://raw.githubusercontent.com/Arif-Helmsys/guncelleme-sistemi/main/version.txt" # githubda bulunan versiyon.txt nin raw linki. Neden raw link, çünkü okuma işlemi yapabilmek için
r = requests.get(version_link) # raw linkine get işlemi yapıyorum
response_version = r.content.decode() # gelen veri byte türünde olduğundan onu decode ederek unicode karaktere dönüştürüyorum
with open(self.local_version_path,"r") as g: # ilgili yoldaki dosyayı okuma kipinde açıyorum
local_vers = g.read() # içeriğini okuyorum
if float(local_vers) < float(response_version): # okunan içerikler default olarak string olduğundan bunları floata çevirip karştırma işlemi yapıyorum
print(f"{color.BOLD}{color.GREEN}Güncel Değil Güncel Versiyon İndiriliyor...{color.DEFAULT}")
with open(self.local_version_path,"w") as f: # ilgili versiyon dosyasını yazma kipinde açıyorum
f.write(str(response_version)) # githubda yazan versiyon numarasını bilgisayarımızda oluşturduğumuz txt dosyasına yazdırıyorum
self.downloadNewExecute() # githubdaki güncel exe dosyamızı indiren methodu burada çağırıyorum
elif float(local_vers) > float(response_version): # Eğer bilgisayardaki versiyon numarası githubda yazılan versiyon numarasından büyük ise (ki bu mantıksal da bir hatadır)
raise TypeError(f"{color.RED}HATA! lokal değer Repodaki Değerden Büyük OLAMAZ!")
else: # githubdaki ve bilgisayardaki versiyonlar birbirine eşit ise
print(f"{color.CYAN}GÜNCEL!{color.DEFAULT}")
except FileNotFoundError: # dosya oluştuktan sonra silerseniz verecek hata sonucu uyarı metni verir ve yeniden dosyayı oluşturur
print(f"{color.PURPLE}Arayüz açıldıktan sonra lokal versiyonu dosyasını silme\nŞimdi 'Güncelle' butonuna yeniden bas{color.DEFAULT}")
with open(self.local_version_path,"w") as f:
f.write("0.1")
def downloadNewExecute(self) -> None:
new_dowload_link = "https://github.com/Arif-Helmsys/guncelleme-sistemi/raw/main/program.exe" # exe dosyasının indirme linki
r = requests.get(new_dowload_link, allow_redirects=True) # indirme işlemi
os.mkdir(f"C:\\Users\\{getuser()}\\Desktop\\Program_Is_Updated") # ilgili yola belirlediğim isimde klasör oluşturur
with open(f"C:\\Users\\{getuser()}\\Desktop\\Program_Is_Updated\\program.exe","wb") as exe: # bu klasöre exe dosyası indirilir
exe.write(r.content)
print(f"{color.BOLD}{color.YELLOW}Güncellendi{color.DEFAULT}")
os.startfile(f"C:\\Users\\{getuser()}\\Desktop\\Program_Is_Updated\\program.exe") # indirilen exe dosyası başlatılır
sys.exit(0) # program kapanır ve eski exe dosyası silinir.
Yaptığımız uygulamamız ise şöyle:
Python:
import tkinter as tk
from updater import UpdateSystem
class Window(tk.Tk):
def __init__(self) -> None:
super().__init__()
self.window()
def window(self):
upt = UpdateSystem()
self.geometry("300x300+300+300")
self.resizable(False,False)
self.configure(background="gray17")
self.lbl = tk.Label(self,text="Basit Program v0.1",foreground="white",background="gray17")
self.lbl.pack()
self.update_state = tk.Button(self,text="Güncelle",cursor="hand2",command= upt.updateChecked)
self.update_state.place(x=5,y=270)
if __name__ == "__main__":
win = Window()
win.mainloop()
Şimdi bitirmeden önce de belirtmek istiyorum; githuba attığımız güncel exe dosyamızın içeriğinde eski exe dosyamızı silmeye yarayan ufak bir koşul ifadesi bulunuyor bunun sayesinde de eski exe dosyamız silinmiş oluyor.
Dilim döndüğünce bilgim yettiğince zamanında "nasıl oluyor yahu" dediğim konuyu elimden geldiğince anlattım.
Okuduğunuz için teşekkür ediyorum.
Bir dahaki bilmem ney üzerine açacağım konuda görüşmek üzere!



