반응형

owl carousel 한 화면에 여러개의 이미지를 나타내며 돌아가는 기능을 합니다.

 

1. 다운로드

owlcarousel2.github.io/OwlCarousel2에서 압축 파일을 다운로드 합니다. 필요한 파일은 dist\assets폴더 내부의 css파일과 src\js폴더에 있는 js 파일입니다. 그리고 jquery파일도 필요하니 다운받아놓습니다.

 

 

Home | Owl Carousel | 2.3.4

Modules and Plugins Owl Carousel supports plugin modular structure. Therefore, you can detach plugins that you won't use on your project or create new ones that fit your needs

owlcarousel2.github.io

 

2. 샘플 예제

css, js를 폴더별로 정리하고, index.html을 아래와 같이 작성합니다.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Owl Carousel</title>
    <link rel="stylesheet" href="css/owl.carousel.css" />
    <link rel="stylesheet" href="css/owl.theme.default.css" />
</head>

<body>
    <div id="wrapper">
        <div class="owl-carousel owl-theme">
            <div class="item">
                <img src="images/puppy-1.jpg">
            </div>
            <div class="item">
                <img src="images/puppy-2.jpg">
            </div>
            <div class="item">
                <img src="images/puppy-3.jpg">
            </div>
            <div class="item">
                <img src="images/kitten-1.jpg">
            </div>
            <div class="item">
                <img src="images/kitten-2.jpg">
            </div>
            <div class="item">
                <img src="images/kitten-3.jpg">
            </div>
        </div>
    </div>

    <script src="js/jquery-3.5.1.min.js"></script>
    <script src="js/owl.carousel.js"></script>
    <script src="js/owl.autoplay.js"></script>
    <script src="js/owl.navigation.js"></script>
    <script>
        $(function () {
            $('.owl-carousel').owlCarousel({
                items: 3,
                margin: 10,
                loop: true,
                nav: true,
                navText: ['이전', '다음'],
                autoplay: true,
                autoplayTimeout: 3000,
                autoplayHoverPause: true
            });
        });
    </script>
</body>

</html>

<script>설명

items: 3 -> 한 화면에 3개의 이미지씩 보여줌
margin: 10 ->항목 사이의 간격을 10
loop: true -> 무한 반복
nav: true ->내비게이션 버튼 추가
navText: ['이전', '다음'] ->내비게이션 위에 '이전/다음' 버튼 추가
autoplay: true -> 자동 스크롤 실행
autoplayTimeout: 3000 -> 자동 스크롤 시간 간격
autoplayHoverPause: true -> 마우스 포인터를 올리면 자동 스크롤 일시 정지

 

3. 그림 다운로드

unsplash 사이트에서 적당한 이미지 다운로드합니다. 사이즈 조절도 균일하게 조절할 겸 Figma에서 불러와 jpg로 export하여 이미지를 마련했습니다. 모은 이미지들을 /images 폴더에 저장합니다.

 

4. 결과

반응형
반응형

 

1. bxSlider 프러그인 다운로드

bxslider.com에서 다운로드에서 다운로드 가능합니다. 링크로 연결하는 방법이 기본으로 나와있는데, The other ways에 직접 다운로드하여 사용할 수 있도록 다운로드 경로도 제공합니다. 그리고 jquery도 필요하니, 다운받아놓습니다.

 

 

jQuery Content Slider | Responsive jQuery Slider | bxSlider

Coded with ♥ by

bxslider.com

 

2. 복사하기

압축을 풀면 dist 폴더 안에 있는 css파일과 js파일을 원하는 폴더로 옮겨서 사용합니다. 주의할 점은 images 폴더를 css 파일들을 옮겨놓은 폴더에 함께 복사해 놓아야 한다는 점입니다. 이 이미지는 스타일시트에서 사용하는 이미지들입니다.

 

 

3. 샘플 코드

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Carousel using bxSlider.js</title>
    <link rel="stylesheet" href="css/jquery.bxslider.css">
    <style>
        #wrapper {
            width: 600px;
            margin: 0 auto;
        }
    </style>
</head>


<body>
    <div id="wrapper">
        <div class="bxslider">
            <div>
                <img src="images/Things-1.jpg" title="slider 1">
            </div>
            <div>
                <img src="images/Things-2.jpg" title="slider 2">
            </div>
            <div>
                <img src="images/Things-3.jpg" title="slider 3">
            </div>
            <div>
                <img src="images/Things-4.jpg" title="slider 4">
            </div>
        </div>
    </div>

    <script src="js/jquery-3.5.1.min.js"></script>
    <script src="js/jquery.bxslider.js"></script>
    <script>
        $(function () {
            $('.bxslider').bxSlider({
                slideWidth: 600,
                caption: true,
                auto: true,
                autoControl: true,
                stopAutoOnclick: true,
            });
        });
    </script>
</body>

</html>

<script> 코드 설명:

  slideWidth: 600 -> 슬라이드의 폭은 600,

  caption: true -> 마우스 오버 시 그림 캡션 표시 true,

  auto -> 자동재생,

  autoControl -> 컨트롤 버튼(재생/정지) 표시

  stopautoOnclick: true -> 클릭해서 자동 실행 멈출 수 있도록 지정

 

추가로, 중앙정렬 옵션이 없기 때문에 style 정의에서 margin: 0 auto 옵션이 필요함.

4. 결과

반응형
반응형

오늘은 KB 부동산시세 사이트에서 제공하는 데이터를 이용해 각 셀의 값을 참조하는 방법에 대해 알아보겠습니다. 테스트를 위해 엑셀은 서식을 없애고 숫자만 표시되도록 했는데요, 아래의 엑셀 차트에 대해 일정 범위별로 수식을 적용하여 색깔을 표시하도록 하는 방법을 알아보겠습니다. (물론 엑셀 활용 측면에서는 조건부 서식으로 지정하는 것이 더 간단할 수도 있습니다만, xlwings 공부하는 차원에서 봐주시기 바랍니다.)

원본
작업 후

1. 엑셀 매크로 추가

엑셀 파일의 이름은 pyxl.xlsm으로 매크로가 가능한 엑셀파일 형태로 저장해둡니다. 그리고 엑셀에서 Python 코드를 불러올 수 있도록 VBA를 작성해줍니다.

Sub some_code()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".main()"
End Sub

 

2. Python 스크립트 작성

아래와 같이 Python 스크립트를 작성하여 pyxl.py로 같은 폴더에 저장해둡니다.

코드를 보시면, 2번째 시트(wb.sheets[2])를 sht로 지정하고, 데이터의 첫번째 열('B4:GG4')를 선택 후 끝까지 확장/지정하여 rng 변수에 할당합니다. 그리고 각 열, 각 칼럼을 순차적으로 범위 체크하여 셀의 색상을 지정합니다. 셀에 아무 값이 없을 경우 에러가 가므로 'is not None' 을 추가하여 빈 셀을 걸러주었습니다.

import xlwings as xw

def main():
    # object_file
    wb = xw.Book.caller()
    sht = wb.sheets[2]

    rng = sht.range('B4:GG4').expand('down')
    # 셀 별 색상 입히기
    for row in rng.rows:
        for cell in row.columns:
            if cell.value is not None:
                if cell.value < -0.4:
                    cell.color = (43, 104, 213)
                elif cell.value < -0.3:
                    cell.color = (103, 143, 215)
                elif cell.value < -0.2:
                    cell.color = (164, 188, 230)
                elif cell.value < -0.1:
                    cell.color = (209, 221, 243)
                elif cell.value < 0.1:
                    cell.color = (255, 255, 255)
                elif cell.value < 0.2:
                    cell.color = (253, 228, 157)
                elif cell.value < 0.3:
                    cell.color = (252, 202, 62)
                elif cell.value < 0.4:
                    cell.color = (255, 156, 25)
                else:
                    cell.color = (255, 117, 13)
                    
if __name__ == "__main__":
    xw.Book("pyxl.xlsm").set_mock_caller()
    main()

 

<결과>

스크립트 작성이 완료되면, 엑셀의 xlwings탭에서 'Run main'으로 실행합니다. 그런데 숫자가 아닌 텍스트가 들어있는 부분에서 에러가 나네요. 데이터를 정비하던 스크립트를 추가하던 해야겠네요.

오늘은 간단히 여기까지만 하겠습니다.

 

~~끝~~

 
반응형
반응형

현대 사회에서 엑셀의 지위는 정말... 이걸 빼고서는 업무를 상상할 수 없을 정도로 막강한데요,,, 한가지 아쉬운 점이 매크로를 작성할 때 Visual Basic을 사용한다는 것입니다. 그게 무슨 아쉬운 점이냐 하실 수도 있는데, VBA라고 하는게 처음에는 쉽다고 해서 접근해보면 딱히 쉽진 않죠. 프로그래머들도 어렵다는 VBA니까요. 물론 프로그래머는 VBA를 집중해서 파기보다는 다른 자신만의 언어(Java, Python, C# 등)가 있으니까 그럴 수도 있겠지만요.

 

하지만 파이썬은 전문 프로그래머들 뿐만 아니라 일반인들도 많이 쓰는 언어가 되어가고 있습니다. 우선 쉬우니까요. 물론 깊이 들어가면 결국 비슷하게 어려운 부분이 있지만,,, 개인적인 느낌으로는 VBA보다 쉽습니다. 가독성이 너무 좋습니다. 그래서 언젠가 저도 파이썬 공부를 하면서 엑셀 매크로를 파이썬으로 짜면 얼마나 좋을까....생각했었는데, 어느 귀하신 분께서 그런 라이브러리를 만들어 놓으셨네요. 바로 xlwings입니다. 엑셀 관련 라이브러리로는 openpyxl 등 다양한 라이브러리가 존재합니다만, xlwings는 엑셀 내부에서 외부에서 작성된 python함수를 불러와서 사용할 수 있게 하는 라이브러리입니다. 서두가 길었는데 오늘은 xlwings의 설치부터 간단한 사용에 대해서 알아보겠습니다.

 

1. 설치

저는 Window10 환경에서 Pycharm을 주로 사용하고 있습니다. 설치는 여타 라이브러리와 마찬가지로 pip 명령으로 설치합니다.

pip install xlwings

헌데, 이 라이브러리는 여기서 씉나지 않고 엑셀 Add-In을 설치해주어야 하는데요, 아래와 같이 설치할 수 있습니다.

xlwings addin install

그러면 아래 그림과 같이 xlwings탭과 함께 메뉴들이 나타납니다. Interpreter 옆에 Python 실행 경로를 입력해줍니다. (예: C:\Program Files\Python38\python.exe )

 

 

 

2. VBA개발 환경 설정

xlwings의 작동 방식은 기본적으로 VBA 매크로를 통해서 파이썬 파일을(함수를) 불러오는 것입니다. 따라서 VBA 개발도구 탭이 있어야 하는데요, 파일->옵션->리본 사용자 지정 메뉴로 들어가셔서 왼쪽의 리스트에서 개발도구를 찾아 오른쪽으로 추가하시면 됩니다. 간혹 체크가 빠져서 안보이시는 분도 있으니 주의하세요.

 

 

 

3. 매크로 실행옵션 설정

매크로 실행 옵션을 모든 매크로 포함 으로 변경해줍니다.

 

 

 

4. VBA실행 참조 추가(xlwings 추가)

마지막으로 개발 도구->Visual Basic->도구->참조 메뉴로 이동하여 xlwings 를 추가해주면 드디어 실행 환경이 완성되었습니다.

 

 

 

 

5. Sample Test (hello xlwings)

이제 준비가 되었으니, 테스트를 해보겠습니다. 엑셀 파일은 위의 설정방법에 따라 세팅만 해놓은 빈 파일입니다. 확장자는 매크로를 포함하도록 .xlsm 파일로 생성합니다. 매크로로 이용할 파이썬 파일이 필요한데요,,엑셀 파일과 같은 폴더에 동일한 이름으로 존재하도록 생성합니다. (뒤에 나올 VBA코드에서 파일명을 줄 수도 있지만, 범용성을 고려하여 이름은 동일하게 하는 것으로 하겠습니다.)

 

 

그리고 파이썬 파일을 아래와 같이 코딩해줍니다.

import xlwings as xw

def main():
    
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
   
    if sheet["A1"].value == "Hello xlwings!":
        sheet["A1"].value = "Bye xlwings!"
    else:
        sheet["A1"].value = "Hello xlwings!"


if __name__ == "__main__":
    xw.Book("pyxl.xlsm").set_mock_caller()
    main()

다음으로, 실행할 엑셀 파일에서도 python 코드를 실행하는 부분을 설정할 필요가 있습니다. 서두에 말했듯이, VBA가 파이썬 코드를 실행합니다. 따라서 개발도구-Visual Basic 메뉴를 따라 VBA편집창에서 VBAProject에서 우클릭으로 모듈을 삽입해줍니다.

 

 

다음으로 해당 모듈에 아래의 VBA코드를 작성합니다.

Sub test()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".main()"
End Sub
이 코드는 해당 엑셀 파일과 동일한 이름의 파이썬 파일을 찾아, main함수를 실행합니다. 함수명을 바꾸면 다른 함수를 실행할 수도 있습니다. Sub ... 으로 시작하는 VBA 함수 이름은 임의로 주어도 무방합니다.
다음으로 엑셀 창으로 가서 xlwings-Run Main을 클릭하여 실행해봅시다. 아래와 같이 A1셀에 python으로 입력한 텍스트가 나타나면 성공입니다.!

 

 

 

그럼 오늘도 건승을 빌겠습니다.

 

~~ 끝 ~~

 


 

(ps) Python 경로의 오류로 인해서 VBA코드 내부의 RunPython 명령을 인식하지 못하는 경우도 자주 발생하였습니다. 제일 먼저 파이썬의 경로가 맞는지 확인하시고(VENV에 xlwings가 설치되었을 수 있음), 엑셀을 모두 닫고 해당 파일만 열어 실행해보는 등 다양한 방법으로 시도해보시기 바랍니다.

 

(ps) xlwings는 quickstart기능이 있습니다. 터미널이나 윈도우 커맨드를 열어서 아래와 같이 명령을 실행하면 파이썬 파일과 엑셀 파일을 동시에 생성해줍니다. 해당 파일을 이용하여 작업하는 방법으로 쉽게 시작할 수 있습니다.

xlwings quickstart [파일명]

(ps) udf(User Defined Function) 기능은 아직 성공을 못하고 있습니다...ㅠㅠ

 
반응형
반응형

오늘은 웹 크롤링에 대해 알아보겠습니다.

go언어에서의 웹 크롤링에도 selenium과 chrome webdvier를 사용하는 방법이 있지만, selenium 개발하신 분이 현재는 관리를 중단한 상태라고 합니다. 대신 chromedp를 주로 사용한다고 합니다. 간략하게 chromedp를 알아보겠습니다.

 

우선 설치는 일반적인 go 라이브러리들과 마찬가지로 go get 명령으로 설치합니다. (깃헙링크)

go get -u github.com/chromedp/chromedp

그리고 예제는 여기링크로 가면 여러가지를 확인할 수 있습니다만, 천천히 살펴보시고

주요 method에 대한 예시로 아래 코드를 남겨놓겠습니다. (아래 코드는 실행되지는 않습니다. 추후 간단한 실행가능 예시로 업데이트 하겠습니다.)

 
package main

import (
	"context"
	"fmt"
	_ "log"
	"time"

	"github.com/chromedp/cdproto/runtime"
	"github.com/chromedp/chromedp"
)

func main() {

	// chrome 실행 옵션 설정
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.DisableGPU,		
		chromedp.Flag("headless", false),	//headless를 false로 하면 브라우저가 뜨고, true로 하면 브라우저가 뜨지않는 headless 모드로 실행됨. 기본값은 true.
	)

	contextVar, cancelFunc := chromedp.NewExecAllocator(context.Background(), opts...)
	defer cancelFunc()

	contextVar, cancelFunc = chromedp.NewContext(contextVar)
	defer cancelFunc()

	// setting 필요 없이 headless 모드로 실행할 경우 아래의 코드로 대체 가능
	// contextVar, cancelFunc := chromedp.NewContext(
	// 	context.Background(),
	// 	chromedp.WithLogf(log.Printf),
	// )
	//defer cancelFunc()

	contextVar, cancelFunc = context.WithTimeout(contextVar, 50*time.Second)	// timeout 값을 설정 
	defer cancelFunc()

	var strVar string
	err := chromedp.Run(contextVar,

		chromedp.Navigate(`https://www.google.com/`),	// 시작 URL
		chromedp.WaitVisible(`body`),		//body 요소를 모두 불러들일 때까지 대기
		chromedp.InnerHTML(`pre`, &strVar),	// pre 태그의 내부 텍스트를 strVar변수에 입력
        	chromedp.OuterHTML(`div.srch_employees__list`, &strVar),	// 태크와 그 내부 텍스트를 함께 strVar변수에 입력
		chromedp.Click(`.employees-open`, chromedp.NodeVisible),	// .employees-open 클래스의 요소를 클릭
		chromedp.Sleep(10*time.Second),		//10초간 대기
		chromedp.SetAttributeValue(`input#empSearchKeyWord`, "value", "홍길동", chromedp.NodeVisible),	//input의 value에 '홍길동'을 입력 
		chromedp.SetAttributes(`input#empSearchKeyWord`, map[string]string{"value": "12345678"}, chromedp.NodeVisible), //input에 value 속성을 추가하고 값을 대입함 
		chromedp.SendKeys(`input#empSearchKeyWord`, "a"),	//키 입력
		chromedp.Evaluate(`window.open('www.naver.com')`, &strVar),	//javascript 실행
		chromedp.Value(`div#executiveStatusPop > div.dialog__contents > div.srch_employees > div.srch_employees__container > div.employees__srch > div._fr > div.board-search > input#empSearchKeyWord label`, &strVar),	// 해당 요소의 텍스트값을 취하여 strVar변수에 대입 
	)
	if err != nil {
		panic(err)
	}
}

 

그럼 이만~~

 

 
 
 
반응형
반응형

Fyne tutorial에 있는 timer 예제입니다.

 

1. main.go

package main

import (
	"time"

	"fyne.io/fyne/app"
	"fyne.io/fyne/widget"
)

func showTime(clock *widget.Label) {
	formatted := time.Now().Format("03:04:05")	//현재시각을 포멧에 따라 출력한다.
	clock.SetText(formatted)
}

func main() {
	a := app.New()
	w := a.NewWindow("Clock")

	clock := widget.NewLabel("")
	showTime(clock)

	w.SetContent(clock)
	go func() {
		t := time.NewTicker(time.Second) //매 초마다 메시지(시간)를 전송하는 채널 t생성 

		for range t.C {			//채널 C로 time값을 받아 순서대로 처리한다. 
			showTime(clock)		//매 초마다 시간을 출력한다. 
		}
	}()

	w.ShowAndRun()	//앱을 보여주고 실행한다. 
}
 

 

<결과>

 

 

~~끝~~

 
반응형
반응형

1. icon.png 이미지 파일을 준비합니다.

 

2. fyne 패키징 툴을 다운받습니다.

go get fyne.io/fyne/cmd/fyne

3. icon.png파일을 실행파일의 이미지로 패키징합니다.

fyne package -icon icon.png

 

 

반응형
반응형

Fyne를 이용해 GUI를 만들던 중 한글 출력이 안된다는 것을 뒤늦게 알게 되었네요.(아래 화면 참조). 오늘은 한글 설정하는 방법에 대해 알아보겠습니다. 샘플로 간단한 메모장 앱을 만들어보겠습니다.

 

 

1. main.go

위 샘플로 만든 앱의 코드는 아래와 같습니다.

package main

import (
	"fmt"
	"image/color"
	_ "unicode/utf8"

	"fyne.io/fyne"
	"fyne.io/fyne/app"
	"fyne.io/fyne/canvas"
	"fyne.io/fyne/layout"
	"fyne.io/fyne/theme"
	"fyne.io/fyne/widget"
)

func main() {
	f := app.New()
	//f.Settings().SetTheme(theme.LightTheme())
	f.Settings().SetTheme(theme.DarkTheme())
	w := f.NewWindow("")

	//상단에 넣을 위젯 및 레이아웃 - NewFormLayout
	qry := widget.NewEntry()
	btn_go := widget.NewButton("New Memo", New_btn)

	text := canvas.NewText("Text Object", color.White)
	text.Alignment = fyne.TextAlignTrailing
	text.TextStyle = fyne.TextStyle{Italic: true}

	ret := fyne.NewContainerWithLayout(layout.NewFormLayout())
	ret.AddObject(btn_go)
	ret.AddObject(qry)

	//하단에 넣을 위젯 및 전체 레이아웃 구성 - NewBorderLayout
	label2 := widget.NewLabel("Simple Memo")
	labox2 := fyne.NewContainerWithLayout(layout.NewCenterLayout(), label2)

	b1 := widget.NewButton("Go1", func() { fmt.Println("Go1 Button") })
	b1.ExtendBaseWidget(b1)

	b2 := widget.NewButton("Go2", func() { fmt.Println("Go2 Button") })
	b2.ExtendBaseWidget(b2)

	out_entry := widget.NewMultiLineEntry()
	out_entry.SetPlaceHolder("결과...")
	out_entry.ExtendBaseWidget(out_entry)

	frm := fyne.NewContainerWithLayout(layout.NewBorderLayout(ret, labox2, nil, nil)) //상, 하, 좌(없음), 우(없음)
	frm.AddObject(ret)                                                                //상단
	frm.AddObject(labox2)                                                             //하단
	frm.AddObject(out_entry)                                                          //좌-우가 없으므로 5번째에(center) 추가됨

	w.SetContent(frm)
	w.Resize(fyne.Size{Height: 640, Width: 480})
	w.ShowAndRun()

}

2. 한글 폰트파일 다운로드

네이버에서 '나눔고딕 다운' 으로 검색하면 무료로 다운받을 수 있는 폰트 링크들이 나타납니다.

 

 

 

기본이 되는 폰트를 다운받아서 현재의 프로젝트 폴더에 위치시킵니다.

 

 

 

3. IDELite 환경설정

다음으로 환경설정에 변수를 추가해주도록 하겠습니다. Tools -> Edit current environment 메뉴로 가서..

 

 

FYNE_FONT=NanumGothic.ttf 라고 한줄을 추가해 넣습니다.

 

 

 

비교적 간단하네요. 이렇게 설정하고 실행해봅시다.

 

 

네,,,잘~ 나옵니다.

그럼 모두 건승하세요~

 

~~끝~~

반응형

+ Recent posts