2011-10-27 24 views
0

ネットワーク経由でファイルを送信するときに呼び出される確認ボックスがあります。ただし、Signalの関数はMainWindowクラスにあり、Workerスレッドの変数を使用します。しかし、ワーカースレッド内の変数が適切なスコープにないために動作しません。PyQTを使用したソケット上でのファイル転送の確認ボックス

信号からクラスのsaveFile関数に変数msgをどのように渡すことができますか?

編集:私がする必要があったのは、私の信号に議論を引き渡すことでしたが、私はそれを理解しました。混乱させて申し訳ありません。私は何が必要なのか分からなかった。

import socket 
import select 
import sys, os 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

CMD_FILE = 1 

CLIENT_PORT = 9001 
CLIENT_HOST = '127.0.0.1' 

class MainWindow(QWidget): 
    def __init__(self, parent=None): 
     #super(QWidget, self).__init__(parent) 
     super(MainWindow, self).__init__(parent) 
     self.resize(100, 50) 
     self.thread = Worker() 
     self.thread.start() 

     self.file_button = QPushButton('Send a File') 
     self.connect(self.file_button, SIGNAL("released()"), self.sendFile) 

     self.connect_button = QPushButton('Connect To Server') 
     self.connect(self.connect_button, SIGNAL("released()"), self.connectToServer) 

     self.connect(self.thread, SIGNAL('triggered(PyQt_PyObject)'), self.saveFile) 
     self.layout = QFormLayout() 
     self.layout.addRow(self.file_button, self.connect_button) 

     self.setLayout(self.layout) 

    def connectToServer(self): 
     global s 
     try: 
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      s.connect((str(CLIENT_HOST).strip(), CLIENT_PORT)) 
      print "Connected to ", str(CLIENT_HOST) 
     except: 
      print "unable to connect" 

    def clientAll(self, cmd, msg): 
     #check if connnected send a message 
     s.sendall(cmd + msg) 

    def sendFile(self): 
     filename=QFileDialog.getOpenFileName(self, 'Open File', '.') 
     f = open(filename, 'rb') 
     myFile = f.read() 
     self.clientAll(chr(CMD_FILE), myFile) 
     f.close() 
     print filename, "Sent\n" 

    def saveFile(self, msg): 
     reply = QMessageBox.question(self, 'Message', 
      "Are you sure you wish to download this file?", QMessageBox.Yes | 
      QMessageBox.No, QMessageBox.No) 

     if reply == QMessageBox.Yes: 
      filename = QFileDialog.getSaveFileName(self, 'Save File', '.') 
      f = open(filename, 'wb') 
      f.write(msg) 
      f.close() 
      print filename, "Recieved" 
     else: 
      pass 

class Worker(QThread): 
    def __init__(self): 
     QThread.__init__(self) 
     self.exiting = False 

    def __del__(self): 
     self.exiting = True 
     self.wait() 

    def run(self): 
     source_ip = '' 
     #socket.gethostbyname(socket.gethostname()) 
     PORT = 9001 
     ### Initialize socket 
     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     server_socket.bind((source_ip, PORT)) 
     # 
     server_socket.listen(5) 
     read_list = [server_socket] 
     ### Start receive loop 
     while True: 
      readable, writable, errored = select.select(read_list, [], []) 
      for s in readable: 
       if s is server_socket: 
        conn, addr = s.accept() 
        read_list.append(conn) 
       else: 
        msg = conn.recv(12024) 
        if msg:     
         cmd, msg = ord(msg[0]),msg[1:] 
         if cmd == CMD_FILE: 
          if not msg: break 
          self.emit(SIGNAL('triggered(PyQt_PyObject)'), msg) 
        else: 
         s.close() 
         read_list.remove(s) 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    win = MainWindow() 
    win.setWindowTitle('CATS!!! <3') 
    win.show() 
    sys.exit(app.exec_()) 
+0

意味のあるヘルプを提供するのに十分な情報がありません。あなたの問題を示すより完全な例を掲載する必要があります。 – ekhumoro

答えて

0

私は正確にあなたの状況を理解していないと思う:

はここで働い例です。
しかし、新しい(カスタム)信号を定義しようとしましたか?
pyqtSignal
で新しい信号を定義する場合は、パラメータで信号を放出できます。

Documentation on signal and slots (new style)

関連する問題