Yapmak istediğim işlemi nasıl döngüye alırım?

Bir tic tac toe yapmaya çalışıyorum.

Görmüş olduğunuz bloklara “X” ya da “O” dışında herhangi bir string girildiğinde bunun anbean silinmesini istiyorum.
Bunun için şöyle bir şey yaptım.

Middle_left_block orta satırın solundaki blok demek oluyor. Yani şu

Yaptığım işlem yani şu :


        if self.middle_left_block.text() != "X" or "O":
            self.middle_left_block.clear()    

çalıştı mı ? Çalıştı. Kontrol etmek için clear yerine setText kullandım. Program açıldığı zaman settext’e girdiğim str değeri orta soldaki blokta göründü.

Şuan clear kullandığım için herhangi bir değişim yok.

Fakat sorun şu ki, yaptığım işlem sadece bir kez çalışıyor. Bu bloğa B ya da Q yazınca onu anbean silemiyor.
Dolayısıyla bir döngüye ihtiyaç var. Program çalıştığı takdirde sürekli çalışacak bir döngü, ve bu döngü de bloklara “X” ve “O” dışındaki girilen harfleri, sayıları ve bir harften fazla olan sayıları silecek.

Bunun için while kullanmayı denediğimde de program açılmadı.
Bu tarz işlemleri nasıl hiç durmayacak bir döngüye alabilirim ?
Döngüye alamıyorsam yapmak istediğim işlemi başka nasıl uygulatırım ?

Tıpkı bir keylogger gibi. O bloklara “X” ve “O” Dışında yazılan her şeyin anbean silinmesini istiyorum

Merhaba,
Yapmak istediğin işlem için döngüye ihtiyacın yok. Sadece bilmen gereken şey, slot kavramı.

Şimdi şu self.middle_left_block arkadaşın hangi widget olduğunu bilmesem de bu widgete yazılan karakterin x veya o olup olmadığını kontrol eden bir fonksiyonu bu widgete slotla bağlayabilirsin.

Yani şunu anlatmak istiyorum.

self.middle_left_block.bir_sey_yazildiginda gibi bir pseudo ile göstereyim.

o widgetin tıklandığında veya içine bir şey yazıldığında tetiklenen bir şeyi illaki vardır. on_click gibi bir şey.

Kolay gelsin.

Bir çözüm aramaya çalışacağım teşekkür ederim.

Bahsettiğim şey bu :

Mesela widgetimiz bir plain_text widgeti olsun.

1 Beğeni

Mesela X girdiğinizde de siliyor ama değil mi? Neden ki?

X ya da O’ya “eşit değilse”

Yani x ya da o dışındakileri siliyor.

X girmeyi denediniz mi

Evet denedim. Fakat zaten uygulamaya çalıştığım işlem sadece 1 kere çalıştığı için gözlemleyemiyorum. Yani daha sonradan X yazınca ne olacağını gözlemleyemiyorum. Şuanda program açıldığında bir olaylar gözlemleyebiliyoruz.


Şimdi denedim. Programın sade halinde bloklarda hiç bir şey yazmadığı için açıldıktan sonra


uygulandığında yine settext “x” stringini koyuyor.
Yani en başta bir şey olmadığı için koşul sağlanıyor. Yani blokta --> “” (boş yani) bu var. X ve O’ya eşit olmaması koşulu sağlanıyor ve sonrasında X’i kuruyor.
Herhangi bir sorun yok.

O zaman şöyle diyeyim,

1 - eğer ilk başta “X” ile başlatma şansınız varsa boşluk yerine, öyle deneyebilir misiniz?

2 - olmazsa, şu kodları input sorduğunda X girerek bir deneyebilir misiniz?

tic = input("Girdi: ")

if tic != "X" or "O":
    print("girdiğiniz şey X de değil O da değil")

3 - size zahmet bir de şunları çalıştırabilir misiniz?

var = "yetenek" != "kabiliyet" or "meziyet"
if var:
    print("eş anlamlılar ne de olsa..")

print(var)

Çok özür dilerim şimdi ilgilenemiyorum. Fakat ben buraya projeyi winrar halinde atayım. Merak ettiğiniz şeyleri bizzat kendiniz uygularsınız.

https://s7.dosya.tc/server18/vykj28/Desktop.rar.html

Sadece widget’in içindeki yazı değiştirildiğinde kontrol etmeniz lazım, sürekli degil. Widget’in içeriği değiştiğinde PyQt’nin sizin vereceğiniz bir fonksiyonu çağırması mümkün, @Cihat_Altiparmak da bundan bahsetmiş.

"X"e eşit değilse veya “O”. Eşit değildir (!=) işlecinin önceliği “or” işlecinden daha yüksek.

Bos bir zamanimda tkinter ile yapmistim, belki yardimi dokunur.

Aslında arkadaşlar yardımcı olmuşlar ama ben yine de bir örnek vermek istiyorum.

Çünkü bir uygulama (QApplication) nesnesi oluşturduğunuz anda Ana Olay Döngüsü başlatılıyor. Klavye tuşuna basılması, fare tıklaması gibi “olaylar” anlık olarak QApplication tarafından yakalanabiliyor. Bu özellik Tkinter’da da (mainloop) mevcut.

Muhtemelen QLineEdit kullanıldığı için, textChanged. textEdited metodu da kullanılabilir ama girdi kısmında mutlaka text olmalı. Olmayan bir şeyin düzenlenip düzenlenmediğini denetleyemediği için ihtiyacımızı karşılamıyor.

import sys
from PySide2.QtWidgets import*
from PySide2.QtCore import*
from PySide2.QtGui import*


class Deneme(QMainWindow):
    def __init__(self):
        super(Deneme, self).__init__()
        self.resize(600,400)

        self.widget = QWidget()

        self.lineEdit = QLineEdit()
        self.lineEdit.textChanged.connect(self.control)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lineEdit)

        self.widget.setLayout(self.layout)
        self.setCentralWidget(self.widget)

    def control(self):
        if self.lineEdit.text() != "x" and self.lineEdit.text() != "o":
            self.lineEdit.clear()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Deneme()
    window.show()
    sys.exit(app.exec_())

Evet bana gereken şey textchanged imiş.

        self.middle_left_block.textChanged.connect(self.control)
        
    def control (self):
       
        if self.middle_left_block.text() != "X" or "O" or "":
            self.middle_left_block.clear()

Şu satırları yazdığım zaman istediğim gibi çalıştı fakat bir eksiklik var. Nedeninin anlamadığım bir şekilde bu lineEdit’e “X” ve “O” da yazdıramıyorum.
Fakat ben lineedit’in texti “X” , “O” ya da “” değilse lineEdit’i sileceğini belirttim.

Neden böyle bir sorun oluştu ki ?

Şu kodları ele alalım:

def control(self):
    if self.lineEdit.text() != "X" or self.lineEdit.text() != "O":
        self.lineEdit.clear()

Text alanına bir değer girildiği anda, bu fonksiyon çalıştırılıyor. Burada şöyle diyoruz, “Girdi, 'X’e eşit değilse veya Girdi 'O’ya eşit değilse, text alanını temizle”. Bu koşullardan en az bir tanesi False döndürdüğünde text alanı temizleniyor. Girdi “X” ise ilk koşul True ama ikinci koşul False olur. Girdi “O” olunca ikinci koşul True ama ilk koşul False olur. Yani hangisini girerseniz girin, bir tanesi False döner. Girdi “X” veya “O” olmadığında da yine temizleniyor.

Ancak, or yerine and işlecini kullansaydık durum değişirdi.

def control(self):
    if self.lineEdit.text() != "X" and self.lineEdit.text() != "O":
        self.lineEdit.clear()

Bu senaryoda ise, “Girdi, 'X’e eşit değilse ve Girdi 'O’ya eşit değilse, text alanını temizle”. Yani, “X” ve “O” dışında ne girilirse girilsin, text alanını temizle. X ve O’ya özel muamele gösteriyoruz :slight_smile:

1 Beğeni

Tamam şimdi anladım :slight_smile: Teşekkür ederim.

1 Beğeni

Şu komutu yazdığımızda if x == "X" OR "O" yazdığımızda şöyle yorumlanıyor: x değişkeni "X"e eşit veya "O" ifadesi True mu? "O" ifadesi True olduğu için if bloğu her zaman çalışır, bu durumu bilmiyorsanız bulana kadar canınız çıkar :grinning:. Bu durum için python özelinde bir önlem yok ama alternatif yolları kullanabilirsiniz.
Bunlardan biri buradaki çözüm 2 defa yazmak. Genelde kullanılanı budur. Ama yok illa bana başka bir şey lazım diyorsanız şöyle yazabilirsiniz: if x in "XO". Tabi daha fantastik çözümler de üretebilirsiniz ama benim tavsiyem kodu sonradan okuyacak kişiler için 2 defa yazma yöntemini kullanmanız.

1 Beğeni