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.
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.
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.
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_())
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.
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
Ş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 . 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.