configparser로 *.ini 파일이나 *.cfg 파일과 같은 어떤 프로그램의 속성을 저장해놓는 파일을 관리할 수 있다.

 

그런데.... 아니 별것도 아닌게 지금 개발 중인 모니터링 프로그램에서 사용하려고 했더니만 안되는 것이 아닌가..

 

 

그래서 지금 퇴근길... 그것도 지하철 안에서 운좋게 앉아서 test파일을 만들고 사용해봤다..

 

응? 잘 되네??

 

뭐지 ㅋㅋㅋㅋ

 

근데 이놈 좀 웃긴게 있다...

외부 파일을 가져오기 위해 생성한 객체를 이용해 read를 하는데 path를 확인을 안한다......

 

즉, 저 'config.ini'가 잘못된 path라도 저기서 안걸리고 일단 통과된다 ㅋㅋㅋ

맵소사

파일도 없는데 그 다음 코드로 넘어가 key가 없다는 에러를 내뿜는다 ㅋ

 

포스팅을 한 김에 configparser 사용법을 몇가지 적어나 보자

 

● 설치

$ pip install configparser

● 선언

import configparser

config = configparser.ConfigParser()

 

● 파일 읽어오기

config.read([파일명])
config.read('config.ini', encoding='utf-8')	#한글이 들어갈 경우 인코딩 값 역시 설정을 해줘야 오류가 안난다~

※ 파일명이 잘못되도 에러를 반환하지 않는다..ㅋ

 

● 파일 저장

with open('example.ini', 'w') as configfile:
    config.write(configfile)

with ~ as ~는 파일을 열어 처리를 하거나 lock()을 쓸 때 매우 유용하다. 알아서 파일을 닫아주고, release해준다고 한다 ㅎㅎ

 

● 기타

#읽기
>>> config['SECTION']['KEY']

#쓰기
>>> config['SECTION']['KEY'] = value

#section 확인
>>> config.sections()
<Section: SECTION>

오류 확인

왼쪽에 있는 이미지가 현재 프로젝트의 tree구조이고, community.py에서 configparser를 사용하려고 한다.

 

그래서 read의 path를 config.ini로 했는데 sections()함수를 이용하여 key값을 확인해봤더니 텅텅 비어있는 것이 아니겠는가...?

 

왜그런가 봤더니... 가장 최초로 프로그램이 시작되는 main.py쪽에 config.ini 파일이 있는것...ㅋㅋ

 

그랬던 것이다. path의 기준은 처음 python 프로그램을 시작한 부분이 현재 작업 위치인 것이다.

 

즉, 이를 위해서는 절대 경로를 지정해주거나 작업 영역 기준으로 상대 경로를 지정하거나~ 작업 영역을 바꿔주면 된다.

 

 작업 경로를 바꾸면 문제가 발생할 수 있으니 현재 작업 영역을 기준으로 config.ini 작업 영역을 설정해주자~

 

p.s. 하루 자고 일어나면 보이는게 퇴근 시간에는 절대 안보이더라 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

pyqt를 이용하여 모니터 프로그램을 만들고 있다.

 

그런데 문제가 발생했다.

 

thread의 timer를 이용하여 일정 주기마다 통신을 수행하도록 코드를 구현했는데,

qt가 예기치 않게 종료되는 과정에서 상대적으로 느린 통신이 중간에 끊어지면서 Runtime Error를 토해내는 것이 아닌가..

 

(와 캡쳐하려고 하니깐 또 안나네 ㅋㅋ)

 

갑자기 안난다..

이 문제가 Lock()을 통해 해결했는지 확인할 수 있는 길이 없다.

 

일단 Lock() 해놓고 에러가 발생하는지 안하는지 계속 확인해봐야겠다.

서론

만들어보자

 

만들자~

일단 대충 이런 폼을 하나 만들었다.

그리고 "여기"에 저것들을 왕왕 넣을 것이다.

이런 식으로 말이다.

 

이렇게 하기 위해서는 main.py에서 여러가지 작업을 해줘야한다.

 

1. class 생성

2. layout생성

3. 반복 생성 함수 만들기

 

 

1번 먼저 해보자

from ui_rightCar import Ui_rightCar

class rightCar(QFrame, Ui_rightCar):
    def __init__(self, parent=None):
        super(rightCar, self).__init__(parent)
        self.setupUi(self)

이 세상 간단함이 아니다.

 

*.ui 파일로 만든 ui_*.py 파일을 불러와 setup해주는 함수를 만든다.

 

2. layout 생성

      self.ui.layoutMonitor = QGridLayout(self.ui.BoxMonitor)
      self.ui.layoutMonitor.setSpacing(0)	#각 객체 사이의 여백을 설정(Horizental, Vertical 따로 설정할 수 있는 함수도 있다)
      self.ui.layoutMonitor.setAlignment(Qt.AlignBottom)
      self.ui.layoutMonitor.setContentsMargins(0,0,0,0)	#객체 하나하나의 여백을 설정

main.py에 layoutMonitor를 QGridLayout 객체를 만들고 그 parent를 BoxMonitor라는 GroupBox의 Layout으로 설정해준다.

더보기
이놈이다.

그리고 

 

    def carMonitoring(self):
        self.CAR_NUM = 30
        self.carLList = []
        self.carRList = []
        self.carCList = []

        for floor in range(0, int(self.CAR_NUM/2)):
            self.carLList.append(leftCar())
            self.carRList.append(rightCar())
            self.carCList.append(centerCar())

            self.ui.layoutMonitor.addWidget(self.carLList[floor], floor, 0, 1, 1)
            self.ui.layoutMonitor.addWidget(self.carCList[floor], floor, 1, 1, 1)
            self.ui.layoutMonitor.addWidget(self.carRList[floor], floor, 2, 1, 1)

이런식으로 함수를 만들어주면 된다.

 

관리를 편하게 하기 위해 만든 객체들은 list에 각각 넣어주고,

for문을 반복하면서 원하는 위치에 layout의 addWidget함수를 이용하여 추가해준다.

 

그럼 끗~!

 

역시 개발은 다하고 나면 별거 아닌데 처음 할 때는 힘든 듯 하다.

 

분명 객체를 이용하는 거라 방법이 있을 거라고 생각하고 이것저것 해봤는데 layout을 생성해서 layout에 추가하는 것을 생각을 못해 시간을 쬐까 잡아먹었다. 아직 갈 길이 멀다 ㅎ

 

 

+ Recent posts