2013-07-23 38 views
0

我寫了一個簡單的套接字應用與pyqt4和線程在python3.3,但我有運行Qt類命令的問題,如在標籤中顯示一條消息或任何東西,只有Python代碼正常工作。不顯示任何從setText()或pyqt4中的其他顯示方法線程類

不顯示任何東西S_label在我的GUI,

我用2點的方式來表達對S_label任何消息,但沒有辦法不行,

  1. self._ui
  2. self.ui

代碼:

  1. self.ui.S_label.setText( 「測試!」)
  2. self._ui.S_label.setText( 「測試!」)
  3. self.ui.S_label.setText(「{0}:{1}是連接「的形式(地址,remoport))

兩個兩種方式print效果很好:。

  1. 打印(self._ui)
  2. 打印(self.ui)

print輸出:

- <imigui.Ui_MainWindow object at 0x7fe0746cac10>

- <imigui.Ui_MainWindow object at 0x7fe0746d5d90>

我做錯了什麼?

我的代碼:

from PyQt4 import QtCore, QtGui 
from imigui import Ui_MainWindow 

class imiserv(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.ui.Sport_lineEdit.setMaxLength(5) 
     self.ui.Sconnect_pushButton.clicked.connect(self.serv) 

    def serv(self): 
     self.sersock= socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.sersock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

     self.host= str(self.ui.Sip_lineEdit.text()) 
     self.port= int(self.ui.Sport_lineEdit.text()) 
     MY_LOCK = threading.Lock() 
     class CountT(threading.Thread, imiserv): 
      def __init__(self, ui, ser): 
       super().__init__() 
       imiserv.__init__(self) 
       self._sersock= ser 

       self._ui= ui 
       print(self._ui) 
       print(self.ui) 
       self.ui.S_label.setText("test !") 
       self._ui.S_label.setText("test !") 

      def run(self): 
       MY_LOCK.acquire() 
       while True: 
        cliconn, (addr, remoport)= self._sersock.accept() 
        self.cstr= cliconn.recv(1024) 

        self.ui.S_label.setText("{0}:{1} is connected.".format(addr, remoport)) 
        cliconn.close() 

        print(self.cstr) 
       MY_LOCK.release() 

     try : 
      self.sersock.bind((self.host, self.port)) 
      self.sersock.listen(5) 
      a= CountT(self.ui, self.sersock) 
      a.daemon= True # for exit from thread when close gui 
      a.start() 
     except socket.error as err: 
      self.ui.S_label.setText(err) 

編輯(新的問題)

我有自己的方式一個新的問題:我添加一個QTextEdit到我的GUI,當我想settext在我的代碼Segmentation fault發生了,應用程序崩潰,

錯誤:

QObject: Cannot create children for a parent that is in a different thread. 
(Parent is QTextDocument(0x15c4460), parent's thread is QThread(0xfeb570), current thread is QThread(0x15d3900) 
Segmentation fault 

我的代碼:

from PyQt4 import QtCore, QtGui 
from imigui import Ui_MainWindow 

class imiserv(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.ui.Sport_lineEdit.setMaxLength(5) 
     self.ui.Sconnect_pushButton.clicked.connect(self.serv) 

    def serv(self): 
     self.sersock= socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.sersock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

     self.host= str(self.ui.Sip_lineEdit.text()) 
     self.port= int(self.ui.Sport_lineEdit.text()) 

     MY_LOCK = threading.Lock() 
     class CountT(threading.Thread): 
      def __init__(self, label, ser, qtext): 
       super().__init__() 
       self._sersock= ser 

       self._uilabel= label 
       self._uiClog= qtext 


      def run(self): 
       MY_LOCK.acquire() 
       while True: 
        cliconn, (addr, remoport)= self._sersock.accept() 
        self.cstr= cliconn.recv(1024) 

        self._uilabel.setText("{0}:{1} is connected.".format(addr, remoport)) 
        cliconn.close() 

        print(self.cstr) 
        self._uilabel.setText(self.cstr) # it's ok! 
        self._uiClog.setText(msg) # Segmentation fault 

       MY_LOCK.release() 


     try : 
      self.sersock.bind((self.host, self.port)) 
      self.sersock.listen(5) 
      a= CountT(label= self.ui.S_label, ser= self.sersock, qtext= self.ui.Clog_textEdit) 
      a.daemon= True # for exit from thread when close gui 
      a.start() 
      self.ui.S_label.setText("Connected !") 
     except socket.error as err: 
      self.ui.S_label.setText(err) # it's ok ! 
    self.ui.self.ui.Clog_textEdit.setText(err) # it's ok ! 

爲什麼?


編輯(新problem2)

這是我的代碼:

從PyQt4的進口QtCore,QtGui 從imigui進口Ui_MainWindow

類imiserv(QtGui.QMainWindow) :

send_msg = pyqtSignal('QString', 'QString') 

def __init__(self, parent=None): 
    QtGui.QWidget.__init__(self, parent) 
    self.ui = Ui_MainWindow() 
    self.ui.setupUi(self) 
    self.ui.Sport_lineEdit.setMaxLength(5) 
    self.ui.Sconnect_pushButton.clicked.connect(self.serv) 

    self.send_msg.connect(self.write_msg) 

def write_msg(self, lbl_msg= None, txt_msg= None): 
    if lbl_msg: 
     self.ui.C_label.setText(lbl_msg) 
    if txt_msg: 
     self.ui.Clog_textEdit.setText(txt_msg) 

def serv(self): 
    MY_LOCK = threading.Lock() 
    class CountT(threading.Thread): 
     def __init__(self, parent): 
      threading.Thread.__init__(self) 
      self._parent= parent 

     def run(self): 
      MY_LOCK.acquire() 
      self._parent.send_msg.emit("Waiting connections","") 
      while True: 
       cliconn, (addr, remoport)= self._parent.clis.accept() 
       clirecmsg= str(cliconn.recv(1024) 
       self._parent.send_msg.emit("{0}:{1} is connected.".format(addr, remoport), "{0}:{1}".format(addr, remoport) 
       cliconn.close() 

      MY_LOCK.release() 

    try : 
     self.clis= socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.clis.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     clierhost= str(self.ui.Sip_lineEdit.text()) 
     clierport= int(self.ui.Sport_lineEdit.text()) 
     self.clis.bind((clierhost, clierport)) 
     self.clis.listen(5) 
     a= CountT(self) 
     a.daemon= True 
     a.start() 
    except socket.error as err: 
     err= str(err) 
     print(err) 

這是錯誤,發生了decussate,我應該按鈕兩次獲取事件第一次錯誤顯示在Linux中,並沒有在Windows和第二次新聞事件發生,(此錯誤只顯示在Linux操作系統)。

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python3.3/threading.py", line 637, in _bootstrap_inner 
    self.run() 
    File "imiclilap.py", line 34, in run 
    cliconn, (addr, remoport)= self._parent.clis.accept() 
    File "/usr/lib/python3.3/socket.py", line 135, in accept 
    fd, addr = self._accept() 
OSError: [Errno 22] Invalid argument 

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "/usr/lib/python3.3/threading.py", line 637, in _bootstrap_inner 
    self.run() 
    File "imiclilap.py", line 34, in run 
    cliconn, (addr, remoport)= self._parent.clis.accept() 
    File "/usr/lib/python3.3/socket.py", line 135, in accept 
    fd, addr = self._accept() 
OSError: [Errno 22] Invalid argument 

回答

1

以下代碼適用於我(Python 2.6這裏)。我刪除了CountT的繼承imiserv,並用代替了UI對象,代之以QLabel S_labelimiserv實例。 A pyqtsignal允許線程CounT向QLabel和QTextEdit寫入文本:

import socket 
import threading 

from PyQt4 import QtCore, QtGui 
from imigui import Ui_MainWindow 

class imiserv(QtGui.QMainWindow): 

    send_msg = pyqtSignal('QString', 'QString') 

    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 
     self.ui.Sport_lineEdit.setMaxLength(5) 
     self.ui.Sconnect_pushButton.clicked.connect(self.serv) 

     self.send_msg.connect(self.my_slot) 

    def write_msg(self, lbl_msg, txt_msg): 
     self.ui.S_label.setText(lbl_msg) 
     self.ui.Clog_textEdit.setText(txt_msg) 

    def serv(self): 
     self.sersock= socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.sersock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

     self.host= str(self.ui.Sip_lineEdit.text()) 
     self.port= int(self.ui.Sport_lineEdit.text()) 
     MY_LOCK = threading.Lock() 
     class CountT(threading.Thread): 
      def __init__(self, parent): 
       threading.Thread.__init__(self) 
       self._parent= parent 

      def run(self): 
       MY_LOCK.acquire() 
       self._parent.send_msg.emit("Waiting connections","") 
       while True: 
        cliconn, (addr, remoport)= self.__parent.sersock.accept() 
        self.cstr= cliconn.recv(1024) 
        self._parent.send_msg.emit("{0}:{1} is connected.".format(addr, remoport), self.cstr) 
        cliconn.close() 

       MY_LOCK.release() 

     try : 
      self.sersock.bind((self.host, self.port)) 
      self.sersock.listen(5) 
      a= CountT(self) 
      a.daemon= True # for exit from thread when close gui 
      a.start() 
     except socket.error as err: 
      self.ui.S_label.setText(err.strerror.decode("utf-8")) 
      self.ui.Clog_textEdit.setText(err.strerror.decode("utf-8")) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    s = imiserv() 
    s.show() 
    sys.exit(app.exec_()) 
+0

完全有效!謝謝,但你能告訴我爲什麼會出現這個問題嗎?爲什麼繼承不起作用?那種方式有什麼問題? – alireza

+0

繼承沒有意義,但這不是我想的問題。給Lineedit小部件作爲參數解決了這個問題。 – Frodon

+0

好的,非常感謝! – alireza