반응형

파이썬 GUI PyQt5(1) - QtDesigner를 이용한 창 띄우기

 

1. PyQt5를 사용하기 위한 준비하기

- Python 개발 IDE인 PyCharm 설치하기 (다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE)

- Qt Designer 설치하기 (Qt Designer Download for Windows and Mac (fman.io))
  (Qt Designer는 ui를 설치하

- pip install pyqt5 또는 PyCharm에서 pyqt5 설치하기 (File > Settings > Project > Python Interpreter > + )

2. QtDesigner 없이 창 띄워보기

QWidget 클래스를 상속한 클래스를 만들어, 창에 대한 설정을 하고,  show 함수로 창을 띄웁니다. 

import sys
from PyQt5.QtWidgets import QApplication, QWidget

class MyApp(QWidget):
    def __init__(self):  #클래스 인스턴스 생성시 자동적으로 호출됩니다.
        super().__init__()
        self.initUI()
    def initUI(self): # 창을 설정하는 함수를 만듭니다. 
        self.setWindowTitle('My First Application') # 창의 이름을 지정합니다.
        self.move(300, 300) # 창이 만들어질 위치를 지정합니다. 
        self.resize(400, 200) # 창의 크기를 설정합니다. 
        self.show() # 창을 보여주도록 합니다. 

if __name__ == '__main__':
   app = QApplication(sys.argv)
   ex = MyApp()
   sys.exit(app.exec_())

3. Qt Designer로 ui 파일을 만들고, ui 파일 로드하여 창 띄우기 

설치된 Qt Designer를 실행하여, 버튼 없는 대화창을 만들어 보겠습니다. 

[File] > [New]를 통해 ui 파일을 만들어 줍니다. 

오른쪽 속성창에서 windowTitle 속성을 찾아, 창의 이름을 만들어 봅니다. 

저장을 하고, 파일을 python project가 위치해있는 폴더에 이동시켜 줍니다. 

import sys
from PyQt5 import QtWidgets
from PyQt5 import uic

class MyApp(QtWidgets.QDialog):
    def __init__(self, parent = None):
        super().__init__(parent)
        self.ui = uic.loadUi("./file/myapp.ui") # Qt Designer로 만든 파일을 로드합니다.
        self.ui.show() # 만든 ui를 보여주도록 합니다.

app = QtWidgets.QApplication(sys.argv)
me = MyApp()
sys.exit(app.exec())

 

다음에는 버튼을 만들어 버튼 click에 대하여 signal / slot으로 동작하도록 해봅니다.

반응형
반응형

파이썬 GUI tkinter / dataframe의 내용을 Listbox, Label로 표시

 

 

1) numpy 배열로 data frame 생성

Listbox에 넣을 이름과 Label에 정보를 표시할 성별과 태어난 해 정보를 가지고 배열을 만듭니다. 

배열을 DataFrame으로 생성합니다. 

# numpy 배열로 data frame 생성
my_darray = np.array([
    ["Bob", "M", 1991],
    ["Kate", "W", 1992],
    ["Kevin", "M", 1993],
    ["Scott","M",1994],
    ["Jackson", "M", 1995],
    ["Liam", "M", 1996],
    ["Noah", "M", 1997],
    ["Aiden", "M", 1998],
    ["Lucas", "M", 1999],
    ["Mason", "M", 2000]])
student_pd = pd.DataFrame(my_darray)
print(student_pd)
print(student_pd.shape)
print(len(student_pd))

 

 

2) Tkinter로 window 생성 및 ListBox 생성

간단하게 Tk() 생성자로 window를 생성하였고, 크기를 지정하였습니다. 

또한 Listbox 를 생성하였고, Listbox 안의 column이 선택되었을 때, CurSelect(임의 생성 함수)가 호출되도록 하였습니다.

 

그리고 리스트에는 dataframe의 이름을 삽입하도록 하였고, 리스트의 맨뒤쪽(END)에 삽입이되도록 하였습니다. 

window = Tk()
window.geometry("300x200")

lb = Listbox(window, height=5, selectmode=SINGLE)
lb.bind('<<ListboxSelect>>',CurSelect)
lb.pack()

for i in student_pd.index:
    val = student_pd.loc[i, 0]
    lb.insert(END, val)

 

3) Label 생성

고정으로 표시할 Label과 이름, 성별, 태어난 해에 대한 정보를 동적으로 가져와 표시할 라벨을 생성하였습니다.

Name_l = Label(window, text="Name : ")
Name_l.pack()
Name_w = Label(window, text="")
Name_w.pack()

Sex_l = Label(window, text="Sex : ")
Sex_l.pack()
Sex_w = Label(window, text="")
Sex_w.pack()

Birth_l = Label(window, text="Birth : ")
Birth_l.pack()
Birth_w = Label(window, text="")
Birth_w.pack()

 

4) Listbox에 아이템이 선택되었을 때의 호출되는 함수 정의

lb.curselection() 함수를 이용해 현재 선택된 아이템의 정보를 가져오고, 출력해보게 하였습니다. 

그리고 Label에 현재 선택된 아이템의 이름, 성별, 태어난 해를 표시하도록 하였습니다.  

def CurSelect(evt):
    value = str((lb.get(lb.curselection())))
    index = str((lb.index(lb.curselection())))
    print(value)
    print(index)

    Name_w["text"]  = student_pd.loc[lb.index(lb.curselection()), 0]
    Sex_w["text"]   = student_pd.loc[lb.index(lb.curselection()), 1]
    Birth_w["text"] = student_pd.loc[lb.index(lb.curselection()), 2]

 

 

전체 코드

import numpy as np
import pandas as pd
from tkinter import *

# numpy 배열로 data frame 생성
my_darray = np.array([
    ["Bob", "M", 1991],
    ["Kate", "W", 1992],
    ["Kevin", "M", 1993],
    ["Scott","M",1994],
    ["Jackson", "M", 1995],
    ["Liam", "M", 1996],
    ["Noah", "M", 1997],
    ["Aiden", "M", 1998],
    ["Lucas", "M", 1999],
    ["Mason", "M", 2000]])
student_pd = pd.DataFrame(my_darray)
print(student_pd)
print(student_pd.shape)
print(len(student_pd))

def CurSelect(evt):
    value = str((lb.get(lb.curselection())))
    index = str((lb.index(lb.curselection())))
    print(value)
    print(index)

    Name_w["text"]  = student_pd.loc[lb.index(lb.curselection()), 0]
    Sex_w["text"]   = student_pd.loc[lb.index(lb.curselection()), 1]
    Birth_w["text"] = student_pd.loc[lb.index(lb.curselection()), 2]

window = Tk()
window.geometry("300x200")

lb = Listbox(window, height=5, selectmode=SINGLE)
lb.bind('<<ListboxSelect>>',CurSelect)
lb.pack()

for i in student_pd.index:
    val = student_pd.loc[i, 0]
    lb.insert(END, val)

Name_l = Label(window, text="Name : ")
Name_l.pack()
Name_w = Label(window, text="")
Name_w.pack()

Sex_l = Label(window, text="Sex : ")
Sex_l.pack()
Sex_w = Label(window, text="")
Sex_w.pack()

Birth_l = Label(window, text="Birth : ")
Birth_l.pack()
Birth_w = Label(window, text="")
Birth_w.pack()

window.mainloop()
반응형

+ Recent posts