강사님이 피보나치(?)모양처럼 비슷하게 만들어보라고 하셨다.

위와같은 그림으로 만들어야 하는데

사용한 코드는 아래와 같다.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    table{
        border-collapse: collapse;
    }
    td{
        border:1px solid black;
        text-align: center;
    }
</style>
<body>
    <table>
        <tr>
            <td width="100px" height="50px" colspan="3">A</td>
        </tr>
        <tr>
            <td width="50px" height='50px' rowspan="2">B</td>
            <td width='25px' height='25px'>C</td>
            <td width='25px' height='25px'>D</td>
        </tr>
        <tr>
            <td height='25px'>E</td>
            <td height='25px'>F</td>
        </tr>
    </table>
</body>
</html>

table에서 

첫번째 tr에 A,A,A

두번째 tr에서 B,C,D

세번째 tr에서 B,E,F를 놓는 방식으로 하고

 

전체 높이와 너비를 100px로 맞추는 식으로 해서 위와같은 모양을 만들게 되었다.

 

다음으로 위 그림과같은 표를 만들어 보았는데 코드는 다음과같다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    table{
        border-collapse: collapse;
    }
    td{
        border:1px solid black;
        text-align: center;
    }
</style>
<body>
    <table>
        <tr>
            <td width='25px' height='25px'>1</td><td width='25px'>2</td><td colspan="2" rowspan="2">5</td>
        </tr>
        <tr>
            <td width='25px' height='25px'>3</td><td width='25px'>4</td>
        </tr>
        <tr>
            <td rowspan="2" colspan="2">B</td> <td width='25px' height='25px'>C</td>  <td width='25px'>D</td>
        </tr>
        <tr>
            <td height='25px'>E</td><td>F</td>
        </tr>
    </table>
</body>
</html>

이번에는  표를

1,2,5,5

3,4,5,5

B,B,C,D

B,B,E,F

로 놓고 겹치는 부분들을 cospan, rowspan을 사용하여 합쳐서 위와같은 표를 만들게 되었다.

'국비지원학원 > HTML' 카테고리의 다른 글

공부한 HTML의 Tag 정리  (0) 2021.10.26
HTML  (0) 2021.10.26
<strong>...</strong>

문자의 굵기를 굵게(강조)

 

<img src="이미지의 주소 or 이미지의 경로">

이미지 삽입

 

이미지 크기 조정

 

width='50px'  너비

height='50px' 높이

length='50px' 길이

depth='50px' 깊이

위의 4개중 한개를 골라서 사용

 

<p>.......</p>

하나의 문단 개념으로

<p>와 </p>태그로 내용을 감싸면, 내용의 위아 아래쪽에 일정한 크기의 공백이 생긴다.

 

<pre>.....</pre>

pre는 'preformatted' 약자로, <pre></pre> 태그 내에 있는 
엔터와 스페이스가 그대로 웹 브라우저에 적용되어 보여지게 된다.

 

<br>

html은 <p>태그나 <pre>태그를 사용하지 않으면 스페이스바 또는 엔터를 인식하지 못한다.

그럴때 <br> 태그를 사용하면 엔터를 한번 친것으로 간주한다.

 

<a href="imalright.tistory.com">내 블로그로 이동</a>

<a>코드 내에 href를 사용하면

하이퍼링크를 만들 수 있는데 위에있는 코드처럼 주소를 적지 않고

같은경로내에있는 html 또는 html의 경로를 적어준다면 하이퍼링크를 클릭시 html파일이 열리게 된다.

 

<h1>...</h1>, <h2>...</h2>, <h3>...</h3>, ...

헤드라인 태그라고한다. 주로 제목으로 넣을때 사용하는 태그이다.

숫자가 커질수록 글자 크기가 작아진다.

 

<ul>
    <li>...</li>
    <li>...</li>
</ul>

Unordered List

순서가 없는 리스트를 생성한다.

위의 코드처럼 <li>...</li>사이에 내용을 적어서 사용한다.

순서가 없기에

●...

●...

이런식으로 내용이 나오게 된다.

 

<ol>
    <li>...</li>
    <li>...</li>
</ol>

Ordered List

순서가 있는 리스트를 생성한다.

앞에서 말했던 Unordered List와 비슷하지만

순서가 있기 때문에

1.....

2.....

이런식으로 내용이 나온다.

 

<em>....</em>

글자를 살짝 기울여준다. 위 태그도 주로 글자를 강조할때 사용한다.

 

<i lang="uk-latn">...</i>

<i>태그

안에있는 내용의 글꼴을 라틴어로 바꿔준다 lang="..."안에 다른나라의 언어를 넣는다면

그쪽의 글꼴로 바꾸어준다.

 

<em> = <i>비슷하고
<strong> = <b>

tooltip*
절대경로 - Root폴더로부터의 경로 F:\\NCSClass\\HTML\\hi.html
상대경로 - 현재 html파일이 있는 곳으로부터의 경로 hi\\hello.html

 

같은페이지 내 이동

<a href="#이름">....</a>

 을 사용하면 동일페이지의 id가 있는 위치로 이동하게됨
다른페이지의 원하는 위치로 이동

<a href="hi\\first.html#hello">hello로 이동</a>


를 사용하면 hi directory에있는 Flower.html로 이동한뒤 hello라는 id가 있는곳으로 이동하게 된다.


html에서는 몇몇 단어나 스페이스바 특수문자는 태그로 인식해버리기 때문에 내용 중간에 삽입하고 싶다면

&lt; = <  여는꺾쇠를 출력할때 사용
&gt; = > 닫는꺾쇠를 출력할때 사용

&nbsp; (공백, 스페이스바한칸)
&amp; & 앰퍼샌드, &문자를 출력하고싶을때 사용

&quot; = " 큰따옴표 하나

위에있는 단어를 사용해야 한다.

 

약어

<abbr title="Hypertext Markup Language">HTML</abbr>

HTML에 .....으로 및줄을 치고 마우스를 가져다대면 설명이 나오게 한다.

 

<sup>...</sup> 위첨자
<sub>...</sub> 아래첨자

첨자를 넣고 싶을 때 사용한다.

 

표를 만들 때에는

<table>...</table>

태그를 사용하는데 위에있는 이 table 태그에는 

행과 열을 다 일일히 넣어주어야 한다.

<tr> - 행
<td> - 열
<!--표 행:3, 열:4-->
    <table border=1>
        <caption>Tabel 3행 4열</caption>
    <thead>
        <tr><th>이름</th><th>성별</th><th>생일</th><th>지역</th></tr>
    </thead>
    <tbody>
    <tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
    <tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
    <tr><td>9</td><td>10</td><td>11</td><td>12</td></tr>
    </tbody>
    </table>

행이 3개고 열이 4개인 표를 만들때 사용한 예제이다

 

table 에서 caption, thead, tbody, tfoot까지 있지만 잘 사용하지는 않는다
caption = 표의 제목
thead = 표의 맨위에 이름설정
tbody = 표의 몸통

 

style 태그를 따로 css파일로 만들어서 넣어줄 수 있다.

css파일을 내가현재 사용하는 html파일에서 사용하려면 

<head>...</head> 사이에

<link rel='stylesheet' type='text/css' href='style.css'>

를 써준다면 style.css파일을 불러와서 사용할 수 있다.

위 방법을 사용한다면 코드를 깔끔하게 작성할 수 있다.

 

<style>...</style>

style태그는 head에 넣어도 되고 body에 넣어도되고 html 태그 밖에 넣어도 동작한다.

그리고 위 태그를 사용하는 예제로는

<style>
    table{
        border-collapse: collapse;
    }
    td{
        border:1px solid blue;
        width: 60px; 
    }
    th{
        border:1px solid blue;
        width: 100px;
        background-color: black;
        color: yellow;
    }
</style>

위처럼 <th>, <td>에 고정된 값을 넣어줄때도 사용하고

 

<style>

.brd3{
    background-color: aqua;
    color: black;
    border-collapse: collapse;
    width: 50px;
    height: 30px;
}

</style>

이때처럼 class를 만들어 줄 때에도 사용한다.

 

css(style) 적용법으로는 
1. inline style - tag안에 적용
2. <style>...</style>안에 적용
3. css파일에 적용 하는 방법들이 있는데


우선순위로는

1 > 2 > 3 순으로

1번이 가장 우선으로 적용되고 2번 그후 3번이 적용된다.

 

HTML의 text정렬

alignment
왼쪽 / 중간 / 오른쪽
left / center / right

vertical alignment
위 중간 아래
top / middle / bottom
사용법으로는

<style>
    td{
        text-align: center;
    }
    th{
        vertical-align: middle;
    }
</style>

처럼 text-align을 사용하면 좌우중 중간으로 적용되고

vertical-align을 사용한다면 위아래중 중간으로 적용되게 된다.

 

text-align에서 left는 default값이므로 궂이 설정할필요 없다.

 

<table>을 사용할때 셀을 병합하는 방법으로는

열과 열이 병합 (가로셀끼리 병합) -> colspan
행과 행이 병합 (세로셀끼리 병합) -> rowspan

대신 사용하려면 같은 값을 사용할 때 만 사용에 용이하고
위에서 아래로 병합하거나 왼쪽에서 오른쪽으로 병합을 할 때 뒤에있던
<td> or <th>는 지워줘야한다. 그렇지않으면 오류가 날수도 있다.

'국비지원학원 > HTML' 카테고리의 다른 글

<table>태그 응용  (0) 2021.10.26
HTML  (0) 2021.10.26

HTML에서 추천하는 기본 구조

<html>
<head>
	<meta>
    <title>
</head>
<body>
	<header></header>
    <nav></nav>
    <main>
    <article></article>
    <aside></aside>
    </main>
    <footer></footer>
</body>
</html>

을 기본 구조로 갖는다.

'국비지원학원 > HTML' 카테고리의 다른 글

<table>태그 응용  (0) 2021.10.26
공부한 HTML의 Tag 정리  (0) 2021.10.26

1. 세미콜론 ( ; )

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

 

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

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

 

 

2. 주석

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

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

 

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

 

3. 들여쓰기

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

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

 

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

 

4. 코드블록

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

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

 

 

 

 

 

왼쪽코드에서

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

 

 

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

 

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

*사용 부품

서보모터 1개

LED 2개 (Green, Yellow)

조도센서(CDS) 1개

부저 1개

 

*기능 설명

1. 초음파 센서에 10cm이하의 거리일 때 Servo모터가 작동해서 차단바가 올라가고 부저가 울림

2. CDS센서가 가려지면 LED_Y가 켜지고 LED_G가 꺼짐

 

*동작영상

*전체 소스코드

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <softPwm.h>
#include <softTone.h>
#include <string.h>
#include <errno.h>

#define Buzzer 28
#define Servo 1
#define LED_G 6
#define LED_Y 5
#define micro_trig 23
#define micro_echo 24
#define CDS 7

int Warning[11] = {0,659,0,659,0,659,0,659,0,659,0};

int main ()

{
  
  int start_time, end_time;
  float distance;


  if(wiringPiSetup() == -1) exit(1);
  softToneCreate (Buzzer);

  pinMode(LED_G, OUTPUT);
  pinMode(LED_Y, OUTPUT);
  pinMode(Servo, PWM_OUTPUT);
  pinMode(micro_trig, OUTPUT);
  pinMode(micro_echo, INPUT);
  pwmSetMode(PWM_MODE_MS);
  pinMode(CDS, INPUT);
  pwmSetClock(384);
  pwmSetRange(1000);

  while(1)
  {
	  
	  
	  //초음파센서
    digitalWrite(micro_trig, LOW);
    delay(1500);
    digitalWrite(micro_trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(micro_trig, LOW);
    while (digitalRead(micro_echo) == 0);
    start_time = micros();
    while (digitalRead(micro_echo) == 1);
    end_time = micros();
    distance = (end_time - start_time) / 29. / 2.;
    printf("distance %.2f cm\n", distance);
	//초음파센서 끝
	
 
//초음파센서 + 서보모터 + 부저
	
	//CDS + LED
	
      
	
	if(distance < 10.00 && digitalRead(CDS) == HIGH){
	pwmWrite(Servo, 120);
	digitalWrite(LED_Y, HIGH);
	digitalWrite(LED_G, LOW);

	for (int i = 0; i < 11; ++i)
    {
      
      softToneWrite(Buzzer, Warning[i]);
      delay (200);
    }
      }
  
	else if(distance > 10.00 && digitalRead(CDS) == HIGH){
	pwmWrite(Servo,75);
	digitalWrite(LED_Y, HIGH);
	digitalWrite(LED_G, LOW);
	}
      
	else if(distance < 10.00 && digitalRead(CDS) == LOW){
	pwmWrite(Servo, 120);
	for (int i = 0; i < 11; ++i)
    {
      
      softToneWrite(Buzzer, Warning[i]);
      delay (200);
    }
	digitalWrite(LED_Y, LOW);
	digitalWrite(LED_G, HIGH);
      }
	else if(distance > 10.00 && digitalRead(CDS) == LOW)
	{
	  pwmWrite(Servo,75);
	  digitalWrite(LED_Y, LOW);
	  digitalWrite(LED_G, HIGH);
	  
	}

	
}
  return 0 ;
 }

 

OpenCV(Open source Computer Vision) 란 실시간 컴퓨터 비전을 처리하는 목적으로 만들어진 라이브러리다.

컴퓨터 비전은 영상처리를 포함하는 포괄적인개념이다. 영상처리가 원본영상을 사용자가 원하는 영상으로 바꿔주는 기술이라면, 컴퓨터비전은 영상에서 의미있는 정보를 추출해주는 기술이다.

예로써 객체검출(Object Detection), 객체추적(Object Tracking), 객체인식(Object Recognition)이 있다.

 

객체 검출(Object Detection) : 영상속에서 찾고싶은 물체가 어디있는지 검출하는 작업

객체 추적(Object Tracking) : 영상속 물체가 어디로 움직이는지 추적하는 작업

객체 인식(Object Recgnition) : 영상속 물체가 무엇인지 인식하는 작업

 

OpenCV설치

pip install opencv-contrib-python

opencv엑스트라(contrib)를 포함한 opencv-python 설치

 

필요 모듈 설치

pip install numpy

pip install matplotlib

로 필요 모듈들을 설치합니다.

 

모듈들을 설치된것을 확인하려면

pip list

를사용하여 pip을 이용하여 파일이 설치되었는지 직접찾거나

 

프롬프트창에서 python을 실행시킨뒤

>>> import numpy
>>> numpy.__version__
'1.18.5'


>>> import cv2
>>> cv2.__version__
'4.4.0.44'


>>> import matplotlib
>>> matplotlib.__version__
'3.2.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_())

 

입니다.

+ Recent posts