Post

(PyQt6)4. sqlite3와 PyQt6 UI 동적으로 만들기

목차

  • 파이썬 기본 메소드
    • getattr, setattr, hasattr
  • sqlite3 소개
    • 기본적인 사용방법
  • sqlite3로 GUI 만들기
    • MVVM 유사스타일로 작성하기
    • MVVM으로 짤 때 경로 조심할 것

파이썬 내장 함수

PyQt를 다루다 보면 class를 반드시 다루게 되는데, 그 중 알아두면 편한 내장함수 몇 가지를 소개해보려고 한다.

-attr() 메소드

attr()로 끝나는 함수는 총 4개가 있다. 여기서 delattr()는 굳이 쓸 이유는 없어서 나머지 3개 위주로 보자.

getattr()

이 함수는 클래스 내부에 존재하는 attribute를 불러올 때 쓰는 기능이다. 예를 들어, 내가 Person.age라는 속성을 불러오고 싶을 때, Person.taxi()라는 메소드를 불러오고 싶을 때 속성/메소드 이름만 알 때 쓴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person :
	def __init__(self, name="춘식", age="20", money=10000) :
		self.name = name
		self.age = age
		self.money = money
	def taxi(self) :
		if self.money < 5000 :
			print("not enough money")
			return
		else :
			print("5000 purchased")
			self.money -= 5000
			return

위와 같은 코드가 있다고 치자. 여기서 나는 "money"라는 텍스트로 Person.money를 접근하고 싶다면 아래와 같이 고쳐 사용할 수 있다.

이 함수의 많이 쓰이는 2가지 상황은 다음과 같다.

  1. setattr로 생성한 함수 attribute/method를 접근할 때
  2. 반복문으로 처리하고 싶을 때.

두 번째 사례에 대해서 예시를 들어보겠다.

1
2
3
4
5
6
7
8
9
10
11
class todolist :
	def __init__(self) :
		self.flag1 = False
		self.flag2 = False
		#... 중략
		self.flag100 = False

todo = todolist()
for i in range(1,101) :
	flag = getattr(todo, f"flag{i}")
	print(f"flag{i} = {flag}")

이런 식으로 listdict로 여러 attribute/method를 접근해서 처리할 수 있게 만들 수 있다.

hasattr()

getattr()로 없는 요소를 접근하면 AttributeError를 발생시킨다.

따라서 hasattr()로 해당 attribute/method가 존재하는지 확인을 하고 getattr()으로 접근하는게 안전하다.

setattr()

getattr(), hasattr()처럼 object와 속성명을 받는데 세 번째 인자로 입력할 값을 설정할 수 있다. 메소드 또한 생성할 수 있다.

todolist 클래스를 임의로 수정해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class todolist :
	def __init__(self) :
		self.flag1 = False
		self.flag2 = False

todo = todolist()
for i in range(3,11) :
	setattr(todo, f"flag{i}", True) # flag3 ~ flag10 속성 생성

for i in range(1,11) :
	attrname = f"flag{i}"
	f = getattr(todo, attrname)
	setattr(todo, attrname, not f)

def printall(obj) :
	for i in range(1, 11) : 
		attrname = f"flag{i}"
		print(getattr(obj,attrname))

printall(todo)

대신, 계획없이 어떤 속성을 추가하는데만 쓰면 어떤 속성, 메소드가 있는지 IDE가 감지를 못하니 되도록이면 남발하지 말자.

This post is licensed under CC BY 4.0 by the author.