Python Forum
[PyQt4] Is it right python coding scheme between TCP Server Thread and GUI class ?
Thread Rating:
  • 2 Vote(s) - 3.5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt4] Is it right python coding scheme between TCP Server Thread and GUI class ?
#1
Hi, I want to make GUI program that is a TCP image server.
I make a GUI frame using a QT desinger .

It works fine though, I am not used to programming with python.
I wondering it is right way..

TCP Server performs TCP server thread. When it finished to download a file, sending signals to Dialog to Refresh.
And Progress bar is also programmed using signal/slot.

Is there an idea to be better..?

# -*- coding: utf-8 -*-


from PyQt4.QtGui import *
import sys
import os
from PyQt4 import QtCore, QtGui
import socketserver
from os.path import exists
import time, datetime
import threading
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
from PyQt4.QtCore import *

HOST = ''
PORT = 7777
progressBar_statusValue =0

# MyDiag.py 모듈 import
import test1

class MySignal(QtCore.QObject):
    signal1 = QtCore.pyqtSignal(QtCore.QObject)
    def run(self):
        self.signal1.emit(self)

class MySignal2(QtCore.QObject):
    signal2 = QtCore.pyqtSignal(QtCore.QObject)
    def run(self):
        self.signal2.emit(self)

mysignal = MySignal()
mysignal2 = MySignal2()

# MyDiag 모듈 안의 Ui_MyDialog 클래스로부터 파생
class XDialog(QDialog, test1.Ui_Dialog):
    global progressBar_statusValue

    def __init__(self):
        QDialog.__init__(self)
        # setupUi() 메서드는 화면에 다이얼로그 보여줌
        self.setupUi(self)
        self.pushButton.clicked.connect(self.run)
        self.pushButton_2.clicked.connect(self.imageRefresh) 
        
        mysignal.signal1.connect(self.imageRefresh)
        mysignal2.signal2.connect(self.resetProgressbar)

    def run(self):
        runServer()
        while progressBar_statusValue < 100:
            self.progressBar.setValue(progressBar_statusValue)
        self.progressBar.setValue(100)
		
    @pyqtSlot()
    def imageRefresh(self):
        #self.setupUi.label.setText("첫번째 버튼")
        im = Image.open('download/test.jpg') # Image Open & Resize
        size = (500,500)
        im.thumbnail(size)
        im.save('download/test.jpg')         # added by tom
        self.label.setPixmap(QPixmap("download/test.jpg"))

    @pyqtSlot()
    def resetProgressbar(self):
        while progressBar_statusValue < 100:
            self.progressBar.setValue(progressBar_statusValue)
        self.progressBar.setValue(100)

class MyTcpHandler(socketserver.BaseRequestHandler):
    def handle(self):
        global progressBar_statusValue
        dataTransferred = 0
        print('[Connected to: %s]' %self.client_address[0])
		
        fileInfo = self.request.recv(1024) # 클라이언트로 부터 파일이름을 전달받음
        fileInfo = fileInfo.decode() # 파일이름 이진 바이트 스트림 데이터를 일반 문자열로 변환
		
        fileInfo_parsing = fileInfo.split(',')
        fileName = fileInfo_parsing[0]
        fileSize = fileInfo_parsing[1]
        print('[fileSize] : ', str(fileSize))

        f = open('download/' + fileName, 'wb')
        data = self.request.recv(4096)
        cur_time = datetime.datetime.now()
        mysignal2.run()
        while  data:
            f.write(data)
            dataTransferred += len(data)
            progressBar_statusValue = ( dataTransferred/int(fileSize) ) * 100
            data = self.request.recv(4096)
        cur_time1 = datetime.datetime.now()

        print('[recved time] : ', str(cur_time))
        print('[recved1 time] : ', str(cur_time1))
        print('[File]: %s , [Size]: %d Bytes' %(fileName, dataTransferred))
        print('[Comeplete]')
        print('[recving time] : ', str(cur_time1-cur_time))
        mysignal.run() 

def runServer():
    print('[Server Start]')
    print("[To terminate, Press 'Ctrl + C']")
 
    try:
        server = socketserver.TCPServer((HOST,PORT),MyTcpHandler)
        #server.serve_forever()
        threading.Thread(target=server.serve_forever).start()
    except KeyboardInterrupt:
        print('[Terminate]')	

app = QApplication(sys.argv)
dlg = XDialog()
dlg.show()
app.exec_()
Reply


Messages In This Thread
[PyQt4] Is it right python coding scheme between TCP Server Thread and GUI class ? - by KimTom - Sep-17-2018, 04:00 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyQt] PyQt4 dynamic QComboBox littleGreenDude 4 5,677 Jan-02-2019, 07:22 PM
Last Post: littleGreenDude
  [PyQt] PyQt4 handle dynamic checkbox click littleGreenDude 1 6,581 Dec-27-2018, 09:17 PM
Last Post: littleGreenDude
  PyQt4 installation frustration littleGreenDude 4 4,538 Dec-27-2018, 04:29 PM
Last Post: littleGreenDude
  How to Integrate PyQt4 Custom Widget with Qt Designer Zukias 1 3,912 Aug-29-2018, 05:33 PM
Last Post: Zukias
  Updating Python version from command prompt and Conversion from PyQt4 to PyQt5 Vysero 4 4,954 Jul-19-2018, 03:15 PM
Last Post: Vysero
  Trouble displaying an image in PyQt4 Vysero 2 3,095 Jul-01-2018, 05:25 PM
Last Post: Alfalfa
  [PyQt] problem with PyQt4 jss15497 0 2,761 Jan-16-2018, 08:32 AM
Last Post: jss15497
  [PyQt] Learn pyqt5 using pyqt4 jimclay75051 5 5,767 Nov-13-2017, 06:29 AM
Last Post: zykbee
  How to program PyQt4 from python? medic_ward 3 4,901 Feb-27-2017, 05:11 PM
Last Post: medic_ward
  PyQT4 only upper case text iFunKtion 1 3,673 Feb-27-2017, 01:13 PM
Last Post: Raures

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020