본문 바로가기
PYTHON

20200420 - Python 파이썬 PyQt5 기본함수 사용

by 낫싱 2020. 4. 20.
728x90
반응형

 

20200420.zip
0.02MB

https://wikidocs.net/38024

이미지 썸네일 삭제

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

  • 오른쪽 정렬왼쪽 정렬가운데 정렬

  •  

  • 삭제

대표사진 삭제

사진 설명을 입력하세요.

# 1)창 띄우기

import sys

from PyQt5.QtWidgets import QApplication, QWidget

# 필요한 모듈들을 불러온다. 기본적인 UI구성요소를 제공하는 위젯(클래스)들은 PyQt5.QtWidgets 모듈에 포함되어 있습니다.

# QtWidgets 모듈에 포함된 모든 클래스들과 이에 대한 자세한 설명은 QtWidgets 공식문서에서 확인 가능

 

class MyApp(QWidget):#MyApp 클래스를 만드는데 QWidget 클래스를 상속받는다.

def __init__(self): #파이썬의 생성자명은 __init__고정이다. 첫번째 고정값은 self로 들어가야한다.(인스턴스명이 self로 들어가야 함)

super().__init__()

 

self.initUI()

 

def initUI(self): # 초기 UI함수 initUI로 이름을 정하고 객체를 인스턴스로 받아줄 self매개변수 지정

 

self.setWindowTitle('My First Application')

self.move(300,300)

self.resize(400,200)

self.show()

 

# 여기서 self는 MyApp 객체를 말한다.

# setWindowTitle() 메서드는 타이틀바에 나타나는 창의 제목을 설정

# move() 메서드는 위젯을 스크린의 x=300px, y=300px의 위치로 이동

# resize() 메서드는 위젯의 크기를 너비 400px, 높이 200px로 조절합니다.

 

if __name__ == '__main__':#py파일은 하나의 모듈형태로 만들어지기 때문에 누가 임포트하냐에 따라 __name__ 값이 달라진다.

#자기가 직접 실행해야 실행된다. __name__(main) == __main__

app = QApplication(sys.argv)

ex = MyApp() # 생성자의 self는 ex를 전달받게 된다.

sys.exit(app.exec_()) #app객체를 실행시키고, system 의 x버튼을 누르면 실행되고 있는 App을 종료시켜준다.

 

# =============================================================================

# 만약 파일명을 moduleA.py라고 만들면 이 파일을 직접 실행하면 __main__ 가 되고, 다른 파이썬 파일에서 가져오게 되면

# moduleA 라는 이름으로 전달된다.(__name__ == '__moduleA__')

# 모든 PyQt5 어플리케이션은 어플리케이션 객체를 생성해야 한다.(app = QApplication(sys.argv)) -> 객체(인스턴스)명이 app 이 된 것

# =============================================================================

대표사진 삭제

사진 설명을 입력하세요.

# 2)아이콘 넣기

import sys

from PyQt5.QtWidgets import QApplication, QWidget

from PyQt5.QtGui import QIcon

 

class MyApp(QWidget):

def __init__(self):

super().__init__()

 

self.initUI()

 

def initUI(self):

 

self.setWindowTitle('Icon')

self.setWindowIcon(QIcon('web.png'), encoding='UTF8')

#파이썬과 가장 잘 맞는 이미지 파일 형식 : png(jpg는 고화질을 표현한다. gif는 표현 가능한 색이 216가지 밖에 안된다.(safe 컬러))

self.setGeometry(300,300,300,200)

self.show()

 

if __name__ == '__main__':

 

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

 

 

# =============================================================================

# setWindowIcon() 메서드는 어플리케이션 아이콘을 설정하도록 합니다.

# 이를 위해서 QIcon 객체를 생성하였습니다. QIcon()에 보여질 이미지('web.png')를 입력합니다.

# 이미지 파일을 다른 폴더에 따로 저장해 둔 경우에는 경로까지 함께 입력해주면 됩니다.

# 만들어진 QIcon 객체를 윈도우에 설정하겠다 라고 해서 setWindowIcon 이라는 함수가 필요한 것 이다.

# =============================================================================

# setGeometry(상단에서 떨어진 값, 좌측에서 떨어진 값, 창 가로값, 창 세로값) 메서드는 창의 위치와 크기를 설정합니다.

# 앞의 두 매개변수는 창의 x, y위치를 결정하고, 뒤의 두 매개변수는 각각 창의 너비와 높이를 결정합니다.

# 이 메서드는 창 띄우기 예제에서 사용했던 move()와 resize() 메서드를 하나로 합쳐놓은 것과 같습니다.

# =============================================================================

대표사진 삭제

사진 설명을 입력하세요.

# 3) 절대적 배치

 

# =============================================================================

# 절대적 배치(Absolute positioning) 방식은 각 위젯의 위치와 크기를 픽셀 단위로 설정해서 배치합니다.

# 개발자가 마음대로 변화시킬 수 있는 Absolute

# 창의 크기를 조절해도 위젯의 크기와 위치는 변하지 않는다.

# 다양한 플랫폼에서 어플리케이션이 다르게 보일 수 있다.

# 어플리케이션의 폰트를 바꾸면 레이아웃이 망가질 수 있다.

# 레이아웃을 바꾸고 싶다면 완전히 새로 고쳐야 하며, 이는 매우 번거롭다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

label1 = QLabel('Label1', self)

label1.move(20, 20)

label2 = QLabel('Label2', self)

label2.move(20, 60)

 

btn1 = QPushButton('Button1', self)

btn1.move(80, 13)

btn2 = QPushButton('Button2', self)

btn2.move(80, 53)

 

self.setWindowTitle('Absolute Positioning')

self.setGeometry(300, 300, 400, 200)

self.show()

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

 

# =============================================================================

# 버튼에 move 함수라던지, 라벨의 move 함수는 창의 왼쪽 상단이 0,0 으로 기준이 된다.

# 창의 위치는 모니터를 기준으로 모니터 전체의 좌측 상단이 기준이 된다.

# 열린 창의 크기를 변화시켜도 라벨과 버튼의 위치는 변하지 않는다.

# 다양한 사이즈의 디바이스에서 사용할 경우엔 Absolute 는 좋지 않은 방식이다.(절대값으로 위치를 잡아주기 때문에 좋지 않다.)

# =============================================================================

대표사진 삭제

사진 설명을 입력하세요.

# 4) 박스 레이아웃

 

# =============================================================================

# 박스 레이아웃 클래스를 이용하면 훨씬 유연하고 실용적인 레이아웃을 할 수 있습니다.

# QHBoxLayout, QVBoxLayout 으로 가로, 세로를 구별해서 사용한다.(여러 위젯을 수평으로 정렬하는 레이아웃 클래스)

# QHBoxLayout, QVBoxLayout 생성자는 수평, 수직의 박스를 하나 만드는데, 다른 레이아웃 박스를 넣을 수도 있고, 위젯을 배치할 수도 있습니다.

# 예제 코드에서 위젯의 가운데 아래 부분에 두 개의 버튼을 배치하기 위해 수평, 수직의 박스를 하나씩 사용합니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

okButton = QPushButton('OK') # QPushButton 으로 OK 버튼과 Cancel 버튼을 만들어 놓는다.(아직 배치가 안된 상태)

cancleButton = QPushButton('Cancel')

 

hbox = QHBoxLayout() # 수평 박스 레이아웃(가로로 긴 네모박스가 하나 만들어진다.HLayout)

hbox.addStretch(1) # 위젯은 레이아웃에 나타나게 하려면 반드시 add가 되어있어야 한다.

hbox.addWidget(okButton) # 왼쪽에 OK,

hbox.addWidget(cancleButton) # OK버튼 옆에 Cancel 버튼을 배치한다.

hbox.addStretch(1) # Stretch 값이 없으면 전체 창의 반반씩 균등 분할된다.(양 옆의 빈 공간을 1 대 1로 만들어 놓으라는 의미(위에서 1 아래에서 1))

 

vbox = QVBoxLayout() # 수직 박스 레이아웃(세로로 긴 네모박스가 하나 만들어진다.)

vbox.addStretch(3) # 위에서 3 비율만큼 띄워놓는다.

vbox.addLayout(hbox) # 위에서 만들어놓은 hbox 를 배치한다.(OK, Cancel 버튼까지 배치해놓은 것)

vbox.addStretch(1) # 아래에서 1 비율만큼 띄워놓는다.

 

self.setLayout(vbox) # setLayout으로 vbox를 생성, 전체화면을 하더라도 상하좌우의 비율이 설정한대로 그대로 유지된다.(위젯의 크기는 별도로 지정해야 한다.)

 

self.setWindowTitle('Box Layout')

self.setGeometry(300, 300, 300, 200)

self.show()

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 5) 그리드 레이아웃

# =============================================================================

# 가장 일반적인 레이아웃 클래스는 '그리드 레이아웃(grid layout)'입니다. 이 레이아웃 클래스는 위젯의 공간을 행 (row)과 열 (column)로 구분합니다.

# 그리드 레이아웃을 생성하기 위해 QGridLayout 클래스를 사용합니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLabel, QLineEdit, QTextEdit)

# 제목 타이틀 만들어주는 QLabel

# 글자를 여러줄로 입력해주는 QTextEdit

# 한줄을 입력해주는 QLineEdit

# HTML 에서 여러줄 입력받을 때 쓰는 태그가 textarea

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

grid = QGridLayout() # 배치하기 위한 그리드 레이아웃 생성

self.setLayout(grid) # 어플리케이션에 레이아웃 셋팅시켜야 한다.(이 셋팅코드는 맨 아래쪽에 써도 된다. - 객체 생성만 되어있으면 된다.)

 

grid.addWidget(QLabel('Title:'), 0, 0) # 그리드 레이아웃에 위젯을 추가하겠다. (라벨객체를 추가하겠다, 0행, 0열에 추가)

grid.addWidget(QLabel('Author:'), 1, 0) # 작성자 라는 라벨 객체를 만들고, 1행, 0열에 추가

grid.addWidget(QLabel('Review:'), 2, 0) # 리뷰라는 라벨 객체를 만들고, 2행, 0열에 추가

 

grid.addWidget(QLineEdit(), 0, 1) # 한 줄 짜리 입력받는 칸 0행 1열

grid.addWidget(QLineEdit(), 1, 1) # 한 줄 짜리 입력받는 칸 1행 1열

grid.addWidget(QTextEdit(), 2, 1) # 여러 줄 입력받는 칸 2행 1열

 

self.setWindowTitle('QGridLayout') # 윈도우 제목 설정

self.setGeometry(300, 300, 300, 200) # 생성할 창의 위치 왼쪽에서 떨어진 값, 위쪽에서 떨어진 값, 창의 크기 가로, 창의 크기 세로

self.show() # 창 보여주기

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

대표사진 삭제

사진 설명을 입력하세요.

# 6) 체크박스

# =============================================================================

# QCheckBox 위젯은 on(체크됨)/off(체크안됨)의 두 상태를 갖는 버튼을 제공합니다. 이 위젯은 하나의 텍스트 라벨과 함께 체크 박스를 제공합니다.

# 체크 박스가 선택되거나 해제될 때, stateChanged() 시그널을 발생합니다. 체크 박스의 상태가 변할 때마다 어떠한 동작을 발생시키고 싶을 때,

# 이 시그널을 특정 슬롯에 연결할 수 있습니다.

# 또한 체크 박스의 선택 여부를 확인하기 위해서, isChecked() 메서드를 사용할 수 있습니다. 선택 여부에 따라 boolean 값을 반환합니다.

# 일반적인 체크 박스는 선택/해제 상태만을 갖지만, setTristate() 메서드를 사용하면 '변경 없음(no change)' 상태를 가질 수 있습니다.

# 이 체크 박스는 사용자에게 선택하거나 선택하지 않을 옵션을 줄 때 유용합니다.

# 세 가지 상태를 갖는 체크 박스의 상태를 얻기 위해서는 checkState() 메서드를 사용합니다. 선택/변경 없음/해제 여부에 따라 각각 2/1/0 값을 반환합니다.

# QButtonGroup 클래스를 사용하면 여러 개의 버튼을 묶어서 exclusive/non-exclusive 버튼 그룹을 만들 수 있습니다.

# exclusive 버튼 그룹은 여러 개 중 하나의 버튼만 선택할 수 있습니다.

 

# -------------------QCheckBox 위젯과 함께 자주 쓰이는 메서드-------------------

#text() : 체크 박스의 라벨 텍스트를 반환합니다.

#setText() : 체크 박스의 라벨 텍스트를 설정합니다.

#isChecked() : 체크 박스의 상태를 반환합니다. (True/False)

#checkState() : 체크 박스의 상태를 반환합니다. (2/1/0)

#toggle() : 체크 박스의 상태를 변경합니다.(on/off 기능)

 

# -------------------자주 쓰이는 시그널-------------------

#pressed() : 체크 박스를 누를 때 신호를 발생합니다.

#released() : 체크 박스에서 뗄 때 신호를 발생합니다.

#clicked() : 체크 박스를 클릭할 때 신호를 발생합니다.

#stateChanged() ★: 체크 박스의 상태가 바뀔 때 신호를 발생합니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox

from PyQt5.QtCore import Qt

# 체크가 반환하는 상수값이 반환하는 모듈 Qt

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI() # 기본 UI함수를 만들고

 

def initUI(self):

cb = QCheckBox('Show title', self) # 체크박스 객체 생성 (첫 번째 값은 라벨값, 두 번째 값 어디에)

cb.move(20, 20) #위치 지정

cb.toggle() # 온오프 기능을 부여한다

cb.stateChanged.connect(self.changeTitle) # 체크박스객체에서.상태변화 변화 시그널 발생(이벤트 발생).이벤트가 발생되면 connect로 해당 함수에 연결(self.changeTitle)

#반드시 상태변화가 일어나야 한다.

 

self.setWindowTitle('QCheckBox')

self.setGeometry(300, 300, 300, 200)

self.show()

 

def changeTitle(self, state): # 파이썬의 모든 함수는 첫 번째 매개변수가 무조건 self, 커넥트 함수를 통해서 연결시키면 현재 상수값이 자동으로 전달받음(이걸 받는 매개변수:state)

if state == Qt.Checked:

self.setWindowTitle('QCheckBox')

else:

self.setWindowTitle(' ')

# 전달받는 상수값에 따라서 Title을 '보여주겠다/보여주지않겠다'를 선택한다.

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 7) 라디오 버튼

# =============================================================================

# 라디오 버튼은 단일 선택

# 한 위젯 안에 여러 라디오 버튼은 기본적으로 autoExclusive로 설정되어 있습니다. 하나의 버튼을 선택하면 나머지 버튼들은 선택 해제가 됩니다.

# 파이썬은 기본값이 단일선택이기 때문에 name 속성을 똑같이 쓰지 않아도 된다.

 

# ----------------------자주 쓰이는 메서드----------------------

#text() : 버튼의 텍스트를 반환합니다.

#setText() : 라벨에 들어갈 텍스트를 설정합니다.

#setChecked() : 버튼의 선택 여부를 설정합니다.

#isChecked() : 버튼의 선택 여부를 반환합니다.

#toggle() : 버튼의 상태를 변경합니다.

 

# ----------------------자주 쓰이는 시그널----------------------

#pressed() : 버튼을 누를 때 신호를 발생합니다.

#released() : 버튼에서 뗄 때 신호를 발생합니다.

#clicked() : 버튼을 클릭할 때 신호를 발생합니다.

#toggled() : 버튼의 상태가 바뀔 때 신호를 발생합니다.

 

# =============================================================================

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

rbtn1 = QRadioButton('First Button', self)

rbtn1.move(50, 50)

rbtn1.setChecked(True) # 기본선택값을 rbtn1번으로 지정(True)

# 파이썬의 불린값은 첫 글자만 대문자, 자바나 자바스크립티는 올 소문자, R 은 올 대문자

 

rbtn2 = QRadioButton(self)

rbtn2.move(50, 70)

rbtn2.setText('Second Button')

 

self.setGeometry(300, 300, 300, 200)

self.setWindowTitle('QRadioButton')

self.show()

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 8) 콤보박스

# =============================================================================

# QComboBox는 작은 공간을 차지하면서, 여러 옵션들을 제공하고 그 중 하나의 옵션을 선택할 수 있도록 해주는 위젯

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QComboBox

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.lbl = QLabel('Option1', self)

self.lbl.move(50, 150) # 왼쪽에서 50, 위쪽에서 150 이동

 

cb = QComboBox(self) # 콤보박스 객체 생성

cb.addItem('Option1') # 어느 콤보박스에 아이템 추가

cb.addItem('Option2')

cb.addItem('Option3')

cb.addItem('Option4')

cb.move(50, 50) # 왼쪽에서 50, 위쪽에서 50 이동

 

cb.activated[str].connect(self.onActivated) # cb내부에 현재 활성화 된 아이템의 글[str]을 뽑아달라.connect(self.onActivated 라는 함수에 연결)

 

self.setWindowTitle('QcomboBox')

self.setGeometry(300, 300, 300, 200)

self.show()

 

def onActivated(self, text): # 위에서 연결한 것은 두 번째 매개변수 text로 넘어간다

self.lbl.setText(text) # 선택된 글자를 라벨의 글자로 설정

self.lbl.adjustSize() # 전달된 글자에 맞춰서 라벨 사이즈를 자동으로 변경

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 9) 입력받은 text를 label로 출력

# =============================================================================

# QLineEdit은 한 줄의 문자열을 입력하고 수정할 수 있도록 하는 위젯입니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.lbl = QLabel(self)

self.lbl.move(60, 40)

 

qle = QLineEdit(self)

qle.move(60, 100)

qle.textChanged[str].connect(self.onChanged) # QLineEdit에 글자의 변화가 일어난 후, 글자[str]를 뽑아서 self.onChanged에 전달

 

self.setWindowTitle('QLineEdit')

self.setGeometry(300, 300, 300, 200)

self.show()

 

def onChanged(self, text):

self.lbl.setText(text) # 전달된 글자를 라벨에 새겨주고

self.lbl.adjustSize() # 전달된 글자를 라벨 크기에 맞게 바꿔준다.

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

대표사진 삭제

사진 설명을 입력하세요.

# 10) 프로그레스 바

 

# =============================================================================

# QProgressBar 위젯은 수평, 수직의 진행 표시줄을 제공합니다.

# setMinimum()과 setMaximum() 메서드로 진행 표시줄의 최소값과 최대값을 설정할 수 있으며,

# 또는 setRange() 메서드로 한 번에 범위를 설정할 수도 있습니다. 기본값은 0과 99입니다.

# setValue() 메서드로 진행 표시줄의 진행 상태를 특정 값으로 설정할 수 있고, reset() 메서드는 초기 상태로 되돌립니다.

# 진행 표시줄의 최소값과 최대값을 모두 0으로 설정하면, 진행 표시줄은 항상 진행 중인 상태로 표시됩니다.

# 이 기능은 다운로드하고 있는 파일의 용량을 알 수 없을 때 유용하게 사용할 수 있습니다.

# =============================================================================

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QProgressBar

from PyQt5.QtCore import QBasicTimer

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.pbar = QProgressBar(self) # 프로그레스 객체 생성

self.pbar.setGeometry(30, 40, 200, 25) # 프로그레스(%) 진행 될 네모칸 만들기

 

self.btn = QPushButton('Start', self) # 스타트버튼 만들기

self.btn.move(40, 80) # 버튼 크기 결정

self.btn.clicked.connect(self.doAction) # 클릭하면 액션 함수 실행하도록 만들기

 

self.timer = QBasicTimer() # 타이머 객체 생성

self.step = 0 # 스텝 변수에 기본값 0 할당(함수에 1씩 증가하도록 할 예정)

 

self.setWindowTitle('QProgressBar')

self.setGeometry(300, 300, 300, 200)

self.show()

 

def timerEvent(self, e): # 위젯에 상속되어있는 함수를 수정한다.(timerEvent는 QObject에 상속되어있는 함수이다.)

if self.step >= 100: # 만약 값이 100보다 같거나 커지면

self.timer.stop() # 타이머를 정지시키고

self.btn.setText('Finished') # 버튼에 써있는 값을 Finished로 변경

return # 100보다 같거나 크지 않을경우에는 return 이 실행되지 않음

 

self.step = self.step + 1 # if가 실행되지 않을 경우, 기존에 0으로 설정한 값을 1씩 더하면서 증가시킨다.

self.pbar.setValue(self.step) # 프로그레스 바를 step 값과 동일하게 변경해준다.(녹색 바의 위치를 지정해주는게 setValue 함수)

 

def doAction(self): # Push버튼 눌렀을 때 호출하는 함수

if self.timer.isActive(): # (timer.isActive() == True)일 때 실행(불린값으로 반환) - 만약 활성화 되어 있다면

self.timer.stop() # 타이머를 스탑시키고

self.btn.setText('Start') # 스타트 버튼을 누를 수 있다.

else:

self.timer.start(100, self) # 스타트 시키고

self.btn.setText('Stop') # 스탑 버튼을 누를 수 있다.

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

대표사진 삭제

사진 설명을 입력하세요.

# 11) QSlider & QDial(슬라이더, 다이얼)

 

# =============================================================================

# 슬라이더의 틱(tick)의 간격을 조절하기 위해서는 setTickInterval() 메서드, 틱(tick)의 위치를 조절하기 위해서는 setTickPosition() 메서드를 사용합니다.

# setTickInterval() 메서드의 입력값은 픽셀이 아니라 값을 의미합니다.

 

# ---------------------------setTickPosition() 메서드의 입력값과 기능---------------------------

#QSlider.NoTicks : (값 : 0, 틱을 표시하지 않습니다.)

#QSlider.TicksAbove : (값 :, 틱을 (수평) 슬라이더 위쪽에 표시합니다.)

#QSlider.TicksBelow : (값 :, 틱을 (수평) 슬라이더 아래쪽에 표시합니다.)

#QSlider.TicksBothSides : (값 : , 틱을 (수평) 슬라이더 양쪽에 표시합니다.)

#QSlider.TicksLeft : (값 : TicksAbove, 틱을 (수직) 슬라이더 왼쪽에 표시합니다.)

#QSlider.TicksRight : (값 : TicksBelow, 틱을 (수직) 슬라이더 오른쪽에 표시합니다.)

# ---------------------------------------------------------------------------------------------

 

# QDial은 슬라이더를 둥근 형태로 표현한 다이얼 위젯이며, 기본적으로 같은 시그널과 슬롯, 메서드들을 공유

# 다이얼 위젯에 노치(notch)를 표시하기 위해서는 setNotchesVisible() 메서드를 사용합니다.

# True로 설정하면 둥근 다이얼을 따라서 노치들이 표시됩니다. 기본적으로 노치는 표시되지 않도록 설정되어 있습니다.

 

# ---------------------------QSlider과 QDial 위젯에서 가장 자주 쓰이는 시그널---------------------------

#valueChanged() : 슬라이더의 값이 변할 때 발생합니다.

#sliderPressed() : 사용자가 슬라이더를 움직이기 시작할 때 발생합니다.

#sliderMoved() : 사용자가 슬라이더를 움직이면 발생합니다.

#sliderReleased() : 사용자가 슬라이더를 놓을 때 발생합니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QDial, QPushButton

from PyQt5.QtCore import Qt

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.slider = QSlider(Qt.Horizontal, self) # 슬라이더 객체 생성(가로로 만들기), 수평으로 만들건지 수직으로 만들건지 내장 [상수]로 보내준다.

# 상수는 대부분 Qt가 가지고 있기 때문에 값을 Qt에서 꺼내온다.(Qt.Horizontal / Qt.Vertical)

self.slider.move(30, 30) # 위치 설정

self.slider.setRange(0, 50) # 슬라이더의 min, max값 설정

self.slider.setSingleStep(2) # 한 번 이동시 이동할 틱 값 설정

 

self.dial = QDial(self) # 다이얼 객체 생성

self.dial.move(30, 50) # 다이얼 위치 설정

self.dial.setRange(0, 50) # 다이얼의 min, Max값 설정

 

btn = QPushButton('Default', self) # Default 라고 쓰여진 버튼 생성

btn.move(35, 160) # 버튼 위치 선정

 

#slider 따로 dial 따로 하면 아래 3줄은 필요 없음

self.slider.valueChanged.connect(self.dial.setValue) # 슬라이더의 값에 변화가 일어나면 그 값을 dial.setValue로 보낸다.

self.dial.valueChanged.connect(self.slider.setValue) # 다이얼의 값이 변했을 때 그 값을 slider.setValue로 보낸다.

btn.clicked.connect(self.button_clicked) # 버튼이 클릭되었을 때 그 값을 button_clicked로 보내준다.(사용자가 만드는 함수)

 

self.setWindowTitle('QSlider and QDial')

self.setGeometry(300, 300, 400, 200)

self.show()

 

def button_clicked(self):

self.slider.setValue(0) # 슬라이더의 값을 0으로 설정

self.dial.setValue(0) # 다이얼의 값을 0으로 설정

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 12) QSplitter

# https://wikidocs.net/32154

# =============================================================================

# 스플리터 (splitter)는 경계를 드래그해서 자식 위젯의 크기를 조절할 수 있도록 합니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QFrame, QSplitter # QFrame 은 구분선 만들어주는 클래스, QSplitter는 드래그해서 사이즈 변경

from PyQt5.QtCore import Qt

 

 

class MyApp(QWidget):

 

def __init__(self): #생성자

super().__init__()

self.initUI()

 

def initUI(self):

hbox = QHBoxLayout() # 가로 박스 객체 생성

 

top = QFrame() # 상단에 배치할 프레임

top.setFrameShape(QFrame.Box)

 

midleft = QFrame() # 가운데 왼쪽에 배치할 프레임

midleft.setFrameShape(QFrame.StyledPanel) # 각각의 프레임 형태는 2번 라인 사이트 참조

 

midright = QFrame() # 가운데 오른쪽에 배치할 프레임

midright.setFrameShape(QFrame.Panel)

 

bottom = QFrame() # 아래쪽에 배치할 프레임

bottom.setFrameShape(QFrame.WinPanel)

bottom.setFrameShadow(QFrame.Sunken)# 그림자 처리해줄때 shadow 사용(음각 박스)

 

splitter1 = QSplitter(Qt.Horizontal) # 쪼개지는 방향성을 의미한다. (가로로 쪼갠다.) -> 방향으로 가운데를 쪼갠다(좌, 우로 나뉨)

splitter1.addWidget(midleft)

splitter1.addWidget(midright)

 

splitter2 = QSplitter(Qt.Vertical) # 쪼개지는 방향성을 의미한다. (세로로 쪼갠다.) -> ↓ 방향으로 쪼갠다.(상중하 3단계로 쪼갬)

splitter2.addWidget(top)

splitter2.addWidget(splitter1)

splitter2.addWidget(bottom)

 

hbox.addWidget(splitter2) # 전체 내용을 hbox에 전달한다

self.setLayout(hbox) # hbox를 윈도우에 셋팅한다

 

self.setGeometry(300, 300, 300, 200)

self.setWindowTitle('QSplitter')

self.show()

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

 

대표사진 삭제

사진 설명을 입력하세요.

# QTabWidget

 

# =============================================================================

# 이러한 탭은 프로그램 안의 구성요소들이 많은 면적을 차지하지 않으면서,

# 그것들을 카테고리에 따라 분류할 수 있기 때문에 유용하게 사용될 수 있습니다.

# =============================================================================

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QTabWidget, QVBoxLayout

 

 

class MyApp(QWidget): # QWidget은 아무런 기능이 없음, 이 내부에 내가 원하는 위젯을 꾸밀 수 있다.

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

tab1 = QWidget() #각 탭에 들어갈 위젯 두 가지 설정

tab2 = QWidget()

 

tabs = QTabWidget() # 탭 위젯 객체 생성

tabs.addTab(tab1, 'Tab1') # 탭 위젯에 addTab으로 추가될 위젯(tab1)을 추가하고, 쓰여질 글씨는 Tab1을 설정

tabs.addTab(tab2, 'Tab2')

 

vbox = QVBoxLayout() #Grid나 뭐 이거저거 사용해서 다중 위젯을 집어넣을 수 있다.

vbox.addWidget(tabs) # Tab1, 2가 추가된 객체를 vbox 객체에 추가한다.

 

self.setLayout(vbox) #윈도우에 셋팅

 

self.setWindowTitle('QTabWidget')

self.setGeometry(300, 300, 300, 200)

self.show()

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 14) QPixmap

 

# =============================================================================

# QPixmap은 이미지를 다룰 때 사용되는 위젯(only read 를 제외하고 모두 read/write 가능)

#bmp

#gif(only read)

#jpg

#jpeg

#png

#pbm(only read)

#pgm(only read)

#ppm

#xbm

#xpm

# =============================================================================

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout

from PyQt5.QtGui import QPixmap

from PyQt5.QtCore import Qt

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

pixmap = QPixmap('web.png') # 읽어들은 이미지파일이 객체로 만들어진다

 

lbl_img = QLabel() # 라벨 객체 생성해서

lbl_img.setPixmap(pixmap) # 그 내부에 이미지 객체를 출력해달라고 요청한다.

lbl_size = QLabel('Width: '+str(pixmap.width())+', Height: '+str(pixmap.height())) # 이미지를 출력할 때 가로/세로값을 얻을 수 있다.

lbl_size.setAlignment(Qt.AlignCenter) # setAlignment함수를 이용해서 가운데로 정렬(Qt.AlignCenter)

 

vbox = QVBoxLayout() # 세로박스 생성

vbox.addWidget(lbl_img) # 위젯 달아주기

vbox.addWidget(lbl_size)

self.setLayout(vbox)

 

self.setWindowTitle('QPixmap')

self.move(300, 300)

self.show()

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

 

대표사진 삭제

사진 설명을 입력하세요.

# 15) QCalendarWidget

 

# =============================================================================

# QCalendarWidget을 이용해서 사용자가 날짜를 선택할 수 있도록 달력을 표시할 수 있습니다.

# 달력은 월 단위로 표시되고, 처음 실행될 때 현재의 연도, 월, 날짜로 선택되어 있습니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QCalendarWidget

from PyQt5.QtCore import QDate

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

cal = QCalendarWidget(self) # 기본값은 현재 날짜, 캘린더 객체 생성

cal.setGridVisible(True) # 날짜와 날짜 사이에 가로선 세로선을 만들어 준다(True), False면 나타나지 않음

cal.clicked[QDate].connect(self.showDate) # 해당 날짜를 클릭했을 때 QDate 객체를 전달해준다.(showDate 함수로 전달)

 

self.lbl = QLabel(self) # 라벨 객체 생성

date = cal.selectedDate() # 선택된 날짜를 얻어내서 date 변수에 저장

self.lbl.setText(date.toString()) # 선택된 date를 str값으로 바꿔서 라벨에 저장

 

vbox = QVBoxLayout() # 수직 박스 생성

vbox.addWidget(cal) # 캘린더 위젯 add(위에는 캘린더)

vbox.addWidget(self.lbl) # 선택된 날짜가 부여된 라벨 add(아래는 라벨)

 

self.setLayout(vbox) # 박스 셋팅

 

self.setWindowTitle('QCalendarWidget')

self.setGeometry(300, 300, 400, 300)

self.show()

 

def showDate(self, date): #클릭 시그널이 호출했을 때 실행될 함수

self.lbl.setText(date.toString()) # QDate를 date가 받는다. 받은 데이트 값을 str으로 변환하여 lbl에 부여

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

대표사진 삭제

사진 설명을 입력하세요.

# 16)QTextBrowser

 

# =============================================================================

# QTextBrowser 클래스는 하이퍼텍스트 내비게이션을 포함하는 리치 텍스트 (서식있는 텍스트) 브라우저를 제공합니다.

# 이 클래스는 읽기 전용이며, QTextEdit의 확장형으로서 하이퍼텍스트 문서의 링크들을 사용할 수 있습니다.

# 편집 가능한 리치 텍스트 편집기를 사용하기 위해서는 QTextEdit을 사용해야 합니다.

# 또한 하이퍼텍스트 네비게이션이 없는 텍스트 브라우저를 사용하기 위해서는

# QTextEdit을 setReadOnly()를 사용해서 편집이 불가능하도록 해줍니다.

# =============================================================================

 

import sys

from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit, QTextBrowser, QPushButton, QVBoxLayout)

#클래스명들이 길어서 줄을 바꿔야 할 경우에는 괄호로 묶어서 줄바꿈해주면 된다.

# 태그를 해석시켜서 출력시켜줄 다중 창(QTextBrowser)

# 텍스트 브라우저가 가진 내용을 전부 지워줄 버튼을 만들 QPushButton

# 위에서부터 아래쪽으로 순서대로 배치해 줄 QVBoxLayout

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.le = QLineEdit() # QLineEdit() : HTML 태그형태로 입력할 수 있는 한 줄 짜리 입력창

self.le.returnPressed.connect(self.append_text) # 키보드에 엔터가 눌렸는지 안눌렸는지 알아내는 returnPressed.엔터를 누르면 값을 append_text로 전달

 

self.tb = QTextBrowser() # 태그를 해석해서 출력시켜줄 텍스트브라우저 객체 생성

self.tb.setAcceptRichText(True) # 텍스트 브라우저에 출력된 글씨들을 복사한다던지, 이와 같이 해당 글자를 접근 가능하게 할거면 True, 막을거면 False

self.tb.setOpenExternalLinks(True) # 외부 브라우저로 접속해야 하기 때문에 외부링크 허용 True, 허용하지 않으면 False

 

self.clear_btn = QPushButton('Clear') # 버튼 생성(버튼에 쓰일 값은 Clear)

self.clear_btn.pressed.connect(self.clear_text) # 버튼이 눌려지면 clear_text 함수 호출

 

vbox = QVBoxLayout() # 박스 객체 생성

vbox.addWidget(self.le, 0) # 0행에 위젯 달기

vbox.addWidget(self.tb, 1) # 1행에 위젯 달기

vbox.addWidget(self.clear_btn, 2) # 2행에 버튼 달기

 

self.setLayout(vbox)

 

self.setWindowTitle('QTextBrowser')

self.setGeometry(300, 300, 300, 300)

self.show()

 

def append_text(self): #텍스트 브라우저에 추가시킬 함수

text = self.le.text() # 입력받은 self의 text값을 얻어내서 text 변수에 저장

self.tb.append(text) # 텍스트박스에 append 시킨다.(text값을 append)

self.le.clear() # 라인 데이터에 쓰여진 있는 값은 클리어시킨다.

 

def clear_text(self): # 버튼눌렀을 때 모두 clear해줄 함수

self.tb.clear() # tb, le 모두, te 에도 clear 함수가 있다.

 

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

대표사진 삭제

사진 설명을 입력하세요.

# 17) QTextEdit

 

# =============================================================================

# QTextEdit 클래스는 플레인 텍스트 (plain text)와 리치 텍스트 (rich text)를 모두 편집하고 표시할 수 있는 편집기를 제공

# =============================================================================

 

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QTextEdit, QVBoxLayout

 

 

class MyApp(QWidget):

 

def __init__(self):

super().__init__()

self.initUI()

 

def initUI(self):

self.lbl1 = QLabel('Enter your sentence:') # 라벨에 텍스트 입력 요청값 넣기

self.te = QTextEdit() # te에 QTextEdit 객체 생성

self.te.setAcceptRichText(False) # te객체에 입력되는 해당텍스트를 접근 가능하도록 하지 않는다(False)

self.lbl2 = QLabel('The number of words is 0') # 단어가 입력되지 않았을 경우 초기 라벨값 설정

 

self.te.textChanged.connect(self.text_changed) # 텍스트에 변화가 일어나면 텍스트 체인이 함수 호출

 

vbox = QVBoxLayout() # 박스 객체 생성

vbox.addWidget(self.lbl1) # 1번 라벨값

vbox.addWidget(self.te) # te객체(텍스트 입력받을 박스)

vbox.addWidget(self.lbl2) # 2번 라벨값

vbox.addStretch() # 스트레치 비율 설정

 

self.setLayout(vbox)

 

self.setWindowTitle('QTextEdit')

self.setGeometry(300, 300, 300, 200)

self.show()

 

def text_changed(self):

text = self.te.toPlainText() # TextEdit에 쓰여있는 글자를 가져온다.

self.lbl2.setText('The number of words is ' + str(len(text.split()))) # 입력된 글자를 쪼개고 그 문자(단어)의 갯수를 str로 반환

#TextEdit에 RichText 형식의 글을 입력합니다. Parameter에는 TextEdit에 표시할 글자가 들어갑니다.

 

if __name__ == '__main__':

app = QApplication(sys.argv)

ex = MyApp()

sys.exit(app.exec_())

 

728x90
반응형

댓글