1. 세미콜론 ( ; )

우리가 여러 언어를 배우며 구문이 끝날때 ; (세미콜론)을 붙여야된다고 배웠지만 파이썬에는 세미콜론을 붙이지 않는다.

 

그러나, 세미콜론을 붙여도 문법적으로 에러는 발생하지 않는다. 보통적으로 한 줄에 여러 구문을 사용할 때 세미콜론으로 구분한다.

C언어에서 세미콜론을 제거헀을 때 생기는 오류
파이썬에서 세미콜론을 넣거나 빼도 문제없이 실행이 된다.

 

 

2. 주석

코드를 작성할 때 사람만 알아볼 수 있도록 작성하는 부분을 주석이라고 한다.

주석은 파이썬 인터프리터가 처리하지 않음으로 프로그램의 실행에는 영향을 끼치지 않는다.

 

파이썬에서 1줄주석, 여러줄 주석을 사용하는 방법

 

3. 들여쓰기

들여쓰기란 코드를 읽기 쉽게 일정한 간격을 작성하는 방법이지만 파이썬은 들여쓰기 자체가 문법이다.

들여쓰기방법은 스페이스바2, 4, 탭 등 여러가지 방법이 있다.
어떤 공백을 사용해도 동작이 잘 되지만 파이썬 코딩 스타일 가이드(PEP 8)에서는 공백4칸으로 규정하고있다.

 

파이썬에서 들여쓰기를 사용하지 않았을때와(위) 들여쓰기를 사용하였을 때(아래)

 

4. 코드블록

코드블록은 특정한 동작을 위해서 코드가 모여 는 상태를 말한다.
파이썬은 들여쓰기를 기준으로 코드블록을 구성한다.

단, 같은블록은 들여쓰기 칸 수가 같아야하고, 공백과 탭을 섞어 쓰면 안된다.

 

 

 

 

 

왼쪽코드에서

탭1칸(위), 탭2칸(아래) 를 사용할경우 들여쓰기에러가 나오는 것을 볼 수있고

 

 

탭1칸(위), 탭1칸+스페이스바 2칸(아래) 를 사용하여도 들여쓰기 에러가 나오는 것을 볼 수 있다.

 

이처럼 들여쓰기에 사용하는 공백이 서로 다르다면 들여쓰기가 성립하지 않는 것을 볼 수 있다.

오늘해본것은 PyQt에서 QPushButton을 클릭했을때 이미지를 띄우는프로그램을 만들어 보겠습니다.

 

일단 명령프롬프트 (CMD)창에 pip를 이용해 설치해야합니다.

pip install numpy
pip install matplotlib
pip install opencv-python
pip install opencv-contrib-python
pip install opencv-python-headless

를 설치해주어야 합니다.

설치가 완료되었다면 

import cv2

를 해주시면 됩니다.

import sys
import cv2
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Main(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 조직도 버튼
        btn3 = QPushButton('GPIO Pin View')
        btn3.setToolTip('GPIO조직도')
        btn3.clicked.connect(self.GPIO)

        hbox = QHBoxLayout()
        hbox.addWidget(btn3)

        self.setLayout(hbox)
        # 타이틀
        self.setWindowIcon(QIcon('raspberry.png'))
        self.setWindowTitle('raspberry')
        #창 크기,좌표
        self.setGeometry(1000, 150, 300, 200)
        self.show()

    def GPIO(self):
        img = cv2.imread('rasp.png');  # 이미지 불러오기
        cv2.imshow("GPIO PIN", img);  # 이미지 보여주기 (윈도우창 이름, 불러온 이미지)

        k = cv2.waitKey(0)  # 키보드 눌림 대기
        if k == 27:  # ESC키
            cv2.destroyAllWindows();
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

전체 소스코드입니다.

 

이미지는 제가 하던프로젝트에서 사용하던 라즈베리파이GPIO핀을 연결해준 이미지를 가져왔습니다.

실행시화면입니다.

버튼을 눌렀을떄 나오는 화면입니다.

눌렀을때 나오는 창의 크기는 이미지의 크기와 동일합니다.

제가 사용할 PyQt는 QPushButton, QTextBrowser, QTextEdit, QLabel입니다.

소켓통신부분은

twobeach.tistory.com/21

 

투비치

yolo,c언어,라즈베리파이,소켓 등등 개발자 툴 다루는 블로그

twobeach.tistory.com

위 블로그에서 참고했습니다.

서버쪽코드는 위블로그에서 참고해주시기바랍니다.

 

제가 만들려는 프로그램은 QEditText에 c언어로 코드를 작성한 뒤 Build버튼을 누르면 써놓은 코드가 main.cpp로 저장이된 후 소켓통신을 통해 서버에 코드가전송이 되고 파일을 컴파일 한 뒤에 에러가 있으면 에러를 보내주고 완료했으면 완료되었다고 QTextBrowser에 띄워주는 PyQt프로그램입니다.

 

최종결과창입니다.

Build버튼부분 코드입니다.

btn1 = QPushButton('Build')
btn1.clicked.connect(self.build_btn)

Code라고써진QLabel과 QEditText에 setting.txt를 고정으로 넣어준부분의 코드입니다.

lbl2 = QLabel('Code')
self.te = QTextEdit()
setting = open('setting.txt').read()
self.te.setPlainText(setting)

 

Run이라고 써진 QLabel과 QTextBrowser부분의 코드입니다.

lbl3 = QLabel('Run')
self.qle2 = QTextBrowser()

 

전체 레이아웃 세팅입니다.

hbox = QHBoxLayout()
hbox.addWidget(btn1)

hhbox = QHBoxLayout()
hhbox.addWidget(lbl3)

vbox = QVBoxLayout()
vbox.addWidget(lbl2)
vbox.addWidget(self.te)
vbox.addLayout(hhbox)
vbox.addWidget(self.qle2, 0, QtCore.Qt.AlignBottom)

lvbox = QVBoxLayout()
lvbox.addLayout(hbox)
lvbox.addLayout(vbox)

self.setLayout(lvbox)

QHBoxLayout은 가로로레이아웃정렬  (H = Horizon)

QVBoxLayout은 세로로레이아웃정렬  (V = Vertical)

 

전체코드는

 

import os
import socket
import sys
import time
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *



class Main(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        btn1 = QPushButton('Build')
        btn1.clicked.connect(self.build_btn)

        lbl2 = QLabel('Code')
        self.te = QTextEdit()
        setting = open('setting.txt').read()
        self.te.setPlainText(setting)

        lbl3 = QLabel('Run')
        self.qle2 = QTextBrowser()

        hbox = QHBoxLayout()
        hbox.addWidget(btn1)

        gkwl = QHBoxLayout()
        gkwl.addWidget(lbl3)

        vbox = QVBoxLayout()
        vbox.addWidget(lbl2)
        vbox.addWidget(self.te)
        vbox.addLayout(gkwl)
        vbox.addWidget(self.qle2, 0, QtCore.Qt.AlignBottom)

        lvbox = QVBoxLayout()
        lvbox.addLayout(hbox)
        lvbox.addLayout(vbox)

        self.setLayout(lvbox)

        # 타이틀
        self.setWindowIcon(QIcon('raspberry.png'))
        self.setWindowTitle('raspberry')
        #창 크기,좌표
        self.setGeometry(1000, 150, 800, 700)
        self.show()

    def build_btn(self):
        if len(self.te.toPlainText()) == 0:
            return


        name = ('main') + '.cpp'
        content = self.te.toPlainText()
        filename = os.getcwd() + '\\' + name
        mkfile = open(filename, 'w')
        mkfile.write(content)
        mkfile.close()
		
        ##소켓통신 클라이언트##
        
        HOST = '192.168.0.19'
        PORT = 6322
        ADDR = (HOST, PORT)

        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect(ADDR)
        print("connect server complete")
        time.sleep(1)
        send_msg = '1'

        client_socket.sendall(send_msg.encode('utf-8'))
        print("send file to server start!")
        f = open('main.cpp', 'rb')
        while True:
            SendData = f.read(10000)
            while SendData:
                client_socket.send(SendData)
                SendData = f.read(10000)
            if not SendData:
                f.close()
                client_socket.close()
                break

        print("first file socket complete")


        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect(ADDR)
        send_msg = '2'

        client_socket.sendall(send_msg.encode('utf-8'))
        print("receive file to server start!")

        with open('output.txt', 'wb') as f2:
            print("receive file opened...")
            while True:
                print("receive output.txt data...")
                data2 = client_socket.recv(10000)
                if not data2:
                    f2.close()
                    break
                f2.write(data2)
        print("complete file receive")
        client_socket.close()

        time.sleep(2)
        output = open('output.txt').read()
        self.qle2.setPlainText(output)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

 

입니다.

기능 설명

1. 버튼 클릭시 QDialog를 띄운다.

2. QDialog에서 선택한 파일(txt, c, cpp되는것 확인)의 내용을 가져와서 띄움

 

소스코드

from PyQt5.QtWidgets import QWidget, QPushButton, QFileDialog, QApplication, QLabel, QTextEdit, QVBoxLayout
import sys

class Main(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #불러오기 버튼
        btn1 = QPushButton('불러오기')
        btn1.clicked.connect(self.load_btn)

        lbl1 = QLabel('Text')
        #불러온 텍스트를 표시할 창
        self.te = QTextEdit()

        vbox = QVBoxLayout() #세로로정령
        vbox.addWidget(btn1)
        vbox.addWidget(lbl1)
        vbox.addWidget(self.te)


        self.setGeometry(1000, 150, 800, 700)
        self.setWindowTitle('TxTLoad')
        self.setLayout(vbox)
        self.show()

    def load_btn(self):
        fname = QFileDialog.getOpenFileName(self, './')

        if fname[0]:
            f = open(fname[0], 'r')

            with f:
                data = f.read()
                self.te.clear()
                self.te.setPlainText(data)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

코드 설명

불러오기 버튼을 누르면 

이렇게 QFileDialog가 뜨는데 txt파일을 선택하면

이런식으로 안에있던 내용이 불러와지는것을 확인할 수 있습니다.

제가 해봤을땐 txt, c, cpp파일들은 텍스트가 불러와진것으로 확인했습니다

+ Recent posts