Güncelleme ile Arayüzde Değişiklik Nasıl Yapılır?

Öncelikle herkese merhaba iyi akşamlar…
Buna benzer olan Sürüm Güncellemeleri Nasıl Oluyor? adlı konumu açmıştım. Ve belirli bir modülle V0.1 diye adlandırdığımız sürümümüzü V1.0 Yapmanın yolunu bulduğumdan o konumu güncelleyip cevabını yazmıştım.
Fakat şimdi işin içinden çıkamadığım şöyle bir durum var. Biz şimdi sürümümüzü yükseltebiliyoruz iyi hoş da sürüm yükseldiğinde oluşturduğumuz arayüzde gözle görülür bir değişiklik olmasını ve bu değişikliğin kalıcı olmasını nasıl sağlarız. Sonuçta oluşturduğumuz güncelleme de gözle görülür bir değişiklik olmasını isteriz değil mi ? Hemen örnekle kafanızda canlanmasını sağlıyayım:

Bir tane arayüzümüz olsun (tabii ki tkinter kullanıyoruz), bu arayüzümüzün rengide atıyorum beyaz olsun. Yukarıda bahsettiğim durumları yaptık( sürümünü yükselttik) ve artık arayüzümüzün rengi (sayfa rengi) turuncu olmasını istedik.

Bu turuncu rengin kalıcı olmasını nasıl sağlayabiliriz. Yani programı açıp kapatsak dahi güncellediğimiz versiyonundan nasıl başlamalı ki, işlem uyguladığımız arayüzümüze yansısın ?
Teşekkür ediyorum şimdiden

Merhaba,

Bahsettiğiniz örnek üzerinden konuşmam gerekirse, arayüzün rengini belirleyen dosya hangisiyse bu dosyanın üzerine güncel dosya yazılmalı.

Hocam hatamı mazur görün ben örnek cümleme başlarken tkinter dememişim( düzeltiyorum hemen).
Üzerine yazılmalı dediğiniz kısımda program yeniden başladığında üzerine yazıldığı kısımdan itibaren nasıl başlayabilir. Bir ara hatırlarsanız “bunu bir daha gösterme” checkbox butonundan oluşan bir örnek (hatırlamadıysanız buyrun)program yazmıştınız. Ona benzer bir yöntemle mi dediğiniz şekilde “üzerine yazılmalı” söyleminizi yapmalıyım

Arayüzde “Güncelle” diye bir düğme olabilir. Bu düğmeye basınca atıyorum programın github reposundan python dosyaları alınıp, mevcut python dosyalarıyla karşılaştırılabilir. Eğer karşılaştırılan dosyalarda bir değişiklik varsa, ilgili dosyanın güncel hali dosyanın üzerine yazdırılır. Güncelleme tamamlandıktan sonra arayüz otomatik olarak kapatılıp yeniden başlatılır. Böylece program güncellenmiş olur.

Hocam merhaba tekrardan. Bu üzerine yazdırma da bir türlü örnek bulamıyorum internetten. Hep bu durumda gösteriliyor. Yani tamam metin belgelerinde işe yarıyordur ama iş .py uzantılı dosyaya geldiğinde nasıl oluyor. Belki en basit yöntemi forumdaki arkadaşlarında önerdiği eski sürümü sildirip yeni sürümü kullandırtma (bana çok manuel geliyor hocam) mükemmel bir yöntem. Ama nasıl Discord, Opera GX, vs.. bunlar gibi güncelleme yapabilirim derdindeyim (sürekli üst sürümünü yüklettirmeden misal: her seferinde farklı setup dosyası değilde var olan programlarının üstüne yazdırmayı…).

(ingilizcem de çok olmadığından ötürü yaşadığım sorunları google translateye yazıp aratıyorum)

Sizden rica etsem eğer zahmet olmazsa “Üstüne yazdırılır” hocam bunu bana somut olarak gösterebilir misiniz ?

Aynı oluyor. Verdiğiniz linkteki örnekleri kendi programınıza uyarlamayı denediniz mi?

Buyrun hocam Şöyle ekledim

import time
import AutoUpdate
import os
import urllib.error
from getpass import getuser
from tkinter import *

root = Tk()
root.geometry("300x300")
root.config(bg="gray17")

try:
    AutoUpdate.set_url("https://raw.githubusercontent.com/Arif-Helmsys/Testing/main/version.txt") # .txt dosyasının raw linki/raw link of the .txt file
    AutoUpdate.set_download_link("https://raw.githubusercontent.com/Arif-Helmsys/Testing/main/exp.py") # .txt dosyasını okuttuktan sonra indirmesini istediğimiz bir program
    AutoUpdate.set_current_version("0.1") # .txt ye yazdığınız mevcut sürüm dışında herhangi bir sürüm numarası yazabiliriz
    print(AutoUpdate.is_up_to_date()) # Üstte yazdığımız sürüm .txt de yazılan sürümle uyuşmuyorsa yani güncel değilse False, Güncel ise True olarak ekrana yazdırır

    if not AutoUpdate.is_up_to_date(): # Eğer güncel değil ise
        print("İndirme İşlemi Başlıyor...")
        time.sleep(1)
        print("indiriliyor...")
        print(AutoUpdate.get_latest_version()) # .txt de ki sürüm  numarasını okuyup ekrana yazdırıyor
        if not os.path.exists("C:\\Users\\"+getuser()+"\\Desktop\\Updater"): # Masaüstünde Updater klasörü yoksa
            print("Klasör Oluşturuldu")
            os.makedirs("C:\\Users\\"+getuser()+"\\Desktop\\Updater") # Masaüstüne Updater klasörünü oluştur
            AutoUpdate.download("C:\\Users\\"+getuser()+"\\Desktop\\Updater\\updater.py") # Oluşturulan klasöre updater adını verdiğimiz .py dosyasını indir
            with open("C:\\Users\\"+getuser()+"\\Desktop\\Updater\\updater.py","r+") as f: # linkten bakıp eklediğim kısım 1
                f.seek(0)
                f.truncate()

        else: # Şayet Böyle bir klasör varsa
            AutoUpdate.download("C:\\Users\\"+getuser()+"\\Desktop\\Updater\\updater.py") # updater adını verdiğimiz .py dosyasını Önceden var olan klasöre indir
            print("Klasör zaten var")
            with open("C:\\Users\\"+getuser()+"\\Desktop\\Updater\\updater.py","r+") as f: # linkten bakıp eklediğim kısım 2
                f.seek(0)
                f.truncate()

    elif AutoUpdate.is_up_to_date(): # Program Güncel ise
        print("Sürümünüz Güncel!")
except urllib.error.URLError:
    print("İnternet Bağlantınızı Kontrol Edin!")

mainloop()

Bu kod updater.py’nin içeriğini siliyor sanırım, verdiğiniz linkteki örneği eksik uygulamışsınız.

Hocam

        with open("C:\\Users\\" + getuser() + "\\Desktop\\Updater\\updater.py", "r+") as f:
            data = f.read()
            f.seek(0)
            f.write(data)
            f.truncate()

Şöyle değiştirdim. Sanırım herhangi bir değişiklik olmuyor veya yazdığım bu kod bloğunun bulunduğu kısım yanlış olabilir. Ya da kafamda oluşturduğum mantıkla çelişiyor. Kafamda üzerine yazıldıktan sonra komple attığım kod bloğunu çalıştırdığımda üzerine yazılan .py ın çalışması. Bunu gerçekleştirmek güç sanırım.

updater.py ise şöyle :

import tkinter as tk
def main():
    root = tk.Tk()
    root.geometry("300x300")
    tk.Label(root,text="Versiyon 1.0").pack()
    tk.mainloop()
main()

updater.py dosyası yeni indirdiğiniz dosya değil mi? Neden o dosyanın içeriğini değiştirmeye çalışıyorsunuz?

Bu kod dosyada hiçbir değişiklik yapmıyor, kullandığınız metotların ne işe yaradığını öğrenin.

Hayır hayır hocam, değiştirmeye çalışmıyorumm. aksine “üzerine yazdırılır” sözünü yapmaya çalışıyorum. Benim anlatmaya çalıştığım try ile başlayıp except ile biten kodları çalıştırdığımda sözde üstüne yazdırdığım updater.py dosyasını açmak.

Haklısınız bunları tekrar etmem gerekli saçmalamışım orada

updater.py yeni inen dosya, bir şeyin üstüne yazılacaksa bunun eski dosyalar olması lazım. Eski dosyaların üstüne yazmak istemiyorsanız updater.py’yi olduğu gibi çalıştırabilirsiniz. Eski dosyaların üstüne yazılacaksa niye updater.py üzerinde işlem yapılıyor anlayabilmiş değilim.

Hocam yaklaştık yavaştan aynı şeyleri düşündüğümüzü hissedebiliyorum bu sefer anlatabilicem :slight_smile:

işte bu dediğinizde en başta verdiğim kodlarda da farketmişsinizdir root=Tk() ile başlayıp gelişigüzel bir arayüz oluşturmuştum. Gelişigüzel olmasındaki amaç da güncellenince updater.py ile mi başlayacak, yoksa yine üstte belirttiğim kodda oluşturduğum gelişigüzel arayüzle mi. Aslında şunu demeye çalışıyorum hocam, Bu komutlar çalıştığında güncelliyor tamam ama birdahaki çalıştığında updater.py’da oluşturduğum arayüz nasıl bu yazdığım kodlara eklenir de her açılışında updater.py çalışır ?

Bu yazdığınız kodların bulunduğu dosya veya dosyaları uygun bir şekilde silip yerine updater.py dosyasını koymanız lazım.

Uzun bir zamandan sonra hortlattığım için kusuruma bakmayın :upside_down_face: . Bu kadar zaman belki yeterlimiydi veya fazlamıydı bilmiyorum ama güncelleme dendiğinde kafamda bir türlü kuramıyordum mantığını. Ama yeniden bazı şeylerin üstünden geçince “hee şimdii anladıımm” dememe vesile olduğunu söyleyebilirim.
Bu konunun başlığında da bahsettiğim gibi hem güncellemeyi hem de güncellendiğini anlamamız için arayüzün rengini değiştirmeyi başardım…
Sizlere teşekkür ediyorum bu konuda bana yardımcı açıklamalarda bulunduğunuz için.

Olurda diğer insanlar bu konu hakkında somut bir örneğe ihtiyaçları olur diye kodu sizlerle paylaşıyorum:
(Versiyonu değiştirdikçe güncelleniyor)

ana.py Güncelleme işleminin gerçekleştiği kısım

from urllib.request import urlopen
import sys
import os

def update():
    guncel_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/guncel_url.py"
    versiyon_url = "https://raw.githubusercontent.com/Arif-Helmsys/test/main/version.txt"
    __version__ = b'0.0.1\n'

    url1 = urlopen(url=guncel_url)
    url2 = urlopen(url=versiyon_url)
    version2 = url2.read()

    if __version__ == version2:
        print("Güncel")
    elif __version__ < version2:
        print("güncel değil\nGüncelleştiriliyor")
        with open("eski.py", "wb") as f:
            for i in url1:
                f.write(i)

        python = sys.executable
        os.execl(python, python, *sys.argv)

eski.py

from tkinter import *
import ana

def update():
    ana.update()

root = Tk()
root.geometry("330x220")
Button(root,text="Güncelle",command=update).pack()
root.config(bg="white")
root.mainloop()

Güncelleme olmadan önce
Adsız

Güncellendikten Sonra
Adsız

1 Beğeni