소개
이 랩에서는 wxPython 애플리케이션을 생성하여 wxPython 의 다양한 컨트롤에 표시하기 위해 wx.Bitmap 에 수학 텍스트를 표시하는 과정을 안내합니다. Matplotlib 라이브러리를 사용하여 텍스트를 이미지로 변환하고 wxPython 라이브러리를 사용하여 이미지를 표시합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.
때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.
학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.
필수 라이브러리 설치
이 랩을 완료하려면 다음 라이브러리가 설치되어 있어야 합니다.
- wxPython
- Matplotlib
pip 를 사용하여 이러한 라이브러리를 설치할 수 있습니다.
pip install wxPython
pip install matplotlib
wxPython 애플리케이션 생성
새로운 Python 파일을 생성하고 필요한 라이브러리를 import 합니다.
import wx
import numpy as np
from io import BytesIO
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
Mathtext 를 wx.Bitmap 으로 변환
mathtext 를 wx.Bitmap 으로 변환하는 함수를 정의합니다. 이 함수는 Matplotlib 을 사용하여 (0, 0) 위치에 텍스트를 그리지만, facecolor="none"과 bbox_inches="tight", pad_inches=0을 사용하여 투명 마스크를 얻은 다음 wx.Bitmap 에 로드합니다.
def mathtext_to_wxbitmap(s):
fig = Figure(facecolor="none")
text_color = (
np.array(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)) / 255)
fig.text(0, 0, s, fontsize=10, color=text_color)
buf = BytesIO()
fig.savefig(buf, format="png", dpi=150, bbox_inches="tight", pad_inches=0)
s = buf.getvalue()
return wx.Bitmap.NewFromPNGData(s, len(s))
함수 정의
애플리케이션이 표시할 함수 목록을 정의합니다. 각 함수는 math text 와 입력 값을 받아 출력 값을 반환하는 lambda 함수로 정의됩니다.
functions = [
(r'$\sin(2 \pi x)$', lambda x: np.sin(2*np.pi*x)),
(r'$\frac{4}{3}\pi x^3$', lambda x: (4/3)*np.pi*x**3),
(r'$\cos(2 \pi x)$', lambda x: np.cos(2*np.pi*x)),
(r'$\log(x)$', lambda x: np.log(x))
]
Canvas Frame 생성
wx.Frame 을 상속하는 새로운 클래스를 생성합니다. 이 클래스는 선택된 함수를 표시하는 canvas 를 생성합니다.
class CanvasFrame(wx.Frame):
def __init__(self, parent, title):
super().__init__(parent, -1, title, size=(550, 350))
self.figure = Figure()
self.axes = self.figure.add_subplot()
self.canvas = FigureCanvas(self, -1, self.figure)
self.change_plot(0)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.add_buttonbar()
self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
self.SetSizer(self.sizer)
self.Fit()
버튼 바 추가
각 함수에 대한 아이콘을 표시하는 버튼 바를 애플리케이션에 추가합니다. 버튼을 클릭하면 애플리케이션은 해당 함수를 표시합니다.
def add_buttonbar(self):
self.button_bar = wx.Panel(self)
self.button_bar_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.sizer.Add(self.button_bar, 0, wx.LEFT | wx.TOP | wx.GROW)
for i, (mt, func) in enumerate(functions):
bm = mathtext_to_wxbitmap(mt)
button = wx.BitmapButton(self.button_bar, 1000 + i, bm)
self.button_bar_sizer.Add(button, 1, wx.GROW)
self.Bind(wx.EVT_BUTTON, self.OnChangePlot, button)
self.button_bar.SetSizer(self.button_bar_sizer)
툴바 추가
사용자가 확대/축소, 이동 (pan) 및 플롯을 이미지로 저장할 수 있도록 하는 툴바를 애플리케이션에 추가합니다. 이 툴바는 프레임 하단에 추가됩니다.
def add_toolbar(self):
self.toolbar = NavigationToolbar2Wx(self.canvas)
self.toolbar.Realize()
self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
self.toolbar.update()
플롯 변경
선택된 함수에 따라 플롯을 변경하는 함수를 정의합니다. 이 함수는 plot_number 를 입력으로 받아 플롯을 적절하게 변경합니다.
def change_plot(self, plot_number):
t = np.arange(1.0, 3.0, 0.01)
s = functions[plot_number][1](t)
self.axes.clear()
self.axes.plot(t, s)
self.canvas.draw()
애플리케이션 생성
wx.App 에서 상속받는 새로운 클래스를 생성합니다. 이 클래스는 프레임을 생성하고 이벤트 루프를 시작합니다.
class MyApp(wx.App):
def OnInit(self):
frame = CanvasFrame(None, "wxPython mathtext demo app")
self.SetTopWindow(frame)
frame.Show(True)
return True
애플리케이션 실행
MyApp 클래스의 인스턴스를 생성하여 애플리케이션을 실행합니다.
if __name__ == "__main__":
app = MyApp()
app.MainLoop()
요약
이 랩에서는 wx.Bitmap 에 수학 텍스트를 표시하는 wxPython 애플리케이션을 만드는 방법을 배웠습니다. Matplotlib 라이브러리를 사용하여 텍스트를 이미지로 변환하고 wxPython 라이브러리를 사용하여 이미지를 표시했습니다. 또한 애플리케이션에서 버튼 바와 툴바를 생성하고 선택한 함수에 따라 플롯을 변경하는 방법도 배웠습니다.