PyQt textEdit thread hatası

python
pyqt

#1
class TextEditGuncelleThread(QtCore.QThread):
    def __init__(self,parent):
        QtCore.QThread.__init__(self,parent)
        self.parent = parent

    def run(self):
        while True:
            self.parent.textEdit.setText(self.parent.mesajlar)
            time.sleep(0.05)

class Ui_MainWindow(object)
    def __init__(self):
        self.mesajlar = ""

     def mesajknt()
          thred = TextEditGuncelleThread(self)
          thred.start()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

hata :

    QtCore.QThread.__init__(self,parent)
TypeError: QThread(parent: QObject = None): argument 1 has unexpected type 'Ui_MainWindow'

merhaba
pyqt de text editi her saniyede güncellemek istiyorum bunun için thread kullandım ama ahata verdi bunun için özel pyqt thread varmış bende bunu bu şekilde kullanmayı denedim ama gene hata verdi bir sonuca ulaşamadım nasıl yapabilirim.

kod şeklinde atamadım kusura bakmayın.


#2

Hatanın nedeni QTread’in parent parametresi için QObject tipinde bir veriye ihtiyaç duyması, zaten “parent: QObject” olarak göstermiş hatada fakat senin parametreye verdiğin Ui_MainWindow bir QObject değil.
Ui_MainWindow üst sınıfı olmayan bir nesne ise parantez içerisinde object yazmana gerek yok Ui_MainWindow yeterli. Ui_MainWindow’un ne olmasını istiyorsun bilmiyorum ancak bu hataya göre Ui_MainWindow(QtCore.QObject) olması gerektiği söyleyebilirim tabi amacın buysa. Bu ve bunun gibi ek düzeltmelerle kodun olması gereken hali:

class TextEditGuncelleThread(QtCore.QThread):
    def __init__(self, parent): # init değil __init__ olmalı 
        super().__init__() # üst sinifinin özelliklerini miras almak için super fonksiyonunu kullan
        self.parent = parent

    def run(self):
        while True:
            self.parent.textEdit.setText(self.parent.mesajlar)
            time.sleep(0.05)


class UiMainWindow(QtCore.QObject): # sınıf isimlerinde altçizgi kullanılması tavsiye edilmez bu sadece fonksiyonlar için önerilir, sınıf isimlerinin CamelCase yani kelimelerin baş harfi büyük olacak şekilde yazılması önerilir

    def __init__(self):
        super().__init__()
        self.mesajlar = ""

    def mesajknt(self):
        thred = TextEditGuncelleThread(self) # eğer fonksiyon içerisinde nesnenin kendisine ihtiyaç duyuluyorsa (self), fonksiyon  'self' parametresi içermeli
        thred.start()

Kodunu çalıştırdıktan sonra pencere açıldı ama sonra python hata verdi neden bilmiyorum QT yi hiç kullanmadım o yüzden bu kadar yardım edebildim. Umarım yardımcı olur.


#3

Hala yapamadım olmadı.
Ama asıl amacım text editdeki veriyi her mesaj geldiğinde güncellemek tüm kodları atmak istemedim textEdit i normal bir thread ile güncellemeye çalıştığımda hata veriyor. Qthread kıllanınız diye. ama bu şekildede normal thread mantğında uiMainWindow içindeki bir Qthread ile methodu kullanamadığım için class tanımlamak zorunda kalıyorum bu sefer gene olmuyor uiMainWindowu yeniden tanımladığım için güncellenmiyor. umarım Anlatabilmişimdir saolun. Bu dediğimi nasıl yapabilirim türkçe kaynak sıkıntısı çektiğim için bir türlü yapamadım.


#4

Merhaba.

Genel olarak thread mantığını biliyor musunuz? Bilmiyorsanız şu yazıyı okumanızı tavsiye ederim: http://ysar.net/python/threading.html
Bir de pencere araçlarını bir thread sınıfından türetmeniz yanlış. Thread’leri grafiklerden ayrı olarak düşünmeli ve bu şekilde kodlamalısınız.

İyi çalışmalar.


#5

Merhaba hocam Bu kadar uzun sürede dönüş yaptığım için kusura bakmayın.
Amacım bir basit konuşma programı yapmak socket üzerinden projemi github üzerine yükledim.

sorunum ise gelen mesajları kontrol edememek.
Thread manttığını Biliyorum kendi çapımda :smiley: diyelim

Başka bir şekilde gelen mesajın kontrolünü nasıl yapacağımı bilemedim.

Peojemin Linki

Teşşekür ederim


#6

Tekrardan merhaba sorunu düzeltmiş bulunmaktayım.

Kısaca

        self.timer = QtCore.QTimer() # burada timer ımızı tanımlıyoruz
        self.timer.timeout.connect(self.örnekMethof """ kısaca method buraya """) # buraya çalıştıracağımız komutların methodununu belirliyoruz 
        self.timer.start(10) # kaç milisaniyede bir methodumuzun çalışacağını belirtiyoruz ve timerımızı başlatıyoruz

Thread kullanmak yerine Qtimer ile gerçekleştirdim.

Yararlandığım site

http://nullege.com/ # mükemmel bir site tabiri caizse kodları yorumlamak biraz kafa yakıyor ama hem algoritmanız gelişiyor hem bilginiz yeni bu işlere başlayan biri olaraktan.

Projemin bulunduğu github linki.

Dahada geliştirmeyi planlıyorum vakit buldukça.

Teşekkürler.