반응형
개요
파일선택컨트롤(wx.FilePickerCtrl)은 이름 그대로 파일 선택을 위한 컨트롤이다. 파일선택컨트롤은 텍스트컨트롤(wx.TextCtrl)과 버튼(wx.Button)으로 구성되어 있고, 버튼을 클릭하면 파일다이얼로그(wx.FileDialog)가 열린다. 사용법이 매우 간단하니 여기서는 파일선택컨트롤로 패널에 GIF Animation을 추가하는 법을 알아보자.
wx.FilePickerControl
선언은 일반 대화상자(wx.Dialog)의 선언과 비슷하고, 파일 선택을 위한 와일드카드(wildcard)가 추가된다. 와일드카드 문법에 대해서는 어렵지 않으므로 예제를 참조하자.
fpc = wx.FilePickerCtrl(parent, id=wx.ID_ANY, path="", message="", wildcard="", pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.FLP_DEFAULT_STYLE, name=FilePickerCtrlNameStr)
파일선택컨트롤이 일반 파일대화상자와 다른점은, ShowModal() 함수를 가지고 있지 않다는 점이다. 대신, 사용자가 파일 선택 후 OK버튼을 누르면 아래 이벤트가 발생한다. 따라서 이를 바인딩 해주면 된다.
wx.EVT_FILEPICKER_CHANGED
예제에서 구현된 결과를 파일대화상자(wx.FileDialog)로 구현한 결과와 비교해보자. (링크: https://hexa-coding.tistory.com/26)
예제
아래 예제에서는 파일선택컨트롤로 움직이는 GIF Animation 파일을 창에 띄우는 기능을 구현해본다. 구글에서 검색하여 미리 적당한 Animation 파일을 준비하고 예제를 수행해보자.
반응형
import wx
from wx.adv import Animation, AnimationCtrl
class Example(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self,parent,id,'Example Window', size=(650,800))
panel = wx.Panel(self)
# 이미지 파일 타입에 따른 확장자명을 딕셔너리로 만든다
types = ['GIF', 'Bitmap', 'JPEG', 'PNG', 'Photoshop', 'TIFF', 'RAW']
exts = ['gif', 'bmp', 'jpeg', 'png', 'psd', 'tif', 'raw']
pics = dict(zip(types,exts))
# FilePickerCtrl의 와일드카드 String을 만든다
wcard = ""
for type, ext in pics.items():
wcard += f"{type} files (*.{ext})|*.{ext}|"
wcard = wcard[:-1]
# 와일드카드는 OR 연산자인 "|"를 이용하여 여러 개를 동시에 사용할 수 있다. 아래 주석을 해제해보자.
# print(wcard)
# 파일선택컨트롤
f_pick = wx.FilePickerCtrl(panel, id=-1, path="D:\icon/", message="파일을 선택하세요", size=(450,-1),
wildcard=wcard, style=wx.FLP_DEFAULT_STYLE)
# 파일선택컨트롤을 담을 스태틱박스
sbox = wx.StaticBox(panel, -1, "파일선택:")
sbox_sizer = wx.StaticBoxSizer(sbox, wx.VERTICAL)
sbox_sizer.Add(f_pick, 0, wx.EXPAND, 10)
def OnButtonClicked(f_pick, e):
import os
# 선택한 파일 경로
path = f_pick.GetPath()
# 확장자가 gif 이면 애니매이션을 띄운다.
# gif 애니매이션 파일은 구글에 검색해서 아무거나 다운받아놓자.
# 파일 확장자명이 .gif로 끝날 때 수행
if os.path.basename(path).endswith('.gif'):
# 애니매이션 생성
anim = Animation(path)
# 애니매이션 컨트롤 생성
ctrl = AnimationCtrl(panel, -1, anim)
# 박스사이저에 애니매이션 컨트롤을 담는다.
bsizer.Add(ctrl, 1, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10)
# 애니매이션 동작
ctrl.Play()
# Layout()이 이 부분을 주석처리 하고 실행해보자
# 주석일때와 그렇지 않을때 차이점이 무엇일까?
bsizer.Layout()
# 파일선택시 동작하는 wx.EVT_FILEPICKER_CHANGED 이벤트를 감지해 함수를 실행한다.
self.Bind(wx.EVT_FILEPICKER_CHANGED, lambda e: OnButtonClicked(f_pick, e))
bsizer = wx.BoxSizer(wx.VERTICAL)
bsizer.Add(sbox_sizer, 0, wx.ALL|wx.EXPAND, 10)
panel.SetSizer(bsizer)
self.Center()
if __name__=="__main__":
app = wx.App()
frame=Example(parent=None, id=-1)
frame.Show()
app.MainLoop()
도움되셨다면 하트(♥) 부탁드리고, 더 궁금한 사항은 댓글로 남겨주세요 :)
반응형
'wxPython' 카테고리의 다른 글
파이썬 GUI, 풍선 팁 BalloonTip (0) | 2023.03.21 |
---|---|
파이썬 GUI, 노트북, 탭 창 wx.Notebook (0) | 2023.03.19 |
파이썬 GUI, 스태틱박스 사이저 wx.StaticBoxSizer (0) | 2023.03.12 |
파이썬 GUI, 플렉시 그리드 사이저 wx.FlexiGridSizer (0) | 2023.03.12 |
파이썬 GUI, 다중 창 인터페이스 wx.MDIParentFrame (4) | 2023.03.11 |