2015-06-20 2 views
0

Здравствуйте, мне нужна помощь. Я пытаюсь показать всплывающее окно, когда получаю определенный тип информации, отправляемой сервером. Проблема в том, что метод получения данных с сервера является Thread, поэтому у меня возникают проблемы с модификацией MainWindow из потока, поэтому я попытался отправить сигнал из потока другому методу в классе User (см. Мой код ниже), поэтому я не изменяю окно из потока. Я получаю следующее сообщение об ошибке:Ошибка отправки сигналов из потока

TypeError: User cannot be converted to PyQt4.QtCore.QObject in this context 

Я не знаю, если это правильный путь решения проблемы, поэтому, если есть лучший способ, которым я был бы признателен за вашу помощь, здесь идет код:

class User: 
    signal1 = QtCore.pyqtSignal() 

    def __init__(self, usuario): 
     self.usuario = usuario 
     self.host = '127.0.0.1' 
     self.port = 3490 
     self.user = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Socket cliente 
     try:     
      self.thread_wait_server = threading.Thread(target=self.wait_server) 
      self.thread_wait_server.start()    

     except socket.error: 
      print("No fue posible realizar la conexión") 
      sys.exit() 
     self.initUI() 

    def initUI(self): 
     app = QtGui.QApplication(sys.argv) 
     self.login = interfaz.Loggin() 
     self.login.show() 
     self.signal1.connect(self.showMain) 
     self.login.crear.trigger.connect(self.signal) 
     self.login.trigger1.connect(self.signal2) 
     app.exec_() 

    def signal(self): 
     info = self.login.crear.userPassword() 
     info1 = pickle.dumps(info) 
     self.user.sendall(info1) 

    def signal2(self): 
     info2 = self.login.comprobar() 
     info3 = pickle.dumps(info2) 
     self.user.sendall(info3) 
     print('sendall') 

    def wait_server(self): 
     self.conectar() 

    def conectar(self): 
     self.user.connect((self.host, self.port)) 
     self.listener = threading.Thread(target=self.listen, args=()) 
     self.listener.Daemon = True 
     self.listener.start() 

    def listen(self): 
     while True: 

      data = self.user.recv(1024) 
      print('received') 
      print(data) 
      if data: 
       info = pickle.loads(data) 
       if info == 'usuario_valido': 
        self.signal1.emit() 
        print('mainshow') 
        #self.login.exit() 

    def showMain(self): 
     self.login.main.show() 

не обращайте внимания на сигналы функций, которые они просто отправляют на сервер, проблема заключается в том, что метод прослушивает, когда сервер отправляет обратно информацию, которую должен получить мой пользователь, и что-то делать в этом случае, открывать окно. (Мои виджеты Логгин() и один я хочу показать, устанавливается как атрибут класса Логгина() и его называют основным.

Благодаря

ответ

2

Класс User должен наследоваться от QObject, если вы хотите поэтому первая строка определения класса должна читать class User(QtCore.QObject):.

+0

Также не забудьте добавить «__super (User, self) .__ init __() __» сразу после вашего метода init в классе User: – Logic1

Смежные вопросы