我寫了一個簡單的套接字應用與pyqt4和線程在python3.3,但我有運行Qt類命令的問題,如在標籤中顯示一條消息或任何東西,只有Python代碼正常工作。不顯示任何從setText()或pyqt4中的其他顯示方法線程類
不顯示任何東西S_label在我的GUI,
我用2點的方式來表達對S_label任何消息,但沒有辦法不行,
- self._ui
- self.ui
代碼:
- self.ui.S_label.setText( 「測試!」)
- self._ui.S_label.setText( 「測試!」)
- self.ui.S_label.setText(「{0}:{1}是連接「的形式(地址,remoport))
兩個兩種方式print
效果很好:。
- 打印(self._ui)
- 打印(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
完全有效!謝謝,但你能告訴我爲什麼會出現這個問題嗎?爲什麼繼承不起作用?那種方式有什麼問題? – alireza
繼承沒有意義,但這不是我想的問題。給Lineedit小部件作爲參數解決了這個問題。 – Frodon
好的,非常感謝! – alireza