win32com + python + 업무자동화 = xython https://www.xython.co.kr <![CDATA[xy_list : 어떻게 기본 list에서 새로운 자료형을 만드나- 006]]>

아예 새로운 자료형을 만든다고 생각하면, 아래에 언급하는 대부분의 던더메소드들을 새롭게 정의해야 하는데, 만드는건 어떻게든 만든다 하더라도, 만들고 나서 새로운 자료형인데, 이것을
한두번 테스트하는거야 가능하겟지만
, 기본적인 자료형처럼 사용하는 것은 생ㄱ가보다 쉬운일이 아닙니다

-     다른 사람들은 이게 문제가 없을지 어떻게 믿고 사용하냐는 것이며

-     풍부한 관련 기능이 없을수 있다는 것이며

-     지속적인 관리가 되는지 의구심을 가질수 있습니다

당연히 제가 만드는 xy_list도 다른 분들은 쉽게 사용하기를 꺼려하실것입니다. 그렇지만
이것을 만든 이유중의 하나는

-     어떤 다른 새로운 자료형을 만든다고 한다면, 도움이 될것이며

-     우리가 사용하는 것은 거의대부분 0에서 시작이 되는데, 엑셀과같이 1부터시작하는 코드를 사용하는 프로그램은 가끔 01 사이에서 왔다갔다 하고는 합니다

그래서 저는 이두가지가 모드 하나에 들어가는 형태와, 조금 불편하기도 하지만, “~”을 이용하는것처럼 그냥 적용해 본것입니다. 저의 경우도 list의 형태인데, 0이 아닌 1부터 시작하는 것으로 만드는 기능을 넣고싶고 싶었습니다.

이제 기존자료형 + 추가기능을 만드는 방법에 대해서 설명을 드리는데, 자세한 내용은
xy_list모듈의 소스를 참고하시기를 바랍니다

새로운 자료형을 만드는 것을 참고려면, xy_list모듈의 소스코드를 참고하시면 되는데, 가장 먼저 알아야

할 부분이 바로 던더메소드의 역할들에 대해서 이해를 하는 것이 필요합니다. 아래의 것은 리스트에서 사용되는 중요 던더메소드에 대한 설명입니다

함수

사용법

간단한설명

__len__

len(x)

객체의 길이를 반환

__add__

x+y ==> x.__add__(y)

operator.add(x, y) x+y

__iadd__

x+= y ==> x__iadd__(y)

 

__delattr__

 

클래스에서 속성을 삭제하려고 할 때 호출

__delitem__

del self[key]

항목을 삭제할 때 실행

__eq__

x == y ==> x.__eq__(y)

등괄호

__ge__

x >= y ==> x.__ge__(y)

>=사용시 

__getattribute__

 

 

__getitem__

self[key]

키에 대한 항목을 가져 오려고 할 때 실행

__gt__

x > y ==> x.__gt__(y)

>사용시

__imul__

x *= y ==> x.__imul__(y)

*=사용시

__init__

 

인스턴스가 __new__로 생성된 후, 호출되는
메소드

__le__

x <= y ==> x.__le__(y)

 <=

__lt__

x < y ==> x.__lt__(y)

 <

__mul__

x * y ==> x.__mul__(y)

 *

__ne__

x != y ==> x.__ne__(y)

 !=

__new__

 

새로운 인스턴스를 만들 때 제일 처음으로 실행되는 메소드

__setattr__

 

 

__setitem__

self[key] = value

dictionary[key] = item

__sizeof__

 

sys.getsizeof ()를 실행할 때 호출

__str__

 

개체를 인쇄 가능한 형식으로 인쇄하려고 할 때 실행

 

위의 중요한 던더메소드중에서 , 1부터 시작되는 리스트는 어떤 형태의 값에 대해서 순서를 뜻하는 값이 사용될 때 이것을 바꾸면 되는 것입니다. , 리스트의 기본자료형은 0이므로, 입력은 1로 하면, 내부적으로 0으로 바꾸면 되는 것입니다

위의 던더메소드에서 숫자가 들어가는 메소드를 보면, 아래와같습니다

함수

사용법

간단한설명

__len__

len(x)

객체의 길이를 반환

__delitem__

del self[key]

항목을 삭제할 때 실행

__getitem__

self[key]

키에 대한 항목을 가져 오려고 할 때 실행

__setitem__

self[key] = value

dictionary[key] = item

__str__

 

개체를 인쇄 가능한 형식으로 인쇄하려고 할 때 실행

 

예를들어 aaa = [1,2,3,4,5]라고 한다면aaa[2]를 하면 3이나와야하고, aaa[“2”]를하면 2가 나와야 하는것입니다

그러면, 위의 던더메소드 중에서 __getitem__이 바로 이럴 때 사용되는 메소드입니다. 이메소드는 아래와 같은 형태로 사용이 되는 것입니다

def __getitem__(self, key=""):

 eSiCREFBQUFBQUFBQUFBQUFB4S8O4P8BNO+phRPHmqUAAAAASUVORK5CYII=

위와같이 조건으로 비교를 해서 기존의 것도 사용하고, 추가된 부분에서 원하는 코드를 작성하면 되는 것입니다

]]>
Sun, 08 Jun 2025 00:23:43 +0000
<![CDATA[음성인식 : 개요 및 설치]]>

음성인식 : 개요 설치


음성인식을 위해서, 우리는 먼저 설치할 것과 왜 그것을 설치하는지에 대해서 알아 볼것입니다. 여기서는

whisper라는 open AI에서 공개한프로그램을 사용할 것 입니다

가장 기본으로 알아야 할 것은

-     
마이크로 음성이 전기신호로 변환됩니다

-     
전기신호를 01의 디지털로 변경을 합니다

-     
변경한 디지털신호를 일정 크기로 잘라서 분석한다

-     
음성을 분석해서 텍스트로 만든다


설치방법 : pip install openai-whisper

 음성이 들어오면, 그것을 해석하는데 사용되는 음성분석기가 있다고 하고, 그것을 모델이라는

이름으로 부른다면, 그 모델은 7가지가 존재 합니다. , 이름은 계속해서 추가나 변경이 되고있습니다

있을 때 다운로드하는 방법은 아래와같이 사용하면, 없을때는 자동으로 다운로드 됩니다

현재는 아래의 7가지가 존재하며, 가끔 large-v3 large-v3-turbo라고 불리기도 합니다. 그리고 필요한 모델이

 

        model = whisper.load_model(whisper_model_name)

 

Size

Parameters

English-only model

Multilingual model

Required VRAM

Relative speed

tiny

39 M

tiny.en

tiny

~1 GB

~10x

base

74 M

base.en

base

~1 GB

~7x

small

244 M

small.en

small

~2 GB

~4x

medium

769 M

medium.en

medium

~5 GB

~2x

large

1550 M

N/A

large

~10 GB

1x

large-v2

1550 M

N/A

large-v2

 

 

large-v3

1550 M

N/A

large-v3

 

 

 

사용가능한 음성화일 형태

.wav, .mp3, .m4a, .webm, .ogg, .flac

가장 간단한 사용방법을 보여드리면, 만약 음성화일이 audio.mp3로 저장이 되어있을 경우, 아래와같이 사용하시면 됩니다

 

import whisper

model = whisper.load_model("turbo")

result = model.transcribe("audio.mp3")

print(result["text"])

 

]]>
Sat, 07 Jun 2025 15:43:47 +0000
<![CDATA[자동화는 어떻게 해야 하나?]]>

자동화는 어떻게 해야 하나?

자동화업무를 하고싶을때가 많은대, 그때 추가적으로 요구되는 사항중에 하나가 마우스나 키보드의
기능을 원하는 곳으로 이동을 하는등의 일을 하는 것입니다

생각보다 많은 부분에서 마우스나 키보드를 잘 제어를 한다면, 매번 똑같이 다루는 일들을
보다 편하게 사용하는 방법이 되기도 합니다.

이 모듈은 전반적으로 마우스와 키보드에 대한 여러가지 메소드와 모니터등의 정보에 대한것들을 쉽게 다루도록 만든 것입니다. 이 모듈을 하기위해서는 각 프로그램의 핸들을 찾는 방법등의 관련 기능의 확인이 필요합니다

 KnUznCAW1klVZE4cUDrhjg+YIg12KM2x+cr+oTq+ORAbckuD6qnR6dd93mkWqf5+hHfcEQcu6wWsQoobZdJXCMh8UHX5GyLcr4MjbCn2PxKng3ItyCIAiC4EWIcAuCIAiCFyHCLQiCIAhehAi3IAiCIHgRItyCIAiC4EWIcAuCIAiCFyHCLQiCIAhehAi3IAiCIHgRItyCIAiC4EWIcAuCIAiCF+ETwt28RUtaMX0MUdgN7Q8ZBEEQBMFXCb1Oa2b9Q02bNbOp4PNbjAv3xYsXaeeu3bRl6zZBEARB8HmgeRcvXLCp4PNbjAu3mJiYmJiYWORNhFtMTExMTMyLTIRbTExMTEzMi0yEW0xMTExMzItMhFtMTExMTMyLTIRbTExMTEzMi0yEW0xMTExMzGuM6P+gmP3nuYS2WQAAAABJRU5ErkJggg==

 

원하는 것

방법

모듈 또는 설명

원하는 위치 알아내는 방법

전체 화면중에서 내가 원하는 조그마한 사진과
같은 위치를 찾아내는 방법

같은 화면 찾기

 

원하는 위치를 알고 있을 때

 

 

현재의 위치를 알아내야 한다

pyautogui

 

인터넷으로 입력이나 위치를 알아내기

Chromedriver등을 이용

 

모니터 (픽셀사이즈를 알아내기)

기본으로 알아내야 하는 자료

원하는 위치로 이동 방법

알아낸 위치로 이동

 

 

키보드의 탭으로 이동

 

자료입력 방법

키보드로 입력(글자타이핑)

Keyboard, pyperclip

 

클릭으로 액션 입력(더블클릭)

 

 

그중에서 웹브라우져를 이용한 프로그램을 제어하고 싶은데, 보호가 되어있어서 코드를 읽지
못해서 selenium등으로 할 수가 없을때, 키보드나 마우스를

이용하여 자동화를 시켜보면, 어떤때는 생각보다 더 직관적이고 쉽게 자동화를 만들수가 있다.


, 이것의 단점은 다른사람이 만들어 놓은 자료를 가져오지 못하고, 일방적으로 키보드와 마우스의 형태로 액션만이 가능하다는 것이다  

]]>
Sat, 07 Jun 2025 09:00:46 +0000
<![CDATA[pynal(기준) : 공휴일에 대한 자료]]> 공휴일에 대한 자료 만든 것을 공유합니다 기본적으로 xy_common안에 있지만, 간단하게 설명을 드리면, 우리나라의 공휴일은 크게 4가지의 형태로 분류가 가능합니다
  1. 임시공휴일
  2. 양력으로 기준이된 공휴일자료들
  3. 음력으로 기준이된 자료들
  4. 대체공휴일이 적용되는 공휴일들
이렇게 나누어진 것을 다음과같은 형태로 만들어 봅니다 말일의 개념은 윤달의 마지막날이기때문에 어떤때는 30이거나 29이거나 그런경우들이 있어, 이것은 다르게  보아야하기때문에 말일이라고 적은것입니다 1로 적은 부분은 원래 연속된 휴일은 2,3처럼 하다가 각각 1일마다 하는것이 더 효과적인것 같아서 바꾼것이며, 중간의 ""들도 비슷하게, 다른 용도로 사용하다가 빈것으로 만든 것입니다
varx = {} varx["휴일"] = [ 
[1988, 9, 17, 1, "양","","", "임시공휴일"], 
[2006, 9, 6, 1, "양","","", "임시공휴일"], 
[2015, 8, 14, 1, "양","","", "임시공휴일"], 
[2016, 5, 6, 1, "양","","", "임시공휴일"], 
[2017, 10, 2, 1, "양","","", "임시공휴일"], 
[2020, 8, 17, 1, "양","","", "임시공휴일"], 
[2025, 1, 27, 1, "양","","", "임시공휴일"], 
[1948, 7, 20, 1, "양","","", "대통령선거"], 
[1952, 8, 5, 1, "양","","", "대통령선거"], 
[1956, 5, 15, 1, "양","","", "대통령선거"], 
[1960, 3, 15, 1, "양","","", "대통령선거"], 
[1960, 8, 12, 1, "양","","", "대통령선거"], 
[1963, 10, 15, 1, "양","","", "대통령선거"], 
[1967, 5, 3, 1, "양","","", "대통령선거"], 
[1971, 4, 27, 1, "양","","", "대통령선거"], 
[1972, 12, 23, 1, "양","","", "대통령선거"], 
[1978, 7, 6, 1, "양","","", "대통령선거"], 
[1979, 12, 6, 1, "양","","", "대통령선거"], 
[1980, 8, 27, 1, "양","","", "대통령선거"], 
[1981, 2, 25, 1, "양","","", "대통령선거"], 
[1987, 12, 16, 1, "양","","", "대통령선거"], 
[1992, 12, 18, 1, "양","","", "대통령선거"], 
[1997, 12, 18, 1, "양","","", "대통령선거"], 
[2002, 12, 19, 1, "양","","", "대통령선거"], 
[2007, 12, 19, 1, "양","","", "대통령선거"], 
[2012, 12, 19, 1, "양","","", "대통령선거"], 
[2017, 5, 9, 1, "양","","", "대통령선거"], 
[2022, 3, 9, 1, "양","","", "대통령선거"], 
[2025, 6, 3, 1, "양","","", "대통령선거"], 
[1948, 5, 10, 1, "양","","", "국회의원선거"], 
[1950, 5, 30, 1, "양","","", "국회의원선거"], 
[1954, 5, 20, 1, "양","","", "국회의원선거"], 
[1958, 5, 2, 1, "양","","", "국회의원선거"], 
[1960, 7, 29, 1, "양","","", "국회의원선거"], 
[1963, 11, 26, 1, "양","","", "국회의원선거"], 
[1967, 6, 8, 1, "양","","", "국회의원선거"], 
[1973, 2, 27, 1, "양","","", "국회의원선거"], 
[1978, 12, 12, 1, "양","","", "국회의원선거"], 
[1981, 3, 25, 1, "양","","", "국회의원선거"], 
[1985, 2, 12, 1, "양","","", "국회의원선거"], 
[1988, 4, 26, 1, "양","","", "국회의원선거"], 
[1992, 3, 24, 1, "양","","", "국회의원선거"], 
[1996, 4, 11, 1, "양","","", "국회의원선거"], 
[2000, 4, 13, 1, "양","","", "국회의원선거"], 
[2004, 4, 15, 1, "양","","", "국회의원선거"], 
[2008, 4, 9, 1, "양","","", "국회의원선거"], 
[2012, 4, 11, 1, "양","","", "국회의원선거"], 
[2016, 4, 13, 1, "양","","", "국회의원선거"], 
[2020, 4, 15, 1, "양","","", "국회의원선거"], 
[2024, 4, 10, 1, "양","","", "국회의원선거"], 
[1995, 6, 27, 1, "양","","", "전국동시지방선거"], 
[1998, 6, 4, 1, "양","","", "전국동시지방선거"], 
[2002, 6, 13, 1, "양","","", "전국동시지방선거"], 
[2006, 5, 31, 1, "양","","", "전국동시지방선거"], 
[2010, 6, 2, 1, "양","","", "전국동시지방선거"], 
[2014, 6, 4, 1, "양","","", "전국동시지방선거"], 
[2016, 4, 13, 1, "양","","", "전국동시지방선거"], 
[2018, 6, 13, 1, "양","","", "전국동시지방선거"], 
[2022, 6, 1, 1, "양","","", "전국동시지방선거"], 
[2026, 6, 3, 1, "양","","", "전국동시지방선거"], 
[2030, 6, 12, 1, "양","","", "전국동시지방선거"],] 
varx["기간-양력휴일"] = [ 
[[1949, 1990], 1, 1, 1, "양", "", "","양력설"], 
[[1949, 1990], 1, 2, 1, "양", "", "","양력설"], 
[[1949, 1990], 1, 3, 1, "양", "", "","양력설"], 
[[1991, 1999], 1, 1, 1, "양", "", "","양력설"], 
[[1991, 1999], 1, 2, 1, "양", "", "","양력설"], 
[[2013, 9999], 1, 1, 1, "양", "", "","새해 첫날"],
[[1949, 1959], 4, 5, 1, "양", "", "","식목일"], 
[[1960, 1960], 3, 15, 1, "양", "", "","사방의날"], 
[[1961, 2006], 4, 15, 1, "양", "", "","식목일"], 
[[1949, 2008], 7, 17, 1, "양", "", "", "제헌절"], 
[[1950, 1975], 10, 24, 1, "양", "", "", "유엔의날"], 
[[1976, 1991], 10, 1, 1, "양", "", "","국군의날"], 
[[1949, 2012], 3, 1, 1, "양", "", "","3.1절"], 
[[2013, 9999], 3, 1, 1, "양", "", "토일","3.1절"], 
[[1975, 2012], 5, 5, 1, "양", "", "", "어린이날"], 
[[2013, 9999], 5, 5, 1, "양", "", "토일", "어린이날"], 
[[1956, 9999], 6, 6, 1, "양", "", "", "현충일"], 
[[1949, 2012], 8, 15, 1, "양", "", "", "광복절"], 
[[2013, 9999], 8, 15, 1, "양", "", "토일", "광복절"], 
[[1949, 2012], 10, 3, 1, "양", "", "","개천절"], 
[[2013, 9999], 10, 3, 1, "양", "", "토일","개천절"], 
[[1946, 1989], 10, 9, 1, "양", "", "", "한글날"], 
[[2013, 9999], 10, 9, 1, "양", "", "토일","한글날"], 
[[1994, 2012], 12, 25, 1, "양", "", "","기독탄신일"],
[[2013, 9999], 12, 25, 1, "양", "", "토일","기독탄신일"],] 

varx["기간-음력휴일"] = [ 
[[1985, 1988], 1, 1, 1, "음", "평달", "","설날"], 
[[1989, 2012], 12, "말일", 1,"음", "윤달", "", "설날"], 
[[1989, 2012], 1, 1, 1,"음", "평달", "", "설날"], 
[[1989, 2012], 1, 2, 1,"음", "평달", "", "설날"], 
[[2013, 9999], 12, "말일", 1,"음", "윤달", "일","설날"], 
[[2013, 9999], 1, 1, 1,"음", "평달", "일","설날"], 
[[2013, 9999], 1, 2, 1,"음", "평달", "일","설날"], 
[[1975, 9999], 4, 8, 1, "음", "평달", "토일","부처님 오신 날"], 
[[1986, 1988], 8, 15, 1, "음", "평달", "","추석"], 
[[1986, 1988], 8, 16, 1, "음", "평달", "","추석"], 
[[1989, 2012], 8, 14, 1, "음", "평달", "","추석",""], 
[[1989, 2012], 8, 15, 1, "음", "평달", "","추석",""], 
[[1989, 2012], 8, 16, 1, "음", "평달", "","추석",""], 
[[2013, 9999], 8, 14, 1, "음", "평달", "일","추석"], 
[[2013, 9999], 8, 15, 1, "음", "평달", "일","추석"], 
[[2013, 9999], 8, 16, 1, "음", "평달", "일","추석"], ]
]]>
Thu, 22 May 2025 23:40:36 +0000
<![CDATA[쫄면맛집- 일반정보]]> Sat, 26 Apr 2025 13:24:35 +0000 <![CDATA[안드로이드 핸드폰으로 메시지 보내기]]> 안드로이드 핸드폰으로 메시지 보내기 먼저 관련된 프로그램을 설치하고 설정을 하는 부분까지 해야 한다. 설치와 설정부분은 간략하게 나타내고, 코드에 집중해 보시기를 바랍니다. 가족 핸드폰으로 테스트해보니 잘 보내지네요 관련 프로그램을 설치
윈도우 ADB설치 https://developer.android.com/tools/releases/platform-tools?hl=ko
adb를 압축풀기 저는 C밑에 저장 C:\adb_tool
환경변수 설정 윈도우 입력창에 => 고급시스템설정 환경변수 : C:\adb_tool를 넣음, 이름은 android_adb_tool로 설정 path에 %android_adb_tool%\를 넣기
잘됐는지 확인 power shell을 오픈해서 adb를 입력후 엔터를 치면 뭐가 나오면 잘 설치 된것임
pc에 설치할 모듈 pip install pure-python-adb
실행
adb start-server power sheel에 이것을 하면, 서버가 실행됨
adb devices 실행된 서버에 연결된 장치가 있는지 확인하는 것, 만약에 없으면, 핸드폰 연결을 잘 살펴보거나 다시 실행해보기를 원함
adb kill-server 서버를 죽이는 것
핸드폰으로 메시지 보내기  
import subprocess, time

def send_sms(phone_number, message):
    try:
        command = ['adb', 'shell', 'am','start',  '-a',
            'android.intent.action.SENDTO', '-d',
            f'sms:{phone_number}',
            '--es', 'sms_body',
            f'"{message}"',
            '--ez','exit_on_sent','true' ]
        subprocess.run(command, check=True)
        time.sleep(1)  # 장치가 문자 입력 화면으로 전환될 시간을 고려하여 딜레이 추가
        command_enter = ['adb', 'shell', 'input', 'touchscreen', 'tap', "1020", "1309"]
        subprocess.run(command_enter, check=True)

        return True
    except subprocess.CalledProcessError as e:
        print(f"adb 명령어 실행 중 오류가 발생했습니다: {e}")
        return False
    except FileNotFoundError:
        print("adb 명령어를 찾을 수 없습니다. 설치된것과 PATH등의 환경 변수를 확인하세요.")
        return False

recipient_number = "01040645260"
sms_text = "한번더 잘되나 테스트 해본거에요"

if send_sms(recipient_number, sms_text):
    print("문자 전송 요청이 성공적으로 처리되었습니다.")
else:
    print("문자 전송 요청에 실패했습니다.")
    모르는 부분은 다른 자료들을 보시면 참고가 될것이며, 기본적으로 메시지를 쓰는 부분까지는 다들 잘 되는데, 마지막에 보내는 부분은 기본 기능으로 제공해주지를 않읍니다 그래서 생각해 낸게, 보통 메시지를 보내는 send버튼은 같은 위치에 있게 됩니다. 입력 문자셋이 천지인인지 아닌지에 따라서 위치가 다르긴 하지만, 같은 핸더폰은 여러줄을 쓰더라도 같다것에 착안해서, 이곳의 x,y축을 갖고와서 그곳을 맨마지막에 클릭하게 만들면 보내는 기능과 같을것이라 생각하고 해보니 잘되네요 그 실행 부분이 command_enter = ['adb', 'shell', 'input', 'touchscreen', 'tap', "1020", "1309"] 입니다 맨마지막 2개가 좌표이며, 만약 좌표를 알고싶으신분은 설정 => 개발자 옵션 => 포인터 위치 => 활성화 시키면 위에 나타납니다]]>
Thu, 24 Apr 2025 19:09:40 +0000
<![CDATA[xy_excel(기초) : 2개의 엑셀화일에서 한쪽으로 모든 시트 복사해서 옮기기]]> 예제 : 2개의 엑셀화일에서 한쪽으로 모든 시트 복사해서 옮기기 ** 두 엑셀화일에서 한쪽의 시트를 다른 엑셀화일에 전부 옮기는(복사) 방법을 보여드립니다 먼저 자료를 하나 만들어 보면, 다음과 같읍니다
  • 새로운 엑셀화일을 2개를 각각 만든후
  • 각 1개마다 5개의 시트를 추가하고
  • 각 시트의 [1,1]마다, 어떤것은 1부터 시작하고, 어떤 엑셀화일은 구분하기 위해서 10부터 시작하는 값을 넣읍니다
# -*- coding: utf-8 -*-
import xy_excel
xl1 = xy_excel.xy_excel("new")
xl2 = xy_excel.xy_excel("new")

xl1.new_sheet_with_nea(5)
no = 1
for one_sheet_name in xl1.get_all_sheet_name():
    xl1.write_cell(one_sheet_name, [1,1], no)
    no = no +1

xl2.new_sheet_with_nea(5)
no = 10
for one_sheet_name in xl2.get_all_sheet_name():
    xl2.write_cell(one_sheet_name, [1,1], no)
    no = no +1
word-image-2994-1.png word-image-2994-2.png 이렇게 옮겨지는데, 아래와같이 코드를 작성해야 합니다 위의 코드는 만드는 코드이기 때문에 엑셀화일을 따로 부를 필요가 없지만, 만들어진 파일은 따로 불러야 하며, 여기서는 열려진 파일의 범호를 기준으로 1,2번으로 해서 불러올수있는 것입니다
# -*- coding: utf-8 -*-
import xy_excel

xl1 = xy_excel.xy_excel(1)
xl2 = xy_excel.xy_excel(2)

xl1.move_all_sheet(xl1, xl2)
이렇게 만든 파일을 실행하면, 하나로 옮겨지는 것이 보일것입니다 word-image-2994-3.png]]>
Tue, 15 Apr 2025 06:05:51 +0000
<![CDATA[xy_excel(기초) - 틀고정]]> 틀고정 ** 틀을 고정하는 방법은 3가지와 해제를 하는 방법이 필요합니다
가로열을 고정 set_freeze_pane_by_yline("", 2)
세로열을 고정 기본으로 가장 많이 사용 set_freeze_pane_by_xline("", 2)
셀을 기준으로 십자형으로 고정 set_freeze_pane_by_xy("", "c4")
중의해서 사용할 기준은 내가 원하는 것과 틀고정이 이루어지는 부분이 다를수있다는 것입니다 word-image-2989-1.png
1 세로열을 선택해서 틀고정을 하면, 왼쪽을 기준으로 생성
2 가로열을 선택해서 틀고정을 하면, 위쪽을 기준으로 생성
3 어떤 셀을 선택해서 틀고정을 하면, 왼쪽위를 기준으로 생성
그러니 첫번째 줄아래에 틀고정을 하고싶다면, 2번째줄을 선택하고 실행해야 원하는 것이 나온다는 것입니다 # -*- coding: utf-8 -*- import xy_excel excelx = xy_excel.xy_excel() excelx.set_freeze_pane_by_xline("", 2) word-image-2989-2.png # -*- coding: utf-8 -*- import xy_excel excelx = xy_excel.xy_excel() excelx.set_freeze_pane_by_xy("", "c4") word-image-2989-3.png]]>
Sat, 12 Apr 2025 23:00:06 +0000
<![CDATA[util - 화면에 좌표로 빨간색 사각형 그리기]]> 윈도우에 좌표로 빨간색 사각형 만들기 알고싶은것중에 하나가 엑셀의 프로그램의 좌표와 클리아이언트 좌표라고 이야기하는 부분이 어떤지 알아내는 방법을 화면에 보여주기 위해서, 절대 좌표로 빨간색 사각형을 만드는 방법을 알아봅니다
import ctypes
from ctypes import wintypes

def draw_red_box_by_pltrb(self, left, top, right, bottom):
    left, top, right, bottom = int(left), int(top), int(right), int(bottom)
    # 원도우에 박스그리기
    user32 = ctypes.windll.user32
    gdi32 = ctypes.windll.gdi32
    hwnd = user32.GetDesktopWindow()
    hdc = user32.GetDC(hwnd)
    # 디바이스 컨텍스트 가져오기
    null_brush = gdi32.GetStockObject(5) #투명한 브러시 생성
    red_pen = gdi32.CreatePen(0, 2, 0x0000FF) # 빨간색 펜 생성
    # 이전 브러시와 편 저장
    old_brush = gdi32.SelectObject(hdc, null_brush)
    old_pen = gdi32.SelectObject(hdc, red_pen)
    # 빨간색 테두리 사각형 그리기
    gdi32.Rectangle(hdc, left, top, right, bottom)
    # 이전 브러시와 펜 복원
    gdi32.SelectObject(hdc, old_brush)
    gdi32.SelectObject(hdc, old_pen)
    # 펜 삭제
    gdi32.DeleteObject(red_pen)
    # 디바이스 컨텍스트 해제
    user32.ReleaseDC(hwnd, hdc)
이상한 일이지만, import할 때 따로 두개를 하여야 합니다 그냥 아무곳이나 좌표를 넣으면, repaint가 일어나기 전까지 사각형이 유지가 됩니다
import xy_util

utilx = xy_util.xy_util()

utilx.draw_red_box_by_pltrb(300, 500, 800, 900)
위와같이 실행하면 아래와같이 나옵니다 보기 편하게 하기위하여 엑셀을 배경으로 한것입니다 word-image-2975-1.png 하나만 하기에는 쫌 그래서 한가지더 보여드리는 것입니다
import xy_util

utilx = xy_util.xy_util()

for one in range(300, 700, 10):
    utilx.draw_red_box_by_pltrb(one, 500, one+500, 900)
word-image-2975-2.png]]>
Tue, 01 Apr 2025 21:50:16 +0000
<![CDATA[xy_outlook(기초) - 폴더에 대한 것들]]> 기본 폴더 (top 폴더)란 무엇인가 아웃룩은 폴더에 모든 자료를 저장하고, 컴퓨터의 드라이브와 같이 C는 기본 형태이고 D, E와 같이 여러 가지를 만들수가 있는 것입니다
  • 현재 기본으로 사용중인 자료들을 저장하는 공간 (1개만 가능)
  • 백업과같이 보관용으로 사용할 목적을 위한 공간 (여러 개가 가능)
word-image-2961-1.png 위와 같이 가장 상위의 폴더이며, 이것은 back_up을 위한 폴더를 만들수도 있는 것입니다

top폴더의 이름을 갖고온다

메일의 제일 상위인 top폴더는 어떤 것이 있는지 알아보는 것입니다
# -*- coding: utf-8 -*-
import xy_outlook

outlook = xy_outlook.xy_outlook()
aaa = outlook.get_all_top_folder_name()
print(aaa)
word-image-2961-2.png top폴더를 지칭하지 않으면 기본top폴더가 들어간다 메일을 보면, 기본 메일함이 설정되어있다. 예를 들어 새로운 메일이 들어오면 저장되는top폴더가 기본 top폴더인 것이다 그래서 별도로 top을 지정하지 않고 sub-folder이름이나 번호를 지칭하면 자동으로 적용되는 것입니다 보통 top폴더는 2개가 존재합니다
  • 현재 메일을 받고 저장하는곳
  • back-up을 위해서 저장해 놓는 폴더

Top 폴더 밑의 sub-folder에 대한 고유한 번호와 이름

아웃룩은 여러 사람들이 공통적으로 사용하면 좋은 기본적인 폴더에 대한 이름들이 있습니다. 즉, 내부적인 이름과 외부적인 이름이 있다는 말이지요. 그리고 이것을들 이름을 약간씩 변경하더라도 고유하게 똑 같은 기능을 하게 하기위하여 특정 번호들로 할당을 하여 사용합니다 예를들어 폴더중에서 6번은 받은 편지함처럼 사용한다는 것입니다. 아래에 잘 사용되는 기본적인 폴더의 이름과 번호를 표로 만들어 보았습니다
번호 설명
3 지운 편지함
4 보낸 편지가 저장되는 곳
5 보낸 편지함
6 받은 편지함
9 Calendar 폴더
10 연락처 폴더
11 뉴스레터함
12 Notes 폴더
13 Tasks 폴더
16 작성함 (작성중인 편지)
23 스팸용 / Junk E-Mail folder
28 To Do 폴더
즉, 위와 같은 번호를 통해서 본인이 원하는 폴더에 접근 가능한 것입니다 다음과 같이 현재 제 아웃룩의 모든 폴더와 번호를 보여드리면 아래와 같습니다
# -*- coding: utf-8 -*-
import pcell, xy_outlook
excel = pcell.pcell()
outlook = xy_outlook.xy_outlook()

result = outlook.get_default_folders_information()
#현재 아웃룩에있는 기본 폴더의 번호와 이름
for one in result:
   print(one)
word-image-2961-3.png word-image-2961-4.png
이번에는 반대로 번호를 가지고 폴더 객체를 갖고오도록 합니다 제 노트북의 현재 상태의것을 보여드리면 아래와같습니다
result = outlook.get_all_folder_information()
for one in result:
   print(one)
word-image-2961-5.png word-image-2961-6.png

mail item : 각 메일은 하나의 독립된 구조로 되어있다

각 메일들은 어떤 정보들을 갖고있어야 하는지, 우리들은 좀 알고있는것도 있지만 추가적인 기능을 위한 자료들이 있습니다 당연히 있을 정보들은
  • 보낸사람
  • 받은사람
  • 제목
이런것들처럼 있다는 부분입니다 word-image-2961-7.png 각 메일은 고유한 EntryID가 있고, 이것은 바뀔수가 있다 각 메일은 EntryID가 있는데, 이것을 고유한것으로 보는 시간이 있는데, 이것은 변경되수있느니, 만약 변경되지 않은 고유한 것을 사용하고 싶다면, 개인적으로 속성을 만들어서 그것을 이용하시기를 권합니다

자주 사용하는 함수들

get_all_top_folder_names 최상위의 모든 폴더이름을 갖고옵니다
get_all_sub_folder_name_in_top_folder_name 특정 폴더밑의 하위폴더이름들을 갖고오는 것
get_all_mails_in_folder 어떤 폴더안의 모든 메일객체를 갖고오는 것
get_information_for_mail 어떤 메일에 대한 모든 정보를 갖고오는 것
get_folder_obj_by_index 폴더를 나타내는 번호로 폴더를 갖고오는 것
count_mails_in_folder 받은편지함안의 메일 객체의 개수
get_mail_set_for_selected 선택한 폴더의 메일 객체를 갖고오는 것
]]>
Sat, 29 Mar 2025 18:17:57 +0000
<![CDATA[xy_outlook(기초) - xy_outlook에대한 기본적인 사항들]]> xy_outlook에 대하여 메일을 관리하는 outlook을 좀더 편하게 사용하기 쉽도록 만든 모듈입니다. 이 모듈은 xython의 기본 개념인 함수형으로 만들어졌으며, 주요 함수들을 사용하면서 outlook을 쉽게 사용하도록 하는 목적입니다 밑에도 설명을 하겠지만, 전반적으로 먼저 알고있으면 좋을 부분을 나열하여 드립니다
  • 폴더에 파일이 저장되듯이 메일은 같은 방식으로 저장됩니다
  • top폴더와 대비하여 sub-folder 와 folder라는 이름은 가끔 혼용하여 사용됩니다
  • 기본폴더는 “”를 사용하면 받은 편지함이 됩니다
  • 날짜에 대한 기준은 00시00분 ~ 23시59분까지의 기간이다
  • 메일의 집합형은 lsit형태가 아니다
  • 삭제를 한다면 끝에서부터해야 문제가 안생긴다
  • 새로운메일을 위한 table형식은 util의 make_table을 사용하기 바랍니다

메일 객체의 묶음에 대한 설명

1개 메일 객체 <class 'win32com.client.CDispatch'> 그리고 메일객체를 print를 하면 class에 정의가 된 것이 메일의 제목을 나타내도록 한 것 같습니다. mail_set[0:2]와같이 사용이 불가능, 그래서 list(mail_set)[0:2]으로 사용하여야 합니다
여러 개의 메일 묶음 <COMObject Restrict>
그러나 개인적으로 확인을 거치면서 찾은 각 메일을 기본묶음의 형태로 만들수는 없으므로, List에 넣어서 return객체로 돌려주는 형태를 만들었습니다 그래서 2가지의 묶음을 구분해서 적용하려고 합니다
여러 개의 메일 묶음 (기본객체) <COMObject Restrict> mail_set
사용자가 각 mail을 묶음으로 만든것 list객체 mail_list
mail_set= outlook.get_unread_mail_set_in_inbox_folder() print("1. ", mail_set) print("2. ", (mail_set)) for one_mail in list(mail_set)[0:2]: print("3. ", type(one_mail)) print("4. ", one_mail) word-image-2956-1.png 단, mail_set[0:2]과같이 기본 묶음객체는 slice가 불가능하므로 list로 변경을 해서 사용하면 가능합니다

메일객체의 method와 속성

자주 사용하는 속성에 대해서 설명드리면 아래와 같습니다
속성
Application Outlook 애플리케이션 객체를 반환
Attachments 메일에 첨부된 파일 컬렉션을 반환
BCC 숨은참조
Body 내용
Categories 메일 항목에 할당된 범주 목록
CC 참조
Class Outlook 항목의 클래스
Companies 메일 항목과 연결된 회사이름
ConversationID 메일 대화의 ID
ConversationTopic 대화 주제
CreationTime 만든시간
DeferredDeliveryTime 메일 배달 지연 시간을 반환하거나 설정 4501-01-01 00:00:00+00:00 (실제 메일의 예)
EntryID 고유한 id
ExpiryTime 4501-01-01 00:00:00+00:00 (실제 메일의 예)
FormDescription 메일 항목에 사용된 양식에 대한 설명
Importance 메일 중요도 (높음, 보통, 낮음)
IsConflict 메일 항목이 충돌하는지 여부
IsMarkedAsTask 메일 항목이 작업으로 표시되었는지의 여부
LastModificationTime 메일 항목이 마지막으로 수정된 시간
MarkForDownload 메일 항목의 다운로드 표시 상태
MessageClass 메일 항목의 메시지 클래스
Mileage 메일 항목의 마일리지 정보
NoAging 메일 항목이 자동 보관 대상에서 제외되는지의 여부
OutlookInternalVersion Outlook 내부 버전 번호를 반환합니다.
OutlookVersion Outlook 버전을 반환합니다.
Parent 어느 편지함에 있는것인지(받은 편지함)
PropertyAccessor 메일 항목의 속성에 접근할 수 있는 PropertyAccessor 객체를 반환합니다.
ReceivedTime 받은시간
Recipients 받는 사람 목록
RemoteStatus 메일 항목의 원격 상태
ReplyRecipients 메일 항목에 대한 회신 받는 사람 목록
SaveSentMessageFolder 보낸 메시지를 저장할 폴더
Sender 보낸사람
SenderEmailAddress 보낸 사람의 이메일 주소
SenderEmailType 보낸 사람의 이메일 주소 유형
SenderName 보낸사람
Sensitivity 메일 보안 수준 (일반, 개인, 비공개, 기밀)
Sent 보냈는지 아닌지
SentOn 보낸 날짜 및 시간
Size 메일 크기 (바이트)
Subject 제목
TaskCompletedDate 작업 완료 날짜
TaskDueDate 작업 기한
TaskStartDate 작업 시작 날짜
To 받는 사람
UnRead 메일 읽음 여부 (True: 읽지 않음, False: 읽음)
UserProperties 메일 항목의 사용자 정의 속성 컬렉션을 반환
method
AddBusinessCard
ClearConversationIndex
ClearTaskFlag
Close
Copy
Delete
Display
Forward
GetConversation
MarkAsTask
Move
PrintOut
Reply
ReplyAll
Save
SaveAs
Send
ShowCategoriesDialog
하기의 코드를 사용하면, 현재 받은메일함중에서 읽지않은 첫번째 메일에 대한 속성들을 볼수있읍니다
all_property = ['Actions', 'AlternateRecipientAllowed', 'Application', 'Attachments', 'AutoForwarded',
'AutoResolvedWinner', 'BCC', 'BillingInformation', 'Body', 'BodyFormat', 'Categories',
'CC', 'Class', 'Companies', 'Conflicts', 'ConversationID', 'ConversationIndex', 'ConversationTopic',
'CreationTime', 'DeferredDeliveryTime', 'DeleteAfterSubmit', 'DownloadState', 'EntryID',
'ExpiryTime', 'FlagRequest', 'FormDescription', 'GetInspector', 'HTMLBody', 'Importance',
'InternetCodepage', 'IsConflict', 'IsMarkedAsTask', 'ItemProperties', 'LastModificationTime',
'MarkForDownload', 'MessageClass', 'Mileage', 'NoAging', 'OriginatorDeliveryReportRequested',
'OutlookInternalVersion', 'OutlookVersion', 'Parent', 'Permission', 'PermissionService',
'PermissionTemplateGuid', 'PropertyAccessor', 'ReadReceiptRequested', 'ReceivedByEntryID',
'ReceivedByName', 'ReceivedOnBehalfOfEntryID', 'ReceivedOnBehalfOfName', 'ReceivedTime',
'RecipientReassignmentProhibited', 'Recipients', 'ReminderOverrideDefault', 'ReminderPlaySound',
'ReminderSet', 'ReminderSoundFile', 'ReminderTime', 'RemoteStatus', 'ReplyRecipientNames',
'ReplyRecipients', 'RetentionExpirationDate', 'RetentionPolicyName', 'RTFBody', 'Saved',
'SaveSentMessageFolder', 'Sender', 'SenderEmailAddress', 'SenderEmailType', 'SenderName',
'SendUsingAccount', 'Sensitivity', 'Sent', 'SentOn', 'SentOnBehalfOfName', 'Session',
'Size', 'Subject', 'Submitted', 'TaskCompletedDate', 'TaskDueDate', 'TaskStartDate',
'TaskSubject', 'To', 'ToDoTaskOrdinal', 'UnRead', 'UserProperties', 'VotingOptions', 'VotingResponse']


mail_set= outlook.get_unread_mail_set_in_inbox_folder()
one_mail = list(mail_set)[0]
for one in all_property:
    try:
       value = getattr(one_mail, one)
       print(one, value)
    except:
       pass

기본 내용

메일의 특성상 외부로 보내지는 형태이기 때문에, 하나의 형태안에 관련된 내용들이 다 들어가야 합니다. 이런 형형태인 것 기본적으로 배경을 알고 배워보시면 됩니다 자동화를 위해서 아웃룩을 이용할때는 당연한 2가지를 알아야 합니다.
  1. 하나는 아웃룩의 기본적인 구조에 대한것과
  2. xy_outlook의 사용법을 알아야 합니다
간단하게 아웃룩의 기본구조를 보면,
  • 모든 메일을 mail item이라는 객체를 만들어서 저장이 됩니다
  • 단, mail item이외에도 약속을 나타내는 (promise용) 객체와 같은 것들이 사용됩니다
  • 모든 mail item은 고유한 번호를 가진다
  • mail item은 여러 폴더에 저장이 됩니다
xy_outlook은 함수로 이런 기능을 실현하는 것입니다 word-image-2956-2.png 아웃룩에서 하는 대부분의 자동화는 원하는 것을 골라내는 것부터 입니다 많은 부분에서 순서대로 갖고오거나 읽지 않은 것을 갖고오거나 우리가 원하는 목적에 맞는 것을 많은 것 안에서 갖고오는 것입니다 그런데, 처음에 들어온 곳에 그대로 있는 것이 아니라 이동이 되기 때문에 여러곳에서 찾아야하는기능들이 필요합니다 각 메일에는 많은 속성들이 있지만, 그중에서 원하는 부분들을 골라내고 찾아야 합니다

아웃룩의 구조

메일은 생각보다 간단한 구조를 갖고있는데, 상호간에 이동이 가능한 기능 때문에 폴더나 탐색 기능과 비슷하다라고 생각을 하셔도 됩니다 메일을 사용해보신분은 아시겠이지만지만, 보낸편지함, 받은편지함등의 이름을 가진 폴더로 구분을 하고, 각각의 폴더안에는 메일이 있는 것입니다 그리고 보관을 위하여, 별도의 공간이 따로있는데, 그림으로 나타내보면 아래와 같습니다 word-image-2956-3.png]]>
Sat, 29 Mar 2025 18:09:41 +0000
<![CDATA[아래아한글 - action과 parameter를 찾는 프로그램]]> 아래아한글의 action과 parameter가 어떤 것이 있는지 찾아주는 프로그램
[다운로드 : 아래한글용 GUI프로그램 :xython_han_action_finder_2503.zip]

word-image-2923-1-1.png

1번에 원하는 단어를 넣고 2번의 실행 버튼을 누르면, textbox에 그결과가 나오며 그 단어가 들어가는 action의 모든 것을 찾아서, 보여주는 것이다 word-image-2923-2-1.png  ]]>
Sat, 22 Mar 2025 16:13:07 +0000
<![CDATA[(기타) 윈도우 파일탐색기의 선택 정보 갖고오기]]> (기타) 윈도우 파일탐색기의 선택 정보 갖고오기 일을 하다보면, 파일을 확인하거나 파일의 이름을 변경하고 싶을 때도 있다. 물론 이름을 알고잇다면, 그것을 그대로 사용하면 되지만, 생각보다 다른 방법을 더 많이 사용하는데, 대부분 파일익스플로러에서 선택한 파일이나 폴더의 정보를 바꾸고 싶은 경우가 더 많다
  • 파일익스프로로에서 선택한것의 파일이름을 변경
  • 파일이름중 일부분을 제거하고 싶은 경우
  • 폴더를 삭제하거나 이동하고 싶은 경우
이제부터 그 방법을 알아 보도록 합니다. 아래와 같은 상태입니다. 선택한 파일이나 폴더를 바꾸는 부분은 다른 함수를 사용하시면 됩니다. 아래의 파일은 실제 제가 임시로 보관하고있는것이니 맨 아래에 다시 보여드립니다 word-image-2909-1.png 아래의것은 전체 선택한 파일이나 폴더의 정보를 갖고오는 전체적인 코드를 보여드리면 아래와 같읍니다. 여기에서 가장 중요한 부분은 파일탐색기를 com객체를 이용해서 연결하는 방법을 더 관심두고 봐주시기 바랍니다 shell = win32com.client.Dispatch("Shell.Application") 아래는 전체적인 선택한 부분의 정보를 갖고오는 코드립니다
# -*- coding: utf-8 -*-
import win32com.client

def get_selected_files():
    # Shell.Application COM 객체 생성
    shell = win32com.client.Dispatch("Shell.Application")
    # 현재 열려 있는 탐색기 창 가져오기
    windows = shell.Windows()

    for window in windows:
       # 탐색기 창이 폴더를 표시하는지 확인
       print(window.Name)
       if window.Name in ["Windows 탐색기", "File Explorer", "파일 탐색기"]:
          folder_view = window.Document
          print(folder_view.Selecteditems().Count)
          selected_items = folder_view.Selecteditems()

          # 선택된 파일의 경로 출력
          for item in selected_items:
             print(item.Path)

get_selected_files()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
word-image-2909-2.png 위의 기본적인 부분에서 몇가지를 추가하고 정리를 하면 좀더 보기 좋은 형태가 됩니다
# -*- coding: utf-8 -*-
import win32com.client

def get_selected_filenames_at_explorer ():
    # Shell.Application COM 객체 생성
    shell = win32com.client.Dispatch("Shell.Application")
    # 현재 열려 있는 탐색기 창 가져오기
    windows = shell.Windows()

    for window in windows:
       # 탐색기 창이 폴더를 표시하는지 확인
       print(window.Name)
       if window.Name in ["Windows 탐색기", "File Explorer", "파일 탐색기"]:
          folder_view = window.Document
          print(folder_view.Selecteditems().Count)
          selected_items = folder_view.Selecteditems()

          # 선택된 파일의 경로 출력
          for item in selected_items:
             print("경로  => ", item.Path)
             print("타입  => ", item.Type)
             print("이름  => ", item.Name)

get_selected_filenames_at_explorer ()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
위의 코드를 좀 다듬어서 아래의 youtil 모듈의 함수로 만들었습니다. 간단하게 그냥 youtil모듈을 import한후에 탐색기를 킨다음에 함수를 실행하면 그결과로 다음과 같이 나옵니다
# -*- coding: utf-8 -*-
import youtil

xutil = youtil.youtil()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
l2d = xutil. get_all_selected_file_n_folder_at_explorer()
xutil.print_one_by_one(l2d)
word-image-2909-3.png 이번에는 우리가 원하는 파일을 바꿔보는 것을 보여드립니다 word-image-2909-4.png 먼저 아래의 코드를 사용해서 현재의 선택된 것을 갖고오는 방법을 보여드리면, 아래와 같습니다
# -*- coding: utf-8 -*-
import youtil

xutil = youtil.youtil()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
l2d = xutil.get_all_selected_file_n_folder_at_explorer()
xutil.print_one_by_one(l2d)
word-image-2909-5.png 이번에는 폴더로 들어온 것의 이름을 바꿔보고, 파일중에 두번째것을 다른이름으로 바꿔보는 것을 보여드립니다 1번째 폴더의 이름을 new_folder_002로 바꿔봅니다
# -*- coding: utf-8 -*-
import youtil

xutil = youtil.youtil()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
l2d = xutil.get_all_selected_file_n_folder_at_explorer()
xutil.print_one_by_one(l2d)

new_folder_name = "new_folder_002"
path, name = xutil.split_directory_as_path_n_filename(l2d[0]["path"])
print(path, name)
xutil.change_folder_name(l2d[0]["path"], path+"\\"+new_folder_name)
word-image-2909-6.png 두번째로 파일을 바꾸는 부분은 폴더를 바꾸는 것과 같기는 하지만 한번더 해보도록 하면,
# -*- coding: utf-8 -*-
import youtil

xutil = youtil.youtil()
# 파일 탐색기에서 선택한것의 정보를 갖고오는것
l2d = xutil.get_all_selected_file_n_folder_at_explorer()
xutil.print_one_by_one(l2d)

new_file_name = "new_file_222.docx"
path, name = xutil.split_directory_as_path_n_filename(l2d[2]["path"])
print(path, name)
xutil.change_filename(l2d[2]["path"], path+"\\"+new_file_name)
word-image-2909-7.png]]>
Tue, 18 Mar 2025 21:01:58 +0000
<![CDATA[xython - 패키지의 전체적인 용어 정의 (2025-03-16 update)]]> 용어 용어의 사용 뜻 기타 **input_dic 사전형식의 여러값이 들어올때 *input_list 몇 개의 자료가 올지 모를때 0,0 왼쪽아래 영역에서는 모든것을 뜻함 56color 엑셀의 기본 56가지색 action_name action id를 이렇게 말하자 add 기존에 있는것의 일반적인 끝에 넣는 것 기존것에 추가하는 것 all 가능하면 all이란 단어를 사용, all + 대상물 복수의 개념 append 맨끝에 추가할 때 새로운 같은 형태를 추가하는것 by_limit 번호가 들어가 그때까지 적용 by_step_번호 번호가 들어가 그 간격으로 실행될 때 change 무엇인가 바꾸기 위한 목적 전체를 변경 char 공백도 1개의 글자임 check 어떤 값이 맞는지를 확인하는 목적 clear_x 값만 삭제하는 기능이며, db의 경우는 None으로 변경되는 것이다 clear +x=> delete +value color color_style 파스텔 톤과 같은것 ComputeStatistics 워드에서 특정 텍스트나 문서 전체에 대한 다양한 정보를 얻을 수 있는 기능 control 입력으로 들어오는 값의 형태는 같으면서, 조건에따라서 변경을 하는것 어느 영역안에서 조정을 할 때 cpx 셀의 좌표번호 c : Cell의 약어, p : pixel의 약어 cpx 셀의 좌표번호 c : Cell의 약어,  p : pixel의 약어 curr_x 키보드등으로 움직이는 현재의 셀 current 어떤 객체 든지 현재에 활성화된것을 뜻함 data 한번에 전체적인 자료를 돌려주는 것 결과값으로 어떤 종류의 자료를 돌려줄 때 data_로_시작_되는_단어 주로 사용되는 자료들을 쉽게 읽어올수있도록 만든것 datetime 1900.1.1을 1초로 시작, date 클래스의 isoformat() - YYYY-MM-DD의 형태를 말합니다 delete 쓰거나 인쇄한 값을 삭제하는것 이것으로 통일하자 delete_x 값만 지우는것 혼돈되는 부분이 있음 delete_xline 라인을 삭제하는 것 delete_xvalue x의 값만 삭제 하는 것 Dic 자료의 형태가 dic형태로 줄때는 맨뒤에 dic을 붙임 dic_list 전체적으로 사전형식인데, 내부적인 자료는 리스트형인 것 dicdb 사전형으로 된 database형 dic : dictinary draw 선을 그을 때 사용 라인에 대한 색과 형태등을 설정할때 dt_obj datetime 객체 dx 두지점간의 차이 D : Difference 또는 Delta dx, dy 포인트간의 길이, 두지점간의 차이 D : Difference 또는 Delta empty_y 이것보다는 empty_yline으로 표기하는 것이 더 좋아보임 ??? enum 사전형식으로 되어있으며, 엑셀이나 워드에서 사용하는 공유의 번호 filename 파일 이름 filepath 파일까지의 경로 fill 빈곳을 채워넣는 것 find 우연히 발견된다는 의미로, 이것은 search로 바꾼다 사용 X font_dic 어떤 전체적인 한 객체의 속성을 정하는 것, 어떤 여러가지 속성을 정의해야만 사용 가능한것들에 대한 것을 정의 dic : dictinary fullpath 화일이름을 포함한 전체경로 fullpath = filepath + filename get 입력값이 없는 조건에서의 자료를 갖고올때 read를 제외한 모든 자료를 갖고올 때 gx, gy graphic기준의 x, y 좌표 (graphic_x) pixel의 px와 혼돈이 될수있어서 px를 사용하지 않음 g : graphic hsl 색을 표현하는 기법중 하나, HSL(hue, saturation, lightness, 즉 색상, 채도, 밝기) ilist, indexlist index를 기준으로 번호를 가진 list index 0부터 시작하는 번호의 변수용, i로 표시 접두어를 i로 사용 index, ix, iy 0부터 시작되는 연속되는 번호를 사용할 때 i는 index의 의미 input 내부적으로 어떤 값을 넣을 때 결과 값이 없음 input_data 어떤 자료형태가 올지 모를 때, 기본으로는 1차원리스트이다 Input_dic 사전형식일 때 Input_list1d 1차원 리스트가 입력값일 때 Input_list2d 2차원 리스트가 입력값일 때 input_pm “+++”, “---”의 형태를 사용하는 것 plus, minus의 뜻 input_text input_tf 입력값이 true, false인 경우 tf : true false의 뜻 Input_value 숫자형의 자료가 입력될때 1개의 값이 입력변수로 올때 Insert 내가 원하는위치에 넣는 것 새로운 뭔가를 만드는 것 ixiy, ix, iy 0부터시작되는 번호 i는 index의 의미, O 부터시작 ixyxy ixyxy = [1,4,7,9] = [1:7][4:9] i는 index의 의미, O 부터시작 iylist [0,2,6,8] 이런 식으로 된 것 i는 index의 의미, O 부터시작 jfsql jfinder형식으로 사용되는 정규 표현식 l1d 1차원리스트의 자료 보통 코드의 안쪽의 반복형을 사용할때 쓰임 l2d 2차원리스트의 자료 level1 0~1까지의 값변화로 조정하는 것 level100 0~100까지의 값변화로 조정하는 것 list 문자들이 구분되어져서 따로 형태를 가질수있는 영역의 구분 list_1d, list1d 1차원리스트의 자료 list_2d, list2d 2차원리스트의 자료 listdb, list_db list의 형태이지만, col의 자료가 별도의 리스트형으로 되어있는, 2차원형태의 자료 [[y_name-1, y_name_2.....],[[a1, a2, a3...], [b1, b2, b3...], ]] make 새롭게 뭔가를 만들때, new보다는 더 사용하기 편함 New many_yline 여러 개의 y라인을 추가한다면, 어떻게 해야 하나 연속적이지 않는 y를 뜻함 move 자료를 다른 객체나 위치로 옮기는 것 mx, my, mpx 마우스의 좌표 M : mouse의 약어 nea n개의 new 새로운것을 만드는 개념 make no, num 1부터 시작되는 연속되는 번호를 사용할 때 num을 권장 no_list, nolist yy 연속된 y의 시작과 끝 [1,4], [1:5] iyy : 연속된 y의 시작과 끝 [0,4], [0:5] nth n번째의 , 0부터 시작하는 것 obj object의 짧은 사용법 Obj : object object 객체를 뜻하는 것 paint 어떤 영역에, 색을 칠하는것 paragraph 줄바꿈이 이루어지기 전까지의 자료 parameter_item 1개의 파라미터 parameter_item_option_set 한개의 parameter_item 의 option 사항들 parameter_item_set all parameter element, parameter id의 모든 파라미타 들 parameter_name 각 action에 연결된 parameter의 번호, parameter id와 같은 개념 pccs_style 일본색체연구서가 발표한 12가지 색으로 구분한것, 톤에 대한 12가지 구분 연한, 밝은회색, 회색, 어두운회색, 옅은, 부드러운, 탁한, 어두운, 밝은, 강한, 짙은, 선명한 pick 여러개중에서 하나를 갖고올 때 plusminus100, pm100 ++, --, 70등의 값이 들어오면 변화를 시켜주는 것 pwh 넓이, 높이의 길이를 픽셀단위로 나타낸것 P : pixel의 약어 px 그림을 그리고 싶은 좌표, 커서의 픽셀 좌표 P : pixel의 약어 pxpy 포인터로된 좌표의 위치 P : pixel의 약어 range_object 객체를 넣어줄 때 object를 붙인다 어떤 객체를 의미할때는 obj를 붙인다 Read 입력값이 있으면서 어떤 자료를 갖고올 때 사용 눈에 보이는 값을 읽을 때 (화면에 보이는 것) remove 값이외의 객체등의것을 제거하는것 사용 X remove_x x열을 없애는 것 replace 전체또는 일부를 변경 전체내용중에서 일부를 변경 rgb [빨강의 농도, 초록의 농도, 파랑의 농도], rgbint rgb값을 정수로 변경한것 scolor 색을 blu와 같이 3글자의 영문 시작 색이름으로 하고, 그 농도를 숫자나 +-기호로 변경하는것, 예 (blu++, blu55) scolor형식의 색이름 search 결과물이 1개가아닌 리스트나 듀플의 형태로, 다른 정보까지 있을때 찾고자하는것을 찾는것 sel_x 셀렉션된 영역 select 어떤 영역을 선택할 때 selection 선택된 영역 sentence 표현이 완결된 단위, 그 자체로 하나의 서술된 문장이 되는 것 set 입력값이 특별한것없이 자료를 설정하는 것 설정값을 변경할 때 space_px 기준이되는 것 split 자료를 분리하는 것 sqlite_memory_db 메모리에 저장이되는 database, 최종적으로 저장은 따로 해야 한다 step 일정 간격의 자료를 적용할때 step_by_aaa aaa에 대한 일정 간격마다 stx1, sty1, stx3, sty3 현재 선택된 table의 셀번호 (select) 워드에서 여러테이블을 다룰 때 tbl_x 테이블의 x timestamp utc기준으로 1970년 1월1일부터 1초마다 숫자를 더해서 사용 to 현재 자료는 바뀌지 않고, 결과만 돌려주는 것 tx, ty 테이블의 셀좌표 (table_x), cell의 번호에 대한것, table에서 몇번째 셀이라는 쯧 T : table의 약어 tx0, ty0, tx1, ty1 그리드안의 영역 (table_x) T : table의 약어 utc 1970.1.1을 1초로 시작 win_x 윈도우의 x Write 눈에 보이는 것, 기존값을 대치하면서 쓰기 눈에 보이는 값을 쓸 때 x, y cell의 기본좌표, X: 가로줄번호, Y: 세로줄 번호 컴퓨터안의 x, y (마우스의 위치와 같은 px의 위치) x_name 가로줄의 이름이나 제목, xx_name와 동일하나 1개라는 의미로 사용 x_y 1,2의 형태 (2개의 자료) 함수에서 사용하는 의미 x0, y0, x1, y1 컴퓨터안에서의 영역 xx [x, x2] xx, yy [2:3]과 같은 형태, 코드 내부적으로사용할 때 연속된 x나 y xx_name xxline 한글과같이 해석적으로 복수인것이니 기본적으로 복수를 나타내는 단어는 사용하지 않는다, xxline 은 그상태 그대로 복수의 의미이다 xx와같은의미이나 이것이 더 좋아보일때는 이것을 사용 xxlist 세로의 자료를 1부터 시작하는 개념으로 리스트를 만든것 xxyy [1,3], [5,7] 이런것이나 [1,3,5,7] xy 하나의 셀에대한 좌표, [1,2]와 같은 형식의 자료 [x,y], [1,2]의 형태 (1개의 리스트 자료) xy_list xy형식의 리스트 [[1,2], [3,4], …] xyrange, xy_range 이런형태로 일반적인 리스트나 xylist형태인 도 사용가능한 방법 ['2~3':'4~5'], ['1~2'],['2~3':'~5'] xylist의 개념 xywh 셀의번호를 기준으로 가로의갯수, 세로의 개수 개념으로 사용하는것 시작좌표와 길이와 넓이로 나타낸 것 xyxy 셀의 영역에 대한 좌표, [1,1,5,5]같은 형식 xyxy = [1,4,7,9] = [0:7][3:9] 와 같다는 것이다 x와 xline x와 xline을 같이 사용해도 좋을 듯 하다 y_data 한줄의 자료, 2차원의 자료임, y_data2d와 동일 y_index, iy, yindex iy와 동일 y_line, yline 제목과 값이있는 자료의 형태, [y_name, y_data]와 동일 y_name, yname 세로줄의 이름이나 제목, yy_name와 동일 동일하나 1개라는 의미로 사용 y_num, ynum 거의 사용하지 않을 것임 y_title 각 세로열의 제목 ylist y여러개 [1,3,7,9] 이런 식으로 된 것 ytitle 컬럼의 제목이름 ytitle_list 컬럼제목의 리스트 ytype 컬럼 y의 자료형식 yy [y, y2] yy_name, yyname yylist 자료형태가 yy인것의 리스트집합형 [1,3], [5,7]]과 같은 형태 yytitle ["제목1~제목4"] yy와 yyline yy로 변경 글 커서 뒤의 글자 단어 (단어+ 뒤의공백)까지를 포함한것 커서 캐롯의 의미 커서의 위치 선택영역에서, 제일 앞부분의 글자위치 한 주의 시작 '월'요일 부터 ]]> Sun, 16 Mar 2025 11:23:54 +0000 <![CDATA[xy_excel(엑셀) - panthom link 만들기]]> xy_excel(엑셀) - panthom link 만들기 연습용으로 사용하시는 방법을 위해 panthom link를 만드는 방법을 보여드립니다

만드는 방법은
  • 영역을 선택을 해서 이름을 지은 다음에
  • 그영역의 가로나 세로열 자체를 지워버리시면 만들어 집니다

# -*- coding: utf-8 -*-
import xy_excel
xl = xy_excel.xy_excel()

range_set = [[1,1],[2,2,4,4], [5,5], [7,1,10,5], [12,1,14,5]]
range_name_set = ["이름영역1", "이름영역2", "이름영역3", "이름영역4", "이름영역5"]
for index, one_name in enumerate(range_name_set):
xl.set_range_name_for_range("", range_set[index], one_name)

word-image-2880-1.png

이번엔, 모두 panthom link를 만들어 봅니다. 즉,이름영역의 해당되는 전체 가로열과 세로열을 삭제하면 링크가 깨지면서 만들어지는 것이며, 저는 전체 가로열과 세로열을 한번에 다 삭제한 것입니다

# -*- coding: utf-8 -*-
import xy_excel
xl = xy_excel.xy_excel()

range_set = [[1,1],[2,2,4,4], [5,5], [7,1,10,5], [12,1,14,5]]
range_name_set = ["이름영역1", "이름영역2", "이름영역3", "이름영역4", "이름영역5"]
for index, one_name in enumerate(range_name_set):
xl.set_range_name_for_range("", range_set[index], one_name)


xl.delete_xxline_in_sheet("", [1,20])
xl.delete_yyline_in_sheet("", [1,10])

word-image-2880-2.png]]>
Sat, 15 Mar 2025 14:30:32 +0000
<![CDATA[xymap(기초) - 지도위에 어떻게 도형이나 그림을 그리는가?]]> 지도위에 어떻게 도형이나 그림을 그리는가? 위에서 설명한 그림중에서 vector형식으로 가능한 것이 대부분 도형입니다. 선을 긋거나 하는 대부분의 일을 vector로 하는 것이지요. 아래의 것을 각각 적용하면 됩니다 사용법은 각각의 것은 형태를 배워야 합니다. 약간씩은 차이가 있지만, 대부분은 만든사람도 사용하는 사람도 중요한 부분으로 무엇이 들어가야 하는지는 대충 알고있죠
1 Polyline 선그리기
2 Polygon 다각형 연결
3 Rectangle 사각형
4 Circle
5 Marker 점표시
6 CircleMarker 마커를 가진 원
요소 종류 설명
Marker 특정 위치에 점으로 표시. 아이콘, 팝업 등을 추가하여 정보를 제공가능
Polyline 두 개 이상의 점을 연결하여 선을 그립니다. 도로, 강, 경로 등을 표시
Polygon 폐쇄된 영역을 나타내는 다각형입니다. 국가, 도시, 건물 등을 표시
Circle 위치를 중심으로 반지름을 가지는 원. 특정 지역의 반경을 나타낼 때 사용
CircleMarker Marker와 유사하지만, 반지름을 지정하여 원형으로 표시
FeatureGroup 여러 개의 요소를 하나의 그룹으로 묶어 관리. 레이어처럼 사용하여 지도 위에 표시하거나 숨길 수 있음
LayerControl 여러 개의 FeatureGroup을 레이어 형태로 관리하여 사용자가 원하는 레이어만 선택하여 표시할 수 있도록 합니다
기본적인 지도보기 가장 기본이되는 아무것도 없는 순수한 지도만 불어오는 기능에 대한 예제를 보여드립니다
# -*- coding: utf-8 -*-
import xy_map
xymap = xy_map.xy_map()

xymap.new_map([37.388738, 126.967983], 10) #지도에서 보여줄 위치와 지도의 크기를 설정
xymap.draw_marker([37.493869, 126.530965], "tooltip_text","popup_text") #마커를 추가
xymap.show_map("file_name_for_xymap.html") # 화일로 저장하면서, 보여주는것
word-image-2847-1.png

간단한 몇가지 지도 만들기

word-image-2847-2.png 제가 출근을 하는 지하철역인 평촌역의 위도와 경도를 구글맵에서 찾아봅니다
import folium

m = folium.Map(location=[37.39434998313918, 126.9639149003046], zoom_start=12)
m.save('D:\\map_test\pyez_map_01.html')
이렇게 만들면 아래와같이 인터넷이 연결되어 있으면 나타나는 것이다 위도 경도는 알것이며, 이것이 중간에 오돌고 만든것이며, zoom_start는 화면을 화면을 얼마나 키울것인지를 정하는 것이다 word-image-2847-3.png 이제 평촌역에 마크를 찍어보도록 하겠습니다
import folium

m = folium.Map(location=[37.39434998313918, 126.9639149003046], zoom_start=12)

folium.Marker([37.39434998313918, 126.9639149003046],
popup='평촌역',
tooltip='근처에오면 나타나는것',
fill_color='red',
icon=folium.Icon(color="red", icon="cloud"),
draggable= True
).add_to(m)

m.save('D:\\map_test\pyez_map_01.html')
maker라는 기능으로 새로운 마크부분의 레이어를 만드는 것이고, 필요한만큼 리스트로 만들어서 반복문을 만들어서 적용을하면 여러 개의 마크를 넣을수있는것이다 물론 마크에도 다른 여러가지 추가기능도 있으니 링크를 하거나 그런것들을 추가해서 사용하시기를 바랍니다 word-image-2847-4.png 이번에는 한국의 시군구 행정지도를 전국지도위에 나타내도록 해보자 그럴려면 먼저 geojson으로 만든 자료를 다운받아야 한다. 일단 잘 ㅇ나보여서 사이즈를 7로 만들어서 전국이 보이도록 만들었다 word-image-2847-5.png word-image-2847-6.png 이렇게 'D:\\map_test\pyez_map_01.html'의 이름으로 저장이 되니 이것을 다른사람에게 보내서 열어보면 나타난다 자 이런것들을 잘 만들어서 내가 개인적으로 맛집리스트의 보관을 위해 만들어본 자료를 공유해본다 단, 영역을 나타내는 것은 맛집리스트를 나타내는 용도가 아니기 때문에 그것은 제외를 시켰다
import folium
from folium import plugins

icon_type = ["cloud","info-sign","star","bookmark","flag", ]
color_type = ['lightred', 'gray', 'lightgreen', 'pink','lightblue', 'beige', 'black', 'darkgreen', 'darkblue', 'lightgray', 'green', 'white', 'red', 'blue', 'orange', 'darkred', 'purple', 'cadetblue', 'darkpurple']

input_lists = [
['37.55440684521157', '127.12937429453059','food_land','방이 샤브샤브','맛나는데 여자들이 더 좋아해요'],
['37.1834787433397','128.466953597959','food_land','미탄집','메밀전병'],
['37.2079513137108','128.986557255629','food_land','구와우순두부','순두부'],
['37.4394032971955','129.191077282623','food_sea','바다횟집','감자가 더 맛남'],
['37.754685298115','128.892883699817','food_land','벌집','장칼국수'],
['37.7575959968149','128.892604911465','food_land','현대장칼국수','장칼국수,'],
['37.5042414054923','127.055259984471','food_land','피양콩할마니','피양콩할마니'],
['38.2033207916817','128.591515153804','food_sea','엄지네포장마차','꼬막'],
['38.1952821302829','128.579786653923','food_land','동화가든','땀뽕순두부'],
['37.9458138292635','128.328946098098','food_land','고향집','순두부'],
['36.0995687389908','127.589196711552','food_sea','용강식당','어죽'],
['37.3999806660193','126.975119125071','food_land','원조곱창','곱창'],
['37.399935096617','126.975471269251','food_land','원시쪽갈비','쪽갈비'],
['34.9521663667122','127.487343513381','food_sea','순광식당','낙지볶음'],
['37.7912748626138','128.910415953845','food_land','토담순두부','나는 맛있는데 다른 사람은 그저그렇다함 약간 탄맛이 나는 집임 주문하고 오죽헌이 바로 옆이라 기다릴때 좋음'],
['38.2314967503015','128.582627826868','cafe','바다정원','적극 추천 주차장이 넓으며 꼭 무었을 먹지 않아도 됨 엄청 넓음'],
['38.2046823187654','128.590054913374','food_land','속초중앙시장','순대국이 유명함'],
['37.9333209329239','127.793253926861','food_sky','통나무집닭갈비','나쁘지 않음 다른델 가보지 않아서..그렇다고 와~~하는 맛은 아님'],
['37.0703599083337','127.064082471021','food_land','최네집','맛있음 / 추천'],
['37.3184959577525','126.839966371027','food_sky','정든닭발','여자들이 좋아함 개인적으로 이런종류를 좋아하지 않아서…'],
['37.3939163520767','126.962935098014','food_sea','생태명가','맛있음 / 추천'],
['37.3462987770993','127.335722528698','food_land','최미자소머리국밥','고기가 냄새도 안나고 맛있음 가볼만 함'],
['37.5039277741022','127.053058055688','food_land','백암농민순대','순대 좋아하는 사람은 맛있다고 함'],
['37.5033233846917','127.051987082674','food_land','뽕나무쟁이족발','한번은 먹어볼만한집 줄서서 먹는집'],
['37.5257050210618','127.052910328702','food_land','새볔집','육회 비빕밥과 된장이 맛있는 집'],
['37.5042978375586','127.054266726852','food_land','카토멘','개인적으로 먹을만 함 토마토가 많이 들어있음 토마토를 기준으로 만든곳 건강 라멘'],
['37.7478858820528','126.485243986378','food_land','일억조','맛있음 근데 딱히 어떤 맛이라고 하기에는 힘듬'],
['35.0321451418816','126.717044499816','food_land','하얀집','맛있음 국물이 맑음'],
['35.2533252378496','126.952127826807','food_land','담양쌍교갈비','추천 / 맛과 가성비가 정말 좋은집'],
['35.978433999337','126.715782226821','food_land','복성루','맛있음 볶음밥도 맛남'],
['36.3004275126493','127.569849657513','food_sky','경진각','건강한 짬뽕 / 괜잖음'],
['37.5084834823297','127.065552628647','food_land','강남구 중앙해장','예전엔 더 좋았는데 아직도 맛나긴함, 근데 너무 가격을 자주 올림'],
['37.50932856891103','127.056312013306','food_land','강남구 한방정통삼계탕','강남구 한방정통삼계탕'],
['37.5038671857236','127.054679542141','food_land','강남구 호천당','강남구 호천당'],
['35.1540951478414','126.910056740248','etc','광주 무등분식','나는 상추튀김을 좋아함'],
['35.9796848674394','126.71918782677','food_land','군산 뽀빠이냉면','군산 뽀빠이냉면'],
['37.3792036157342','126.973036999809','food_land','의왕 황제짬뽕','의왕 황제짬뽕'],
['37.0076440342247','127.272738082614','food_land','경기도 안일옥','설렁탕집'],
['37.917476522754','127.055426053798','food_land','동두천 오륙하우스','경양식'],
['37.6123973036119','127.137494478308','food_sea','구리 어랑추','고등어김치찌개'],
['37.3948275853207','126.962858554913','food_land','평촌 한성집','돼지고기 특수부위'],
['37.3617402712768','127.244431716815','food_land','광주 황소고집','돼지고기 특수부위 / 가성비 굳'],
['37.5349891971756','127.067797193612','food_land','건대 계탄집','닭갈비'],
['37.5061396015078','127.054713624954','cafe','강남 포스코빌딩','테라로사'],
['37.52607055531','127.035764293608','cafe','강남 누데이크 하우스도산','카페'],
['37.769251690238','128.9181384422','cafe','강릉빵바다','인절미빵'],
['37.7292122536139','126.703002139736','cafe','파주 더티트렁크 카페','파주 더티트렁크 카페'],
['37.4112132100277','127.114463885606','cafe','판교 사송카페','판교 사송카페'],
['37.3789074156138','127.164225362851','cafe','광주 카페인신현리','광주 카페인신현리'],
['37.6740051317982','127.376212778339','cafe','남양주 베이커리 씨어터','남양주 베이커리 씨어터'],
]

m = folium.Map(
location=[37.3825321569003, 126.9703265151501],
zoom_start=9
)

fg = folium.FeatureGroup(name='육해공군과 카페를 한눈에')
m.add_child(fg)

g1 = plugins.FeatureGroupSubGroup(fg, '카페')
m.add_child(g1)

g2 = plugins.FeatureGroupSubGroup(fg, '음식-육')
m.add_child(g2)

g3 = plugins.FeatureGroupSubGroup(fg, '음식-해')
m.add_child(g3)

g4 = plugins.FeatureGroupSubGroup(fg, '음식-공')
m.add_child(g4)

g5 = plugins.FeatureGroupSubGroup(fg, '음식-기타')
m.add_child(g5)

g6 = plugins.FeatureGroupSubGroup(fg, '분류제외')
m.add_child(g6)


folium.LayerControl(collapsed=False).add_to(m)




for one_data in input_lists:
if one_data[2] == "cafe":
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[0],icon=icon_type[0]),
tooltip=one_data[3],
).add_to(g1)
elif one_data[2] == "food_land":
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[1],icon=icon_type[1]),
tooltip=one_data[3],
).add_to(g2)
elif one_data[2] == "food_sea":
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[2],icon=icon_type[2]),
tooltip=one_data[3],
).add_to(g3)
elif one_data[2] == "food_sky":
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[3],icon=icon_type[3]),
tooltip=one_data[3],
).add_to(g4)
elif one_data[2] == "etc":
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[4],icon=icon_type[4]),
tooltip=one_data[3],
).add_to(g5)
else:
folium.Marker(
location=[one_data[0], one_data[1]],
popup=one_data[2],
icon=folium.Icon(color=color_type[5],icon='star'),
tooltip=one_data[3],
).add_to(g6)

m.save('D:\\map_test\pyez_map_02.html')
word-image-2847-7.png 이번에는 각 구별로 된것중에 내가있는 안양시 동안구에 색을 넣는 형태를 만들어 보려고 한다 그럼 이번엔 어떻게 되는것인지 다시한번 생각해 보도록 한다
  • 지도자료위에 선으로 행정구역 표시를 한다
이것이 바로 polygon이라는 기능으로 좌표를 연결해서 영역을 만드는 것이고, 어떤 분들께서 지속적으로 우리나라의 행정구역에 대한 자료를 update를 해주시고 계십니다 감사한 말씀을 드립니다 그것을 joson의 자료를 보면, text로 되어있으며, 각 구역의 code번호를 넣어서 관리를 하고있는 것입니다 예를 들어 검색을 하여 찾아보니 안양시 동안구의 코드는 SIG_CD : 41173라고 되어있네요 만약 “안양시 동안구”의 색을 빨간색으로 칠하고 싶다면, 고유한 번호인 41173인 구역을 빨간색으로 하면 되는 것입니다 word-image-2847-8.png 위의 자료에서 안양시 동안구의 자료만 갖고와보면
{
"type":"Feature",
"geometry":{
"type":"Polygon",
"coordinates":[[[126.964,37.441], [126.965,37.439],[126.963,37.435],
[126.961,37.426],[126.962,37.421],[126.967,37.417],
[126.973,37.416],[126.976,37.411],[126.976,37.406],
[126.979,37.405],[126.983,37.4],[126.98,37.396],
[126.983,37.395],[126.974,37.389],[126.973,37.387],
[126.972,37.38],[126.967,37.375],[126.965,37.371],
[126.966,37.369],[126.964,37.365],[126.966,37.362],
[126.962,37.362],[126.957,37.366],[126.952,37.366],
[126.948,37.369],[126.946,37.373],[126.947,37.375],
[126.939,37.38],[126.941,37.386],[126.94,37.393],
[126.931,37.398],[126.927,37.402],[126.927,37.408],
[126.93,37.415],[126.938,37.414],[126.942,37.419],
[126.948,37.422],[126.948,37.425],[126.949,37.429],
[126.948,37.437],[126.952,37.439],[126.959,37.439],
[126.964,37.441]]]},
"properties":{"SIG_CD":"41173","SIG_ENG_NM":"Dongan-gu, Anyang-si","SIG_KOR_NM":"안양시동안구"}},
사전으로 만들어진 자료인 것을 알수가있다 즉, 다각형인 polygon을 이용하여 시작점과 끝점이 만나도록 해서 영역을 만드는 것이다 한땀한땀 수작업이 필요한 일을 어떤 분께서 해주신것이라는 고마움을 느껴보자 이런 다각형에 각자 이름을 넣어서 찾아 거기에 알맞은 색을 넣는것이라고 생각하면 맞는것이다 그럼 위의 폴리곤의 자료만 갖고가서 한번 영역에 빨간색을 칠해 보도록 하자]]>
Mon, 10 Mar 2025 21:50:11 +0000
<![CDATA[한글을 초중종성으로 분리하기]]> 1006 - (한글)한글을 초중종으로 분리하기 **
# -*- coding: utf-8 -*-
import youtil
xutil = youtil.youtil()

sentence = "한글입니다abc"
aaa = xutil.split_korean_to_jamo_list(sentence)
print(aaa)
1pQqEZBCAAAQhAAAIQgABzAbyPirkhRoAABCAAAQhAAAIQUL4A6lTlm2JECEAAAhCAAAQgAAHmAqhTmRtiBAhAAAIQgAAEIAAB5QugTlW+KUaEAAQgAAEIQAACEGAugDqVuSFGgAAEIAABCEAAAhBQvgDqVOWbYkQIQAACEIAABCAAAeYCqFOZG2IECEAAAhCAAAQgAAHlC6BOVb4pRoQABCAAAQhAAAIQYC6AOpW5IUaAAAQgAAEIQAACEFC+AOpU5ZtiRAhAAAIQgAAEIAAB5gKoU5kbYgQIQAACEIAABCAAAeUL8H797Xh29jvlD4wRIQABCEAAAhCAAAQgwECAZ2fb8kTIeQYjoCsEIAABCEAAAhCAAASUL8Bz79U18UWy8gfGiBCAAAQgAAEIQAACEGAg8P9dJn64+m3DiQAAAABJRU5ErkJggg==

1007 - (한글)한글의 초성만 갖고 오는 코드

초성게임할때도 필요하지만, 한글 자료들을 분리해서 사용하고자 할 때 이용하시면 됩니다 코드 자체는 그리 어렵지 않기 때문에 보시면 됩니다 1. 입력으로 들어온 한글을 한글자씩 자음+모음+받침으로 분리된다 2. 1번의 제일 첫번째의 자료들만 모으면, 초성이 되는 것이다
xutil = youtil.youtil()

sentence = "한글입니다abc"
aaa = xutil.split_korean_to_cho_sung_list(sentence)
print(aaa)
F2OAoKCuzs7L5yOhA+EAACQKBLCXzhjYgujQWcAwEgAARIRgBaMMkSBnKBABCQJALQgiUpmxALEAACJCMALZhkCQO5QAAISBIBaMGSlE2IBQgAAZIRgBZMsoSBXCAABCSJALRgScomxAIEgADJCEALJlnCQC4QAAKSRABasCRlE2IBAkCAZASgBZMsYSAXCAABSSIALViSsgmxAAEgQDIC0IJJljCQCwSAgCQRgBYsSdmEWIAAECAZAWjBJEsYyAUCQECSCEALlqRsQixAAAiQjAC0YJIlDOQCASAgSQSgBUtSNiEWIAAESEYAWjDJEgZygQAQkCQC0IIlKZsQCxAAAiQjAC2YZAkDuUAACEgSAWjBkpRNiAUIAAGSEYAWTLKEgVwgAAQkiQC0YEnKJsQCBIAAyQhACyZZwkAuEAACkkQAWrAkZRNiAQJAgGQEoAWTLGEgFwgAAUkiAC1YkrIJsQABIEAyAtCCSZYwkAsEgIAkEYAWLEnZhFiAABAgGQFowSRLGMgFAkBAkghAC5akbEIsQAAIkIwAtGCSJQzkAgEgIEkEoAVLUjYhFiAABEhGAFowyRIGcoEAEJAkAtCCJSmbEAsQAAIkIwAtmGQJA7lAAAhIEgFowZKUTYgFCAABkhGAFkyyhIFcIAAEJIkAtGBJyibEAgSAAMkIQAsmWcJALhAAApJEAFqwJGUTYgECQIBkBKAFkyxhIBcIAAFJIgAtWJKyCbEAASBAMgLQgkmWMJALBICAJBH4P6J0RJigPQoHAAAAAElFTkSuQmCC]]>
Mon, 10 Mar 2025 21:35:30 +0000
<![CDATA[xy_excel(엑셀) - 세로로된 한줄 자료를 그룹으로 묶어서 2차원 자료로 새로운 시트에 쓰기]]> xy_excel(엑셀)  - 세로줄 자료를 그룹으로 만들어서 새로운 시트에 쓰기 자료가 되었건, 어떤 자료의 경우는 가로나 세로의 자료를 그룹으로 묶어서 만드는 방법입니다. 결론을 먼저 보여드리면, 아래와 같이 변경을 하는 것입니다

word-image-2829-1.png => word-image-2829-2.png

이번의 코드는 그림의 왼쪽과 같은 자료를 만든 코드입니다

# -*- coding: utf-8 -*-
import xy_excel
xl = xy_excel.xy_excel()

xl.new_sheet() #새로운 시트를 만든다
xl.write_list_1d_in_yline("", [1,1], list(range(1, 300))) #1~299의 값을 세로로 만든다

위의 자료를 기준으로 그룹화하여 옆에 쓰는 부분입니다

# -*- coding: utf-8 -*-
import xy_excel
import xy_util

xl = xy_excel.xy_excel()
xutil = xy_util.xy_util()

l2d = xl.read_range("", [1,1,300,1]) #1,1 ~ 300,1까지의 값을 읽어온다
l1d = xutil.change_list_2d_to_list_1d(l2d) # 세로의 값을 읽어오면 2차원의 자료이다, 2차원의 자료를 1차원으로 만든다
l22d = xutil.change_list_1d_to_list_2d_group_by_step(l1d, 10) #1차원의 자료를 그룹화하여 2차원으로 만든다

xl.new_sheet() #새로운 시트를 만든다
xl.write_list_2d_from_cell("", [1,5], l22d) #앞에서 그룹화한 자료를 쓴다

참고로 아래와 같이 일정 부분의 자료를 감추는 것을 적용한다면,

xl.hide_xxlines("", [10, 290])

위와 같이 적용하면 됩니다

word-image-2829-3.png]]>
Sun, 09 Mar 2025 07:39:54 +0000
<![CDATA[xy_excel(엑셀) - 그림의 크기조절및 정렬]]> xy_excel(엑셀) - 그림의 크기조절및 정렬 아래와같이 먼저 우리가 그림이 이동할 공간과 그림을 하나 넣습니다

word-image-2823-1.png
  1. [3,3,7,7]의 필셀 크기를 알아냅니다
  2. 그램객체를 만듭니다
  3. 그림객체의 크기를 1번에서 찾은 것으로 변경합니다
  4. 그림객체의 가로/세로비율유지를 끈다
  5. 다시한번 1번의 크기에 맞도록 변경한다
pxywh = xl.get_pxywh_for_range("", [3,3,7,7]) #엑셀영역의 크기를 구하는것
xl.set_size_for_shape("", 1, pxywh[2], pxywh[3], True) #도형객체의 크기를 변경
xl.move_shape_position("", 1, pxywh[1], pxywh[0]) #도형의 위치를 이동시키는것


word-image-2823-2.png

만약 2번째라인을 False로 바꾸면 아래와같이 가로세로의 비율이 유지되는 것입니다

만약 아래의것을 먼저하고 위의것을 하면 기본적으로 비율이 변경이 되기 때문에 같은 형태가 계속 유지됩니다

그러니 임의적으로 맨 처음의 가로세로비율로 바꾸면 적용되는 것입니다

word-image-2823-3.png]]>
Wed, 05 Mar 2025 19:39:06 +0000
<![CDATA[워드 - 선택한 영역의 각문단을 기준으로 정규표현식과 같은 것을 바꾸기]]> (워드) 선택한 영역의 각문단을 기준으로 정규표현식과 같은 것을 바꾸기 워드나 텍스트의 자료를 보면, 번호메기기가 아니라, 그냥 문자의 형태로 아래의 그림과 같이 되어있는 경우가 있습니다. 그런데 그냥 전부 같은 형태라고하면 좋은데, 그런게 아닌 약간 다른 식으로 되어있는 경우가 있습니다 이럴 때, 보통 제일 앞부분에 그런것들이 많기는 하지만, 전체적으로 특정 정규표현식에 맞는 것을 바꾸는 기능을 만들어 적용한 것입니다 먼저, 다음과 같은 자료를 기준으로 만듭니다
# -*- coding: utf-8 -*-
import ganada, youtil, basic_data

xword = ganada.ganada()
xutil = youtil.youtil()

#self.vars["l1d_word_001"] = ["1: 가나다", "2: 라마바", "3: 사아자", "4: 차카파", "5: 가나다라마바", "17.: 사아자차카파파하", "8888: ABC 가나다라마", "9: 카파파하 BCD"]


xvar = basic_data.sample_data()

#에제로 사용할 자료를 만듭니다
xword.write_l1d_from_selection_start_with_new_line(xvar.vars["l1d_word_001"])
word-image-2798-1-1.png word-image-2798-2-1.png 이제 앞에있는 자료들을 삭제하는 개념입니다. 그러면 이 형태를 xyre스타일로 바꿔보면 다음과같을 것입니다 “[시작][숫자&공백&특수문자:0~10]”
# -*- coding: utf-8 -*-
import ganada, youtil, basic_data, jfinder

xword = ganada.ganada()
xutil = youtil.youtil()
xvar = basic_data.sample_data()
xre = jfinder.jfinder()


para_2nos = xword.get_para_nos_for_selection()

for para_no in range(para_2nos[0], para_2nos[1]+1):
    para_text = xword.read_text_for_para_no(para_no)
    aaa = xre.search_all_by_jf_sql("[시작][숫자&공백&.\::0~10]", para_text)
먼저 위의 코드를 실행하면, 워드의 선택된 부분을 jf_sql에 맞는 것을 찾아내는 것인데, 그결과는 아래의 그림과 같습니다 word-image-2798-3-1.png 이제 전체적인 코드를 보면 다음과 같고 그 결과는 그림과 같다
# -*- coding: utf-8 -*-
import ganada, jfinder

xword = ganada.ganada()
xre = jfinder.jfinder()

# 워드의 선택한 영역의 맨 앞부분의 숫자와 공백만 지우기 (문자제외)
# 가끔 엑셀등의 자료를 갖고올때, 맨 앞부분에 숫자등이 들어가있는것을 삭제할 필요가 있어서, 만들어보는 것이다

def replace_each_para_by_jf_sql_for_selection(input_jf_sql="[시작][숫자&공백&.\::0~10]", replace_text=""):
    #선택한 영역의 문단 번호를 갖고오는 것이다
    para_2nos = xword.get_para_nos_for_selection()

    for para_no in range(para_2nos[0], para_2nos[1]+1):
       # 선택영역의 각 문단에서 "[시작][숫자&공백&.\::0~10]"에 해당하는것을 지우는 코드
       xword.replace_text_for_nth_para_by_jf_sql(para_no, input_jf_sql, replace_text)


replace_each_para_by_jf_sql_for_selection("[시작][숫자&공백&.\::0~10]", "")
word-image-2798-4-1.png 🡺 word-image-2798-5-1.png]]>
Thu, 27 Feb 2025 20:31:06 +0000