Metin2 Python Pencereleri Birbirine Bağlama

Whistle

Ruhsuz :/
Kurucu
Geliştirici
Yardımsever Üye
Mesaj
11.941
Çözümler
567
Beğeni
13.659
Puan
5.915
Ticaret Puanı
2
Merhaba arkadaşlar,
Bugün anlatacağım konu ileri düzey arkadaşlar içindir. Kendi sistemlerini kodlayabilen, python kodlarını anlayabilenlere yöneliktir.

Bu konumuzda bir pencereye başka bir pencereyi nasıl bağlayabileceğimizi anlatacağım.

Bunun artıları şu şekilde;
  • Ana pencere açılmadan alt pencere açılmasını engelleyebilirsiniz.
  • Alt pencereden ana pencerenin modüllerine ulaşabilirsiniz.
  • Ana pencere üzerinden alt pencerenin verilerini hafızada tutabilirsiniz. (Örn: Envanterde belt (kuşak) kısmı açıkken envanteri açıp kapattığınızda eğer açıksa belt kısmı açık olarak gözükür.)
  • Ve daha fazlası size kalmış. :)

Mesela OrnekWindow.py adında bir dosyamız olsun. Bunun uiscript ile gerekli boyutunu filan ayarladık. Bunu anlatmıyorum tabiki.

Daha sonra 2 tane class olduğunu varsayalım. Bunların birisi AnaPencere diğeri AltPencere. Örnek kodlar;

Python:
Genişlet Daralt Kopyala
class AnaPencere(ui.ScriptWindow):
    wndAltPencereWindow = None

    def __init__(self):
        ui.ScriptWindow.__init__(self)
        self.isLoaded = 0
        self.LoadWindow()

Gördüğünüz gibi basit bir pencere başlatacısı kullandık. Sizlere bu konuda python ile pencere oluşturmayı anlatmıyorum. Pencereleri birbirine bağlama yöntemini anlatıyorum.
Daha sonra LoadWindow fonksiyonuna scriptten gelen verileri değişkenlere filan atıyorsunuz. Bunu geçiyoruz.
Bizim ilgileneceğimiz kısım şu;
C++:
Genişlet Daralt Kopyala
    def LoadWindow(self):
        if(self.isLoaded == 1):
            return
 
        self.isLoaded = 1

        self.wndAltPencereWindow = AltPencereWindow(self)

Burada fark ettiyseniz. AltPencereWindow'u bir değişkene atadım. Fakat bunu atarken ana penceremizin verileri bulunduğu bir self gönderdik. Eğer bağlamak istemeseydik. Şöyle yapardık.
C++:
Genişlet Daralt Kopyala
    def LoadWindow(self):
        if(self.isLoaded == 1):
            return
 
        self.isLoaded = 1

        self.wndAltPencereWindow = AltPencereWindow()

Daha sonra basit bir AltPencereWindow sınıfını oluşturalım.
Python:
Genişlet Daralt Kopyala
class AltPencereWindow(ui.ScriptWindow):
    def __init__(self, wndAnaPencere):
        import exception
        if not wndAnaPencere:
            exception.Abort("AnaPencere acmadan AltPencereyi acamazsiniz!")
            return

        ui.ScriptWindow.__init__(self)
        self.wndAnaPencere = wndAnaPencere

Gördüğünüz gibi. AltPencereWindow sınıfını otomatik çalıştıran __init__ fonksiyonuna wndAnaPencere diye bir şey ekledim. Bunun sebebi biz AnaPencere'de AltPencereWindow sınıfını çağırırken AnaPencere'nin verilerini gönderiyoruz. AltPencerede o verileri alıyor.
Python:
Genişlet Daralt Kopyala
AltPencereWindow(self)
Buradaki self tabiri. AltPencereWindow'daki __init__ fonksiyonuna wndAnaPencere değişkenine gidiyor. Zaten konuya bonus olarak şu kodu da ekledim.
Python:
Genişlet Daralt Kopyala
        if not wndAnaPencere:
            exception.Abort("AnaPencere acmadan AltPencereyi acamazsiniz!")
            return

Bu eğer ki kullanıcı bir şekilde AnaPencere'yi açmadan AltPencereyi açmaya çalıştığında. Metin2'nin syserr.txt dosyasına bunu yazar; "AnaPencere acmadan AltPencereyi acamazsiniz!"

Evet arkadaşlar bu konumuz bu şekilde bitmiştir. Buna dair sorularınız olursa belirtebilirsiniz.
Eğer bilmeyenler varsa Metin2 üzerine çook geniş çaplı eğitim seti hazırlıyorum. 5. Ünite'de ki videolara bakarak bu konuda anlatılanları anlayabilir ve kendi sistemlerinizi yazmayı öğrenebilirsiniz. :)
Eğitim serisine bakmak için: Metin2 Geliştirici Eğitimi Video Serisi
 
Son düzenleme:
bu ne işimize yaricak tam olarak ben anlayamadım da kb @Whistle

Örnek veriyorum;
Envanteri açtığınız belt kısmı var. Kemer taktıkça genişleyen yer. Orası açıkken Envanteri kapattığınız zaman oda kapanır. Şey gibi düşünün. Miras alma olayı. Üst sınıfın metod ve değişkenlerine erişebiliyoruz. Konuyu baştan sona dikkatlice okuyun. Yalnız bu kodlama yapabilen kullanıcılar için açılan konu. :)
 
Aynen şimdi anladım. Çekirdek kodlama düzenleme işlemleri bir nevi alt yapı düzenleme
güvenlik ve doğruluk optimizasyonları mantıken.
 
Sayılır. Buradaki amaç bir önceki sınıftan miras alma. PHP ile uğraşan kişiler için örnek;
PHP:
Genişlet Daralt Kopyala
<?php
class AnaClass
{
   /**
    * @return string
    */
   public function anaClassFonksiyonu()
   {
       return "Ben ana classta yer alan bir fonksiyonum."
   }
}

class AltClass extends AnaClass
{
   /**
    * @return string
    */
   public function testFonksiyon()
   {
       $this->anaClassFonksiyonu();
   }
}
?>

Yukarıdaki kodun çıktısı şu şekilde olur;
Kod:
Genişlet Daralt Kopyala
Ben ana classta yer alan bir fonksiyonum.

Bu konuda anlattığımda buna benzer bir şey. Üst sınıfın özelliklerini miras alıp alt sınıfta kullanabiliyoruz. :)
Lakin ben terimsel kelimeler kullanmak yerine pencereleri birbirine bağlamak yazdım.
Normalde terimsel olarak konu başlığı şu şekilde olabilirdi;
"Metin2 Python ile Miras Alma" gibi.

Metin2 root dosyalarını incelerseniz konuda gösterildiği bazı pencerelerin birbirine bağlandığını görebilirsiniz. :)

Python sınıf yapısı (nesne yönelimli programlama / oop) detaylı bilgi için şuraya göz atabilirsiniz:
Linkleri görebilmek için giriş yap veya kayıt ol.
 
Son düzenleme:
Geri
Üst