
개요
파일 선택기 컨트롤(wx.FilePickerCtrl)이름에서 알 수 있듯이 파일을 선택하는 컨트롤입니다.파일 선택 컨트롤 텍스트 컨트롤(wx.TextCtrl)수업 버튼(wx.Button)버튼을 클릭하면 파일 대화상자(wx.FileDialog)사용법은 매우 간단합니다. 파일 선택 컨트롤을 사용하여 패널에 GIF 애니메이션을 추가하는 방법을 알아보겠습니다.
wx.FilePicker 컨트롤
선언은 일반 다이얼로그(wx.Dialog)와 유사하며, 와일드카드와일드카드 구문을 추가하는 것은 어렵지 않습니다. 예를 살펴보겠습니다.
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() 함수가 없다는 것입니다. 대신 사용자가 파일을 선택하고 확인 버튼을 누르면 다음과 같은 이벤트가 발생합니다. 따라서 묶기만 하면 됩니다.
wx.EVT_FILEPICKER_CHANGED
예제에서 얻은 결과와 파일 대화 상자(wx.FileDialog)에서 얻은 결과를 비교해 봅시다. (링크: https://hexa-coding./26)
예
다음 예제에서는 움직이는 GIF 애니메이션 파일을 파일 선택 컨트롤로 창에 표시하는 기능을 구현합니다. 구글 검색을 해서 미리 적당한 애니메이션 파일을 준비하고 예를 들어보자.
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()
도움이 되셨다면 좋아요(), 더 궁금하신 사항은 메세지 남겨주세요 🙂