Çözüldü PyQt5 Döngü içerisindeki veriyi ScrollArea'ya eklemek

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Aerosteon

Centipat
Katılım
27 Şubat 2022
Mesajlar
275
Çözümler
6
Merhaba,

PyQt5 ile haşır neşir olanlar önden gelmek koşuluyla bir bakarsanız gerçekten çok sevinirim.
Twitch ile bir şeyler kurcalıyorum diye öncesinde bir konu açmıştım.
Twitchde herhangi bir yayıncının yayın anındaki chat konuşmalarını çekebiliyorum. Kimin ne yazdığını da anlayabiliyorum. Burada bir sıkıntı yok.
Chat şuanda yalnızca terminalde görünüyor. Bunu PyQt5'te olan QScrollArea sınıfı ile halledilebileceğini böylece her mesajı alt alta görüp bunları bir arayüzde okunabileceğini düşünüp resimdeki gibi bir ScrollArea ekledim (henüz içi boş).
Ekran görüntüsü 2022-04-09 131708.png

(Bu benim QtDesignerde tasarladığım görünümünün tamamının bu olmadığı, resmin yalnızca ilgili olacağını düşündüğüm bölümü)

Şimdi herhangi bir yayıncının chatine bağlanıcam:
Örneğin eray isimli yayıncı şuan yayındaymış.
gifff.gif

Gördüğünüz gibi terminal üzerinden hangi kullanıcı chate ne yazmış görebiliyorum.
Bunu QScrollArea'da Label ile eklemek istediğimde şöyle bir hata ile karşılaşıyorum:
QObject::setParent: Cannot set parent, new parent is in a different thread

Aklıma herhangi bir fikir gelmiyor.
(bu işlem bir methodun içerisinde gerçekleşiyor ve sonsuz döngü barındırdığından Thread sınıfı ile çağırıyorum.(program takılmasın diye) )
Sizce nasıl bir mantık kurulmalı ki döngü içerisinde scroll area'ya sürekli label eklesin?
Sonuçta bu chatten gelen mesjalar sonsuz döngünün içerisinde.

Teşekkür ediyorum şimdiden.

İstek olursa kodu paylaşabilirim.
 
Son düzenleme:
Çözüm
Deneyeceğim hocam.
EDİT:

@Dynamics Merhaba hocam.
Kodda şöyle bir değişikliğe uğrataraf referans aldığım şu linkteki yazılar ile başta söylediğim uyarıyı artık vermiyor. Böylece bir taşta iki kuşuda vurmuş oluyorum ikincisi ise sonra çözerim diye düşündüğüm arayüzü kapatmama rağmen yani programın teorik olarak sonlanması gerekirken sonsuz döngüden ötürü arayüz kapansa da döngü devam ediyordu ve program sonlanmıyordu. Bunu da bu paylaşacağım kodda çözmüş oldum. Sadece şöyle bir sıkıntı kaldı o da Scroll Area'ya döngü içerisinde label eklemek aklıma bir txt dosyasına chatteki mesajları yazdırıp 3 sn de bir bunları okutup scroll areaya yeni bir label ile yazdırmak geliyor fakat tekrardan aynı problem olur mu bilmiyorum:

Kod şu şekilde





Forumda bir sıkıntı var sanırım kodu yazdığımda hata veriyor ve göndermiyor.
REFERANS
qt ya da gtk gibi gui araclarinda tek bir olay dongusu vardır ve o da tek bir thread icinde calisir sen bu thread'e baska bir thread uzerinden erismeye kalkarsan race condition'a sebep olur, bu tur olaylari engellemek icin her iki kitapliktada baska thread icinden function cagirmayi saglayan ozel functionlar var, bunlar eszamansiz gerceklesecek durumlarin onune gecer. qobject miras almis herhangi bir oge icin asagida yazdigim pseudocode uzerinden gidebilirsin.

Python:
class Window(QMainWindow):
    def __init__(self):
    ...

    @pyqtSlot()
    def call(self):
        ...addWidget(QLabel)
        ...


def callfunc(window:QObject):
    QMetaObject.invokeMethod(window, "call", Qt.QueuedConnection)

window = Window()
thread(target=callfunc, args=(window) )
...
 
qt ya da gtk gibi gui araclarinda tek bir olay dongusu vardır ve o da tek bir thread icinde calisir sen bu thread'e baska bir thread uzerinden erismeye kalkarsan race condition'a sebep olur, bu tur olaylari engellemek icin her iki kitapliktada baska thread icinden function cagirmayi saglayan ozel functionlar var, bunlar eszamansiz gerceklesecek durumlarin onune gecer. qobject miras almis herhangi bir oge icin asagida yazdigim pseudocode uzerinden gidebilirsin.

Python:
class Window(QMainWindow):
    def __init__(self):
    ...

    @pyqtSlot()
    def call(self):
        ...addWidget(QLabel)
        ...


def callfunc(window:QObject):
    QMetaObject.invokeMethod(window, "call", Qt.QueuedConnection)

window = Window()
thread(target=callfunc, args=(window) )
...
Bilgi verdiğiniz için teşekkür ediyorum zamanım olduğunda uyarlayacağım.

Dönüş yapacağım.
test
EDİT:

Hocam merhaba.

Sizin verdiğiniz örneğe bağlı kalarak çeşitli türde denemeler yaptım fakat herhangi bir sonuç yine alamadım. Ben şimdi kodu atıyorum zaten tek tek yorum satırları ile aktarınca sizde anlayacaksınız.
Direk sizin örnek verdiğiniz şekilde yapıyorum:


Bunun sonucunda bu sefer arayüz yüklenmiyor (donuyor), chat yine terminalde çalışıyor.

Sizin dediğiniz doğrultusunda da farklı yöntemler denediğimde de yine terminalde gözüküyor, arayüzde açılıyor fakat yine konuyu açtığımda belirttiğim uyarıyı/hatayı alıyorum.
@Dynamics Forumda hata alıyorum kodu paylaşırken verdiğim linkte paylaştım
 
Son düzenleme:
Bunun dışında başka bir çözüm yöntemi olduğunu sanmıyorum çünkü obje eklerken bir şekilde ana olay döngüsüne müdahale edilmek zorunda. Bu örnek üzerinden devam etmek istersen döngüyü callfunc'a taşıyıp her döngüde bir miktar thread'i uyutmayı deneyebilirsin.

Ya da labelleri önceden oluşturup scroll olayını bu labelleri güncelleyecek şekilde tasarlayabilirsin, bunun için qthread ve sinyalleri kullanabilirsin ( en azından thread safe).
 
Deneyeceğim hocam.
EDİT:

@Dynamics Merhaba hocam.
Kodda şöyle bir değişikliğe uğrataraf referans aldığım şu linkteki yazılar ile başta söylediğim uyarıyı artık vermiyor. Böylece bir taşta iki kuşuda vurmuş oluyorum ikincisi ise sonra çözerim diye düşündüğüm arayüzü kapatmama rağmen yani programın teorik olarak sonlanması gerekirken sonsuz döngüden ötürü arayüz kapansa da döngü devam ediyordu ve program sonlanmıyordu. Bunu da bu paylaşacağım kodda çözmüş oldum. Sadece şöyle bir sıkıntı kaldı o da Scroll Area'ya döngü içerisinde label eklemek aklıma bir txt dosyasına chatteki mesajları yazdırıp 3 sn de bir bunları okutup scroll areaya yeni bir label ile yazdırmak geliyor fakat tekrardan aynı problem olur mu bilmiyorum:

Kod şu şekilde





Forumda bir sıkıntı var sanırım kodu yazdığımda hata veriyor ve göndermiyor.
REFERANS
 
Son düzenleme:
Çözüm

Yeni konular

Geri
Yukarı