Python threading problem

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Python threading problem

OdgovorNapisal/-a jure94 » 10 Feb 2021, 10:47

Naletel sem na težavo, ki pa je ne znam rešiti.
Imam nek GUI, ki se izvaja v ločenem procesu. Pri inicializaciji GUIja ustvarim par threadov, ki skrbijo za updatanje raznih stvari.

Na primer:
Koda: Izberi vse
class myGui(QtWidgets.QMainWindow, gui.Ui_MainWindow):
   def __init__(self, guiState, guiData):
      super(self.__class__, self).__init__()
      self.ui = self.setupUi(self)
      ...
      #vse ostalo
      ...
      thread1 = threading.Thread(target = self.test)
      thread1.start()

   def update(self, field, txt):
      field.verticalScrollBar().value() #to deluje
      field.setText(txt) #tukaj se ustavi
     
   def test(self):
      while True:
         time.sleep(1)
         self.calc(self.txt_field, "nekaj"

guiState in guiData prideta "od zunaj" in ju uporabljam za komunikacijo med procesi. To sicer tukaj niti ni pomembno.
"self.txt_field" se nahaja v ločeni datoteki, narejeni s Qt Designerjem (oz. prevedeno s pyqt5):
Koda: Izberi vse
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
      ...
      self.tab1= QtWidgets.QWidget()
      self.txt_field= QtWidgets.QTextBrowser(self.tab1)
      ...


Dokler nisem imel "update" v ločenem threadu je stvar delovala. Sedaj pa ne deluje, kar mi je jasno, ker gre za ločen thread.
Napaka, ki jo dobim je: QObject: Cannot create children for a parent that is in a different thread.
Vprašanje je, kaj moram popraviti?
Uporabniški avatar
jure94
 
Prispevkov: 768
Pridružen: 18 Jan 2015, 00:33
Kraj: Jesenice/Ljubljana
Zahvalil se je: 37 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 9

Re: Python threading problem

OdgovorNapisal/-a MitjaN » 10 Feb 2021, 14:07

Če se prav spomnim morajo vse metode nad Qt elementi teči iz thread-a kjer si štartal app.

Tako ti ne ostane drugega, kot da v `update` generiraš signal ki ti bo v glavnem threadu prožil metodo v kateri boš ustrezno spremenil GUI elemente:

https://stackoverflow.com/questions/9957195/updating-gui-elements-in-multithreaded-pyqt
MitjaN
 
Prispevkov: 112
Pridružen: 24 Feb 2015, 11:45
Zahvalil se je: 21 krat
Prejel zahvalo: 41 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 8

Re: Python threading problem

OdgovorNapisal/-a jure94 » 11 Feb 2021, 15:32

Izgleda bo to res to. S tem, da moram uporabiti QThread in ne threading. Ne bo nekaj na hitro, kot sem upal.
Uporabniški avatar
jure94
 
Prispevkov: 768
Pridružen: 18 Jan 2015, 00:33
Kraj: Jesenice/Ljubljana
Zahvalil se je: 37 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 9

Re: Python threading problem

OdgovorNapisal/-a MitjaN » 11 Feb 2021, 21:27

Lahko ostaneš pri navadnih thread-ih. QThread samo razširi funkcionalnost.
MitjaN
 
Prispevkov: 112
Pridružen: 24 Feb 2015, 11:45
Zahvalil se je: 21 krat
Prejel zahvalo: 41 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 8

Re: Python threading problem

OdgovorNapisal/-a jure94 » 12 Feb 2021, 10:29

Bo res. Sem samo uporabil Signal/Slot (pyqtSignal) in je bilo veliko manj dela, kot sem mislil.
Uporabniški avatar
jure94
 
Prispevkov: 768
Pridružen: 18 Jan 2015, 00:33
Kraj: Jesenice/Ljubljana
Zahvalil se je: 37 krat
Prejel zahvalo: 75 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 9


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost