Sep-17-2018, 04:00 AM
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..?
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_()
