ZodiacMotion: Hareketli zodyak

Merhaba arkadaşlar,

Kullanıcı arayüzü Tkinter kütüphanesi ile yapılan ve kullanıcı tarafından girilen başlangıç ve bitiş tarihlerine ve bir saat dilimi içinde kalan enlem ve boylam değerlerine göre gezegenlerin zodyak çemberindeki konumlarını anlık olarak hesaplayan ve görüntüleyen bir programı sizlere tanıtmak isterim.

Programla ilgili söylemek istediklerimi sizlerle madde madde paylaşmak isterim.

  1. Geçerli olarak kabul edilebilecek tarihler datetime kütüphanesinin tarih aralığına göre belirlenir.

  2. Kullanıcı tarafından girilecek koordinatlar eğer bir saat dilimi içinde yer almıyorsa kullanıcı bir uyarı ile karşılaşır. Koordinatlar decimaldegree (float) birimindedir.

  3. Başlangıç tarihi, bitiş tarihinden sonra olacak şekilde yazılırsa kullanıcı bu durumla ilgili bir uyarı alır.

  4. Çalışma esnasında başlangıç tarihine eklenecek olan tarih artışı miktarı kullanıcı tarafından anlık olarak değiştirilebilir. Eğer kullanıcı program başlarken zaman artışı miktarını 0 olarak belirlerse, program kullanıcıya bir uyarı metni gösterir Program çalıştıktan sonra eğer zaman artışı miktarı 0 olarak belirlenirse, görüntülenen içerikte bir değişme olmaz. Zaman artışı miktarı 0 ile 3600 saniye arasında değişmektedir.

  5. Harita verilerinin değiştirilme süresi, diğer bir deyişle bekleme süresi yine kullanıcı tarafından belirlenebilir. Bekleme süresi 0 ile 10 saniye arasında değişmektedir.

  6. Farklı ev sistemlerine göre harita görüntülenebilir.

  7. Gezegenler arasında oluşacak açının tolerans miktarları değiştirilebilir.

Programı https://github.com/dildeolupbiten/ZodiacMotion adresinden temin edebilirsiniz. Gerekli modüller otomatik olarak kurulur ve kullanıcı programı çalıştırır çalıştırmaz kullanmaya başlayabilir. Bu program, tkinter kütüphanesiyle ilgilenen insanlara belki faydalı olabilecek kodlar sunmaktadır. Maalesef kodlar arasına yorum satırları eklemedim. Ama eğer sormak istediğiniz sorular olursa, bu soruları memnuniyetle cevaplarım.

Programla alakalı bir youtube linkini sizlerle paylaşmak istiyorum:

Görüş ve önerilerinizi duymaktan memnuniyet duyarım.

Herkese iyi günler.

6 Beğeni

Aha!
Ben bunu oturur izlerim :slight_smile:

Animasyonun double buffering’e ihtiyaci var gibi. Cizgiler tek tek cizilip silindiginde hareket (ve iki an arasindaki fark) tam belli olmuyor.

1 Beğeni

ZodiacMotion.py icin dogal ayrim:

SIGNS gibi ayarlar/sabitler bir dosyaya.
Zodiac class’i gibi arayuzden bagimsiz olarak hesap yapan kod bir dosyaya.
Tk kodu bir dosyaya.
Calistirma/modul yukleme bir dosyaya.

Bu arada calistirdigim bir Python kodu pip3 install filan yapmaya kalksa cildiririm.

Gereken modulleri requirements.txt'ye yazman ve kullanicidan pip install -r requirements.txt calistirmasini istemen gerekiyor. Illa kolaylik yapmak istiyorsan bunu install.bat, install.sh gibi dosyalarda yapman lazim. Hala tek dosyayla calismasini istiyorsan install_modules_and_run.py/bat/sh gibi bir dosya da yapabilirsin.

2 Beğeni

Double buffering hakkında pek bir bilgim yok maalesef. Çizgiler bazı koşullarda hareket ettiriliyor bazı koşullarda siliniyorlar. Çizgilerin oluşma ve hareket koşulu şöyle: Her bir açının kendi küre faktörü var. Mesela 90 derecelik açının ön-tanımlı küre faktörü ± 10°. Yani 90 derecelik açının çizgisi 80 derecede ilk defa oluşturulur, 100 dereceye kadar bu çizginin koordinatları değiştirilerek hareket ettirilir, yani tekrar oluşturulmaz. 100 dereceden sonra da bu çizgi silinir.

Artış miktarı düşük tutulduğunda, animasyon daha güzel görünüyor. :slight_smile:

Şu ana kadar dosya parçalamayı nedense pek tercih etmedim. Aslında daha düzenli oluyor, evet. Hatta bu uygulamayı yaparken öyle yapayım dedim. Sonra yine alışık olduğum düzene geri döndüm.

:slight_smile: Kullanıcı onu bir kere yapacak başka da yapmayacak :stuck_out_tongue: Şu ana kadar gereksinimleri hiç requirements.txt gibi bir dosyaya yazmadım, öğrenmedim de. Ama öğrenir, yaparım.

Canvasda nasıl çalışır tam bilemedim ama aklıma update metodunu bütün işlemleri yaptıktan sonra (hepsi için tek seferde) çağırmak geldi.

Zaten her harekette çağrılıyor.

Belki de istenen animasyonun bir parcasidir, ama benim gordugum iki potansiyel problem:

Cizgiler ayni anda degil, sirayla ciziliyorlar.
Iki degisik animasyon karesine ait cizgiler ayni anda gorulebiliyor.

Double buffering soyle calisiyor: Yeni cizimler gozukmeyen bir yere yapiliyor (offscreen buffer) (boylece ilk problem engelleniyor). Sonra goruntu kendi cizim alanini birakip az onceki gozukmeyen yeri kullanmaya basliyor (buffer swap) (boylece ikinci problem de engelleniyor).

Tk’de nasil olur bilemeyecegim; belki ayni widget’in ikinci bir kopyasi ile cozulur, belki ikinci bir cizim alani + blit fonksiyonuyla olur, belki de zaten destegi vardir.

:slight_smile: Mevcut bi standardini da bulamadim ama gordugum Python programlarinin tamamina yakini bu sekilde dagiliyor. Hatta easy_setup filan da kullaniyolar ama hic bulasmadim. requirements.txt pip ile cok guzel bulusuyor. Yakin zamana kadar dogrudan pip kullaniyordum, artik (bazi kutuphaneler sagolsun) virtualenv kullanmaya alistim. ~/.local/lib/python*'i daha bu sabah sildim (bin’i de temizleyemedim) cocuklar yerleri yeni temizledim, cikartin da girin. :crazy_face:

Kod bu sekilde bile kalsa gereken modulleri bir dosyaya yazmak iyi bir aliskanlik.

Hmm. Şöyle bir durum var: mesela x zamanında merkür ile ay arasında bir açı olmasın, x + y zamanında o anki konumlarına göre merkür ile ay arasında 10 orbluk bir kare açı oluşmaya başlıyor diyelim. x + z zamanında ise hareket devam ettiği için ay ile yükselen çizgisi arasında bir açı oluşmaya başlıyor olabilir. Ancak x + y ile x + z zamanları, zaman artışı miktarı yüksek olduğunda, biz bu zaman farklılığını bir saniye içinde sanki birbirine çok yakın zamanlarmış gibi görüyor olabiliriz ve bir açı oluştuktan 1 saniye sonra veya daha kısa sürelerde başka bir açının oluştuğunu görüyor olabiliriz. Mesela artış miktarı 3600 saniye olduğunda, biz bir saniye içinde 1 saatlik hareketi hızlandırılmış olarak göreceğiz.

Aynen, katılıyorum. Aslında ilham verdiniz. Bir bakayım şuna. :slight_smile:

Hımm, peki bunun avantajı nedir tam olarak? Yani venv ile projeye göre modüller yükleniyor, bir projede ihtiyaç duyulmayacak olan modüllerin Python’a bir etkisi mi var?

Dezavantaj mıdır bilmem ama, venv kullanarak her projeye modülleri tekrar tekrar yüklemek gerekmeyecek mi?

Burada açıklanmış:
https://pip.pypa.io/en/stable/user_guide/#requirements-files
https://pip.pypa.io/en/stable/reference/pip_install/#requirements-file-format

1 Beğeni

Yani requirements.txt içine modüllerin isimlerini veya bazı durumlarda yüklenmesini istediğimiz sürümlerini yazıyoruz ve kullanıcıya programı çalıştırmadan önce konsola pip3 install -r requirements.txt yazması gerektiğinin bilgisini veriyoruz öyle mi?

Ben öyle yapıyorum ama attığım linklerin tamamını okumadığım için kesin bir şey söyleyemeyeceğim :slight_smile:

Sorun versiyonlamada.
Px programi M modulununun <Mv versiyonunu istiyor ve yenileriyle calismiyorsa,
Py programi da M modulunun >=Mv versiyonunu istiyor ve eskileriyle calismiyorsa,

Iki programi ayni anda sisteme kurulu bir modulle calistirmak mumkun degil. “M modulunu” yukle demek de yetersiz kaliyor—programlarin “M==0.2.3” veya “M==1.2.x” veya “M>=1” gibi spesifik olmalari lazim.

(Bir de bu programlardan bir tanesinin sistem programi ve yukledigi modulun sistem modulu oldugunu dusun.)

2 Beğeni

Doğru söylüyorsunuz. :+1:

Mesela pyswisseph modülünü Windows’a kurmak için binary dosyasını kurmak gerekiyor. Linux’de böyle bir sıkıntı yok. Binary dosyasını şuradan temin ettim diyelim:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
Her Python sürümüne ve işletim sistemi mimarisine göre dosyalar indirdim:

pyswisseph-2.5.1.post0-cp36-cp36m-win32.whl
pyswisseph-2.5.1.post0-cp36-cp36m-win_amd64.whl
pyswisseph-2.5.1.post0-cp37-cp37m-win32.whl
pyswisseph-2.5.1.post0-cp37-cp37m-win_amd64.whl
pyswisseph-2.5.1.post0-cp38-cp38-win32.whl
pyswisseph-2.5.1.post0-cp38-cp38-win_amd64.whl

Peki bu whl dosyalarını Python’a yüklemek için requirements.txt dosyasının içine ne yazmam gerekiyor?
Normalde şöyle yapıyordum:

Aşağıdaki gibi bir fonksiyon yazmıştım:

def select_module(
        name: str = "",
        file: list = [],
        path: str = ""
):
    if os.name == "posix":
        os.system(f"pip3 install {name}")
    elif os.name == "nt":
        if sys.version_info.minor == 6:
            if platform.architecture()[0] == "32bit":
                new_path = os.path.join(path, file[0])
                os.system(f"pip3 install {new_path}")
            elif platform.architecture()[0] == "64bit":
                new_path = os.path.join(path, file[1])
                os.system(f"pip3 install {new_path}")
        elif sys.version_info.minor == 7:
            if platform.architecture()[0] == "32bit":
                new_path = os.path.join(path, file[2])
                os.system(f"pip3 install {new_path}")
            elif platform.architecture()[0] == "64bit":
                new_path = os.path.join(path, file[3])
                os.system(f"pip3 install {new_path}")
        elif sys.version_info.minor == 8:
            if platform.architecture()[0] == "32bit":
                new_path = os.path.join(path, file[4])
                os.system(f"pip3 install {new_path}")
            elif platform.architecture()[0] == "64bit":
                new_path = os.path.join(path, file[5])
                os.system(f"pip3 install {new_path}")

Ve bu fonksiyonu script içerisinde şöyle kullanıyordum:

PATH = os.path.join(os.getcwd(), "Eph", "Whl")
try:
    import swisseph as swe
except ModuleNotFoundError:
    select_module(
        name="pyswisseph",
        file=[i for i in os.listdir(PATH) if "pyswisseph" in i],
        path=PATH
    )
    import swisseph as swe

Visual Studio’nun gerekli sürümü bilgisayarda bulunduğunda bir problem olmuyor diye biliyorum.

Dosyaları projenizin bir parçası haline getirmek yerine link eklemeyi tercih edebilirsiniz, mesela (bunu bulmak için biraz vakit kaybettim, sitede js ile indiriliyormuş):

pip install https://download.lfd.uci.edu/pythonlibs/s2jqpv5t/pyswisseph-2.5.1.post0-cp38-cp38-win_amd64.whl

Burada ondan bahsetmiş sanırım:
https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers

1 Beğeni

İşte karşı tarafın bilgisayarında Visual Studio kurulu olmayabiliyor.

Evet görmüştüm bunu ama bu özellik kaldırılır düşüncesiyle hiç bu şekilde kullanmaya çalışmadım. :slight_smile:

Yani şunun gibi:

SomeProject == 5.4 ; python_version < '2.7'

Python versiyonu 2.7’den küçükse SomeProject’in 5.4 sürümünü kur gibi bir anlama geliyor herhalde.

Bu arada aşağıdaki örnek oldukça bilgilendirici.

#
####### example-requirements.txt #######
#
###### Requirements without Version Specifiers ######
nose
nose-cov
beautifulsoup4
#
###### Requirements with Version Specifiers ######
#   See https://www.python.org/dev/peps/pep-0440/#version-specifiers
docopt == 0.6.1             # Version Matching. Must be version 0.6.1
keyring >= 4.1.1            # Minimum version 4.1.1
coverage != 3.5             # Version Exclusion. Anything except version 3.5
Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*
#
###### Refer to other requirements files ######
-r other-requirements.txt
#
#
###### A particular file ######
./downloads/numpy-1.9.2-cp34-none-win32.whl
http://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl
#
###### Additional Requirements without Version Specifiers ######
#   Same as 1st section, just here to show that you can put things in any order.
rejected
green
#
1 Beğeni

Peki farklı işletim sistemleri için farklı requirements.txt dosyaları mı oluşturmak gerekiyor? Yani yukarıda bahsettiğim modül Linux’te farklı Windows’ta farklı bir şekilde kuruluyor.