Hesap Kaydetme Sistemi - NO CopyPaste

  • Konuyu açan Konuyu açan cosion
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 210

cosion

MT Üye
MT Üye
Mesaj
191
Çözümler
12
Beğeni
203
Puan
754
Ticaret Puanı
0

Hesap Kayıt Sistemi.​

Selam arkadaşlar basit bir konu paylaşmak istedim. Bilen kişiler için oldukça basit olsa da yeni başlayanlar için rehber olması niteliğinde bir konu olmasını istedim. Kendim araştırırken bu şekilde temiz bir anlatım bulamamıştım. Çünkü hepsi Copy-Paste ile anlatılan şeyler. Benim buradaki amacım bu algıyı kırıp herhangi bir şey eklerken basit dahi olsa ne işe yaradığını bilerek eklemek. Bundan sonra vakit buldukça bu şekilde bazı konuları açıklayarak paylaşmak istiyorum.

Örnek vermek gerekirse kullandığım login ekranı budur.
Linkleri görebilmek için giriş yap veya kayıt ol.
. Gördüğünüz gibi burada herhangi bir kayıt bulunmuyor, hali hazırda kayıt sistemi olan bir arayüzün sadece arka planın değiştirmekte işe yarardı ama dediğim gibi amaç burada öğrenmek.

Kod yazmadan önce:​

Evet her zaman kod yazılmadan
Linkleri görebilmek için giriş yap veya kayıt ol.
oluşturmalısın. Programlamaya yeni başladıysan bu kavramı zaten kod yazmadan önce öğreniyor olman gerekir, eğer daha önce duymadıysan yazılım öğrendiğin kaynağı değiştirmeni öneririm. Konuyu dağıtmadan devam edelim, hesap kayıt sistemi için neye ihtiyacımız var, programın amacı nedir vs.

  • Buton resmine ihtiyacımız var. ( metin2 de mouse hover efekti için 3 farklı görsel kullanılıyor bunlardan birazdan bahsedeceğim)
  • Kullanılan butonlar ->
    Linkleri görebilmek için giriş yap veya kayıt ol.
Peki hesap kayıt sisteminin tam olarak neler yapması gerekiyor ?
  • Login ekranına isteğe bağlı sayıda kayıt butonları eklenmeli
  • oyuncu id ve şifre girince kayıt butonuna basıp bilgilerini kaydet.
  • Login ekranı tekrar açıldığında kayıt butonlarının doğru yüklenmiş olması gerekiyor.
Dosyalarımızı hazırladıysak artık eklemeye başlayalım.
İlk olarak butonlarınızı pack içerisine atarak başlayalım. Metin2 dosya sistemi kendi konusunu hak eden bir konu fakat kısaca ne eklersek ekleyelim oyun ymir work klasörünü arıyor ve daha sonra bizim dosya yolumuza bakıyor.
  • ui->butonlar->login diye bir klasörümüz var butonlarımız burada olmalı dersek şu şekilde olmalı.
  • ui (pack dosyası) ui -> ymir work -> ui -> butonlar -> login -> (burada buton dosyalarımız).
  • root içerisinde ymir work , buranın içinde ui klasörü olupturup buraya atabilirsiniz.Önemli olan bu dosyaların ymir work - ui klasörleri altında olması.
Linkini bıraktığım login ekranından ilerleyeceğim fakat kendi ekranınızda da aynı adımları takip edebilirsiniz.
İlk olarak ekrana vereceğimiz mesajlarda ve bazı kontrollerde kullandığımız locale_game ve locale_interface eklemelerimizi yapalım.
locale_game.txt:
Genişlet Daralt Kopyala
NOID_OR_PASSWORD    You have to enter ID and Password
ACCOUNT_HAS_REGISTERED    Account saved
NO_DELETE_ACCOUNT    Nothing to delete
ACCOUNT_HAS_DELETED    Account removed
locale_interface.txt:
Genişlet Daralt Kopyala
PASSWORD_RESTART    Forgot my password
FREE    Empty
En alt satırda bir boşluk bırakmayı unutmayınız.
Düzenleme yapmamız gereken dosyalar : intrologin.py ve loginwindow.py

Gelin ilk önce basit olanı loginwindow.py içerisine yani açılan pencerede butonlarımızın konumlarını ayarlayalım.
loginwindow.py:
Genişlet Daralt Kopyala
        {
            "name" : "registerButton1",
            "type" : "button",
            "x" :10, "y" : 250,
            "default_image" : "d:/ymir work/ui/butonlar/login/accounts_button.tga",
            "over_image" : "d:/ymir work/ui/butonlar/login/accounts_button2.tga",
            "down_image" : "d:/ymir work/ui/butonlar/login/accounts_button.tga",
            "text" : uiScriptLocale.FREE,
      
            "children" : ( 
                            {
                                "name" : "deleteButton1",
                                "type" : "button",
                                "x" : 12,
                                "y" : 10,
                                "default_image" : "d:/ymir work/ui/butonlar/login/delete.tga",
                                "over_image" : "d:/ymir work/ui/butonlar/login/delete.tga",
                                "down_image" : "d:/ymir work/ui/butonlar/login/delete.tga",
                            },
                ),
        },

Challange olarak heman altına 2. butonu eklemenizi istiyorum. name kısımlarınıda değiştirmeyi unutmayın!

Konu başında bahsettiğimiz minik detaylardan biriside hover efektinin nasıl verildiğin, gördüğünüz gibi farklı resimler arasında geçiş yaparak bu efekti veriyoruz.

Şimdi size burada değinmem gereken minik bir konu var oda registerButton1 ismini verdiğimiz elementin kimin child'ı olduğu , eğer yanlış yere bunu eklerseniz ekran boyutu değiştirildiğinde butonlarınızın yeride ona göre değişir o yüzden doğru yere eklediğinizden emin olun.
Gelelim bu sisteme can verecek kodlarımıza o da intrologin.py içerisine eklenecek.

İlk önce butonlarımızı tanımlamamız gerekiyor,
intrologin.py:
Genişlet Daralt Kopyala
# Bul
def __LoadScript(self, fileName):

Challenge! Diğer tanımlamalara bakarak örneğin
intrologin.py:
Genişlet Daralt Kopyala
# Gördüğün gibi burada idEditLine tanımlanmış.
self.idEditLine = self.GetChild("id")

idEditLine intrologin.py içerisinde kullanılıyor ve "id" ise loginwindow.py dosyasındaki "name" : "id" değeri.
yapman gereken 2 adet tanımlama yapmak
1. registerButton1 ve registerButton2 tanımla ve bu loginwindow.py içerisinde eklediğimiz butona ait name değerini almalı
2. deleteButton1 ve deleteButton2tanımla , aynı şekilde bu loginwindow.py'da eklenen butona ait name değerini almalı


Umarım tanımlamalarını güzelce yapabilmişsindir. Eğer yapamadıysan işte cevaplar bu şekilde olmalıydı.
intrologin.py:
Genişlet Daralt Kopyala
self.registerButton1         = self.GetChild("registerButton1")
self.registerButton2         = self.GetChild("registerButton2")
          
self.deleteButton1          = self.GetChild("deleteButton1")
self.deleteButton2          = self.GetChild("deleteButton2")
Bir adet kayıt kullansaydık buna ihtiyacımız olmayacaktı fakat birden fazla kayıt olacağından ek olarak tüm butonları içinde barındıran bir dictionary oluşturacağız.

Hemen butonların altına ekleyebiliriz. Eğer kendin yapabilirsen çok iyi yapamazsanda hemen self.deleteButton2 alt satırına bunu ekleyebilirsin.
intrologin.py:
Genişlet Daralt Kopyala
self.registerButtons        = {1 : self.registerButton1, 2 : self.registerButton2 }

1. key 1. butona, 2. key 2. butonumuza referans ediyor.

Şimdi sırada bu butonlarımızın istediğimiz şekilde çalıştırmak var. Peki bu adımlar nedir ne tür fonksiyonlar ( method ) yazmalıyız ?
  1. Fonksiyonumuz butona tıkladığımızda id ve şifre alanındaki bilgileri kayıt edecek.
  2. Fonksiyonumuz ise delete butonumuza basınca kayıtlı bilgileri silecek.
  3. Fonksiyonumuz ise client açıldığında daha önceden kayıt ettiğimiz hesaplar var ise onları yüklediğinden emin olacak.
Şimdi gelin birlikte bu işlemlerin nasıl yapıldığına bakalım.
def Connect(self, id, pwd): bulunur ve altına eklenir :
intrologin.py:
Genişlet Daralt Kopyala
    def OnClickRegisterButton(self, cosion):
        import os
        global RegisteredID
        global RegisteredPassword
        buttonText = self.registerButtons[cosion].GetText()
        if buttonText.find(uiScriptLocale.FREE) != -1:
            id = self.idEditLine.GetText()
            pwd = self.pwdEditLine.GetText()
            if id == "" or pwd == "":
                self.PopupNotifyMessage(localeInfo.NOID_OR_PASSWORD)
            else:
                if not os.path.exists('lib/savedaccounts/' + str(cosion) + '.cfg'):
                    open('lib/savedaccounts/' + str(cosion) + '.cfg' ,"w").write("|"+str(id)+'|'+str(pwd)+'|')
                    self.registerButtons[cosion].SetText(str(id))
                    self.PopupNotifyMessage(localeInfo.ACCOUNT_HAS_REGISTERED)
                else:
                    pass
        else:
            accountfile = open('lib/savedaccounts/' + str(cosion)+ '.cfg',"r")
            informations = (accountfile.read()).split("|")
            self.Connect(informations[1],informations[2])
            RegisteredID = informations[1]
            RegisteredPassword = informations[2]

Genel olarak neler yapıldığını az çok anlayabilirsiniz, copy paste yaparken tabi bunları atlıyoruz hep !
İlk olarak kayıt edilecek id ve şifre için 2 tane değişken oluşturuyoruz : RegisteredID ve RegisteredPassword daha sonra tıkladığımız butonun içindeki text'i buttonText içerisinde tutuyoruz.
Buton dolu ise id, boş ise Empty yazdırdık, burada ilk kontrolümüzü bununla gerçekleştiriyoruz. Eğer Boş ise burası çalışacak, eğer dolu ise else çalışacak ve zaten kayıt edilmiş bilgileri kullanacağız.

Eğer kayıt boş ise id ve şifre girdiğimiz kısımdaki bilgileri alıp id ve pwd içerisinde tutuyoruz, tabi burada oyuncu id veya şifreden bir tanesini boş bırakabilir bunuda kontrol etmemiz gerekiyor ve burada onu kontrol ediyoruz. Eğer id veya pwd birisi boş ise daha önce tanımladığımız mesajı ekrana yazdırıyoruz.

iki alanda dolu ise bir diğer kontrolümüz ilgili hesap daha önce oluşturulmuşmu onu kontrol ediyor ve dizinde dosya yoksa
open('lib/savedaccounts' + str(cosion) + '.cfg' , "w").write("|" + str(id) + "|" + str(pwd) + "|"
Burada hatırlasak en başta registerButtons diye butonların hepsini içeren dict oluşturduk ve 1. key buton1, 2. key buton2. Yani buton 1 basarsak burdaki cosion 1, 2. butona basarsak 2 değerini alır. Id test şifre 123 girersek. Elimize
lib/savedaccount klasöründe 1.cfg. İçerisinde ise |test|123| yazacaktır. Genel kayıt sistemi bu şekildedir.
hemen alt satırınca butonun textini girdiğimiz id yapıyoruz ve ekrana daha önceden eklediğimiz mesajı gönderiyoruz.

else:
pass kısmı eğer bu dosya oluşmuşsa çalışır ve hiç bir şey yapmaz.

ilk if kontrolümüz true dönmez ise yani eğer hesap zaten kayıtlı ise dosyamızı açıyoruz. Dosya içeriğini ayırıp bilgileri informations listesinde tutuyoruz.
Dosyamızda hali hazırda bulunan Connect fonksiyonuna bilgileri gönderiyoruz ve en son olarak tanımladığımız RegisteredID ve RegisteredPassword değişkenlerimizi dolduruyoruz.

Hesap ekleme işlemi tamamlandı, sıradaki işlemimiz ise varolan bilgileri deleteButton1 ve deleteButton2 ile silmek olacak.
intrologin.py:
Genişlet Daralt Kopyala
    def __OnClickdeleteButton(self, cosion):
        import os
        buttonText = self.registerButtons[cosion].GetText()
      
        if buttonText.find(uiScriptLocale.FREE) != -1:
            self.PopupNotifyMessage(localeInfo.NO_DELETE_ACCOUNT)
            return
        else:
            os.remove('lib/savedaccounts/'+str(cosion)+'.cfg')
            self.registerButtons[cosion].SetText(uiScriptLocale.FREE)
            self.PopupNotifyMessage(localeInfo.ACCOUNT_HAS_DELETED)

Buradaki işlemlerimiz daha basit.
İlk olarak tıklanan düğmenin textini buttonText içerisine alıyoruz.
Burada önemli tek kontrolümüz buton dolu mu boş mu ?
Eğer dolu ise sileceğiz boş ise silecek bir hesap yok mesajı göndereceğiz.

if kısmını anladığınızı varsayarak
else kısmında import os ile kullanabildiğimiz os.remove ile 1.cfg ve ya 2.cfg olan dosyamızı siliyoruz.
Butonun text'i Empty olarak değiştiriyoruz ve ekrana hesap silindi mesajı gönderiyoruz.

Son olarak clienti kapatıp tekrar açtığımızda dolu olan butonların yüklenebilmesi için update fonksiyonumuz var.
intrologin.py:
Genişlet Daralt Kopyala
    def OnUpdate(self):
        import os
        for i in range(1,3):
            if os.path.exists('lib/savedaccounts/' + (str(i)) + '.cfg'):
                accountfile = open('lib/savedaccounts/' + (str(i)) + '.cfg', "r")
                informations = (accountfile.read()).split("|")
                self.registerButtons[i].SetText(informations[1])
            else:
                self.registerButtons[i].SetText(uiScriptLocale.FREE)

Buraya kadar her şeyi anladıysanız burada neler olduğunu zaten anlamışsınızdır. Tek önemli nokta for döngüsünde kaç buton var ise burayı ona göre düzenleyin. 2 hesap varsa 1-3, 10 buton varsa 1-11. Hesap adlarını biz dictionary-key olarak verdiğimiz için sayılarla onları tekrar yükleyebiliyoruz. 1.cfg-2.cfg ... gibi

Eğer bu dosyalar var ise butonların text'ine id mizi yazıyor eğer yok ise FREE karşılğı olan Empty yazdırıyor.
Not : intrologin.py eklenen fonksiyonlarda OnUpdate güncelleyeceksiniz, register altınada delete fonksiyonu ekleyebilirsiniz.


Eğer GetText() ile ilgili bir error verirse ui.py dosyanız eksiktir. Bunu ekleyin.
ui.py:
Genişlet Daralt Kopyala
# ui.py açılır
# class Button içerisine en alta ekle

    def GetText(self):
        if not self.ButtonText:
            return ""
        return self.ButtonText.GetText()

Konunun sonuna geldik arkadaşlar, bu konu için kendinize challengeler belirleyebilirsiniz. Yeni buton dosyaları bulabilir onları kullanabilirsiniz, kendi sevdiğiniz bir tasarımda daha güzel ekranlar oluşturabilirsiniz.

Evet, aslında çok basit bir konu ve çoğu kişi bunu copy paste yaparak ve ya hazır alarak devam ediyor. Buradaki amacım minikte olsa öğrendiğim bir konuyu sizlerle paylaşmaktı. Yeni başlayan arkadaşlara yardımcı olabilirse ne mutlu bana. Bu tarz anlatımlı konular paylaşmaya devam edebilirim zaman buldukça.

Untitled.webp

Kodlar alıntıdır, amaç eklerken öğrenmektir.
 
Son düzenleme:
Geri
Üst