|
'''
Created on 2018. 12. 27.레이아웃 연습
@author: 김정태
'''
import wx
import wx.dataview
from cProfile import label
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, title=u"Layout연습")
self.mainPanel = wx.Panel(self)
self.upperpanel = wx.Panel(self.mainPanel)
#self.leftbutton = wx.Button(self.upperpanel, label="LEFT")
self.tfNo = wx.TextCtrl(self.upperpanel)
self.tfName = wx.TextCtrl(self.upperpanel)
self.tfKor = wx.TextCtrl(self.upperpanel)
self.tfEng = wx.TextCtrl(self.upperpanel)
self.tfMath = wx.TextCtrl(self.upperpanel)
self.insertbutton = wx.Button(self.upperpanel, label="INSERT")
self.hzBoxSizer = wx.StaticBoxSizer(wx.HORIZONTAL, self.upperpanel, u"자료입력")
self.hzBoxSizer.Add(self.tfNo)
self.hzBoxSizer.Add(self.tfName)
self.hzBoxSizer.Add(self.tfKor)
self.hzBoxSizer.Add(self.tfEng)
self.hzBoxSizer.Add(self.tfMath)
self.hzBoxSizer.Add(self.insertbutton)
self.upperpanel.SetSizer(self.hzBoxSizer)
#self.middleButton = wx.Button(self.mainPanel,label="MIDDLE")
self.tableView = wx.dataview.DataViewListCtrl(self.mainPanel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.dataview.DV_MULTIPLE)
colNo = self.tableView.AppendTextColumn(u"번호")
colName = self.tableView.AppendTextColumn(u"이름")
colKor = self.tableView.AppendTextColumn(u"국어")
colEng = self.tableView.AppendTextColumn(u"영어")
colMath = self.tableView.AppendTextColumn(u"수학")
self.deleteButton = wx.Button(self.mainPanel,label="DELETE")
self.updateButton = wx.Button(self.mainPanel,label="UPDATE")
self.findButton = wx.Button(self.mainPanel,label="FIND")
self.loadButton = wx.Button(self.mainPanel,label="LOAD")
self.saveButton = wx.Button(self.mainPanel,label="SAVE")
self.vtBoxSizer = wx.BoxSizer(wx.VERTICAL)
# 0은 크기가 안바뀜, 1은 크기가 바뀔수 있음
self.vtBoxSizer.Add(self.upperpanel,0,wx.ALIGN_LEFT|wx.TOP|wx.LEFT,5)
self.vtBoxSizer.Add(self.tableView,1,wx.EXPAND|wx.ALL,5)
self.hzBoxSizer2 = wx.StaticBoxSizer(wx.HORIZONTAL, self.upperpanel, u"CRUD")
self.hzBoxSizer2.Add(self.deleteButton)
self.hzBoxSizer2.Add(self.updateButton)
self.hzBoxSizer2.Add(self.findButton)
self.hzBoxSizer2.Add(self.loadButton)
self.hzBoxSizer2.Add(self.saveButton)
self.vtBoxSizer.Add(self.hzBoxSizer2,0,wx.ALIGN_RIGHT|wx.RIGHT|wx.BOTTOM,5)
self.mainPanel.SetSizer(self.vtBoxSizer)
#-------------버튼 이벤트 바인딩-----------
self.insertbutton.Bind(wx.EVT_BUTTON, self.OnInsert)
self.deleteButton.Bind(wx.EVT_BUTTON, self.OnDelete)
self.updateButton.Bind(wx.EVT_BUTTON, self.OnUpdate)
self.findButton.Bind(wx.EVT_BUTTON, self.OnFind)
self.loadButton.Bind(wx.EVT_BUTTON, self.xxxxxxxxOnLoad)
self.saveButton.Bind(wx.EVT_BUTTON, self.OnSave)
self.tableView.Bind(wx.dataview.EVT_DATAVIEW_SELECTION_CHANGED, self.OnDown)
def OnDown(self, event):
num = self.tableView.GetSelectedRow()
if(num>=0):
no = self.tableView.GetValue(num, 0)
name = self.tableView.GetValue(num, 1)
kor = self.tableView.GetValue(num, 2)
eng = self.tableView.GetValue(num, 3)
math = self.tableView.GetValue(num, 4)
self.tfNo.SetValue(no)
self.tfName.SetValue(name)
self.tfKor.SetValue(kor)
self.tfEng.SetValue(eng)
self.tfMath.SetValue(math)
else:
pass
def OnInsert(self, event):
no = self.tfNo.GetValue()
name = self.tfName.GetValue()
kor = self.tfKor.GetValue()
eng = self.tfEng.GetValue()
math = self.tfMath.GetValue()
row = [no, name, kor, eng, math]
self.tableView.AppendItem(row)
pass
def OnDelete(self, event):
selNo = self.tableView.GetSelectedRow()
self.tableView.DeleteItem(selNo)
def OnUpdate(self, event):
no = self.tfNo.GetValue()
name = self.tfName.GetValue()
kor = self.tfKor.GetValue()
eng = self.tfEng.GetValue()
math = self.tfMath.GetValue()
#row = [no, name, kor, eng, math]
selNo = self.tableView.GetSelectedRow()
self.tableView.SetValue(no, selNo, 0)
self.tableView.SetValue(name, selNo, 1)
self.tableView.SetValue(kor, selNo, 2)
self.tableView.SetValue(eng, selNo, 3)
self.tableView.SetValue(math, selNo, 4)
pass
def OnFind(self, event):
name = self.tfName.GetValue()
rowsNum = self.tableView.GetItemCount()
for i in range(0, rowsNum):
nam = self.tableView.GetValue(i, 1)
if(name==nam):
self.tableView.SelectRow(i)
no = self.tableView.GetValue(i, 0)
name = self.tableView.GetValue(i, 1)
kor = self.tableView.GetValue(i, 2)
eng = self.tableView.GetValue(i, 3)
math = self.tableView.GetValue(i, 4)
self.tfNo.SetValue(no)
self.tfName.SetValue(name)
self.tfKor.SetValue(kor)
self.tfEng.SetValue(eng)
self.tfMath.SetValue(math)
pass
def xxxxxxxxOnLoad(self, event):
with wx.FileDialog(self, "Open CSV file", \
wildcard="CSV,TEXT files (*.csv *.txt)|*.csv; *.txt", \
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
if fileDialog.ShowModal() == wx.ID_CANCEL:
return
pathname = fileDialog.GetPath()
self.tfPath.Clear()
self.tfPath.AppendText(pathname)
def OnSave(self, event):
num = self.tableView.GetItemCount()
colNum = self.tableView.GetColumnCount()
#새로이 저장할 파일을 연다.
with open('scores.csv', 'w', encoding='UTF-8') as f:
data = []
titles = []
for x in self.tableView.GetColumns():
titles.append(x.GetTitle())
print(titles)
colLine = ",".join(titles)
colLine += "\n"
data.append(colLine)
for row in range(0, num):
line = ""
datum = [];
for col in range(0, colNum):
temp = self.tableView.GetValue(row, col)
datum.append(temp);
line = ','.join(datum)
line += '\n'
# 한줄이 완성되었음
data.append(line)
f.writelines(data)
print("저장되었습니다")
if __name__ =="__main__":
app = wx.App()
frame = MyFrame()
frame.SetSize(200, 100, 700, 450, sizeFlags=wx.SIZE_AUTO)
frame.Show()
app.MainLoop()
------------------------------------------------------------
----------------------------------------------------------------
ScoreProc
Created on 2018. 12. 26.
@author: ict-15
'''
import wx
import wx.xrc
from visualize.CSVPanel import CSVPanel
#from visualize import GraphicPanel
# 객체를 만들어 사용할 class모듈을 임포트
# from을 사용했을때 코드를 생략할수 있다.
# import visualize.CSVPanel
import visualize.GraphicPanel
# 클래스 이름은 MyFrame1이며 wx.Frame을 상속 받았다.
class MyFrame1 ( wx.Frame ):
# 생성 메소드
def __init__( self, parent ): #MyFrame1(None) 생략되어있다
# 조상 프레임에 신고(생성메소드는 상속되지 않는 특성으로..)
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"성적분석", pos = wx.DefaultPosition, size = wx.Size( 500,316 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
bSizer2 = wx.BoxSizer( wx.HORIZONTAL )
self.btnHistogram = wx.Button( self, wx.ID_ANY, u"과목별평균", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.btnHistogram, 0, wx.ALL, 5 )
self.btnPieChart = wx.Button( self, wx.ID_ANY, u"개인별성적", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.btnPieChart, 0, wx.ALL, 5 )
self.btnClear = wx.Button( self, wx.ID_ANY, u"차트삭제", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.btnClear, 0, wx.ALL, 5 )
self.btnTemp = wx.Button( self, wx.ID_ANY, u"예비버튼", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.btnTemp, 0, wx.ALL, 5 )
bSizer1.Add( bSizer2, 0, wx.EXPAND, 5 )
bSizer5 = wx.BoxSizer( wx.HORIZONTAL )
# 패널의 상위에는 이 프레임임을 알리는것 (self)
self.csvPanel = CSVPanel(self)
# wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.csvPanel.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INACTIVECAPTION ) )
bSizer5.Add( self.csvPanel, 1, wx.EXPAND |wx.ALL, 5 )
self.graphPanel = visualize.GraphicPanel.GraphicPanel(self)
# wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.graphPanel.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_INACTIVEBORDER ) )
bSizer5.Add( self.graphPanel, 1, wx.EXPAND |wx.ALL, 5 )
bSizer1.Add( bSizer5, 1, wx.EXPAND, 5 )
self.SetSizer( bSizer1 )
self.Layout()
self.Centre( wx.BOTH )
# Connect Events
self.btnHistogram.Bind( wx.EVT_BUTTON, self.drawHistogram )
self.btnPieChart.Bind( wx.EVT_BUTTON, self.drawPieChart )
self.btnClear.Bind( wx.EVT_BUTTON, self.clearChart )
self.btnTemp.Bind( wx.EVT_BUTTON, self.temp )
def __del__( self ):
print("대단히 수고가 많으셨습니다.")
pass
# Virtual event handlers, overide them in your derived class
def drawHistogram( self, event ):
# tableView는 self.tableView로 정의 되어있어야 다른 클래스에서 접근할수 있다.
rowNum = self.csvPanel.tableView.GetItemCount()
cols = self.csvPanel.tableView.GetColumnCount()
sumKor = 0; sumEng = 0; sumMath = 0
for row in range(0, rowNum):
#for col in range(3,cols):
sumKor = sumKor + int (self.csvPanel.tableView.GetValue(row, 2))
sumEng = sumEng + int (self.csvPanel.tableView.GetValue(row, 3))
sumMath = sumMath + int (self.csvPanel.tableView.GetValue(row, 4))
# 평균 산출
avgKor = sumKor / rowNum
avgEng = sumEng / rowNum
avgMath = sumMath / rowNum
# 막대 그래프를 실제 그리기 위해
self.graphPanel.setData([avgKor, avgEng, avgMath])
def drawPieChart( self, event ):
#selectRow = self.csvPanel.tableView.GetSelectedRow();
# 선택된 개인별로 성적 구성도를 파이 차트로 나타낸다.
num = self.csvPanel.tableView.GetSelectedRow()
kor = int(self.csvPanel.tableView.GetValue(num, 2))
eng = int(self.csvPanel.tableView.GetValue(num, 3))
math = int(self.csvPanel.tableView.GetValue(num, 4))
name = self.csvPanel.tableView.GetValue(num, 1)
self.graphPanel.setPieData([kor,eng,math,name])
def clearChart( self, event ):
self.graphPanel.clear()
def temp( self, event ):
event.Skip()
if __name__ == '__main__':
ex = wx.App()
frame = MyFrame1(None)
frame.SetSize(wx.Size(900,450))
frame.Show()
ex.MainLoop()
--------------------------------------------------
CSVPanel
import wx.dataview
from visualize.GraphicPanel import GraphicPanel
# GUI를 위해 wx.Frame상속받아 MyFrame1로 코딩
class CSVPanel (wx.Panel):
# 멤버 리스트로 선언, 각 매소드내에서 columns를 참조할때에는 self.columns를 해야 한다
columns = [];
# 이 클래스의 객체 생성을 위한 생성메소드
# 클래스 내의 메소드(함수)는 self는 기본 인자로 가져야 합니다.
def __init__(self, parent):
# __init__ 은 생성메소드 첫줄은 조상클래스의 생성메소드 호출을 해야합니다.
# self를 기본으로 전잘해주고, parent를 전잘한다.
super(CSVPanel,self).__init__(parent,size=(-1,300))
# UI 시작, root, init의 전역변수이기 때문에 self가 없다.
bSizer1 = wx.BoxSizer(wx.VERTICAL) # BoxSizer 버티컬로 생성
bSizer2 = wx.BoxSizer(wx.HORIZONTAL) # Boxsizer 호라이존탈로 생성
# 다른 메소드를 호출하 가능하게 self를 붙인것이다, ''은 wx.EmptyString으로 가능하다.
self.tfPath = wx.TextCtrl(self, wx.ID_ANY, '' , wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.tfPath, 1, wx.ALL, 5)
self.btnLoad = wx.Button(self, wx.ID_ANY, u"자료읽기", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.btnLoad, 0, wx.ALL, 5)
self.btnClear = wx.Button(self, wx.ID_ANY, u"자료삭제", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.btnClear, 0, wx.ALL, 5)
self.tfFilter = wx.TextCtrl(self, wx.ID_ANY, \
wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
bSizer2.Add(self.tfFilter, 0, wx.ALL, 5)
bSizer1.Add(bSizer2, 0, wx.EXPAND, 5)
self.tableView = wx.dataview.DataViewListCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.dataview.DV_MULTIPLE)
bSizer1.Add(self.tableView, 1, wx.ALL | wx.EXPAND, 5)
bSizer3 = wx.BoxSizer(wx.HORIZONTAL)
self.tfNewfile = wx.TextCtrl(self, wx.ID_ANY, '', wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.tfNewfile, 1, wx.ALL, 5)
# 툴팁세팅
self.tfNewfile.SetToolTip(wx.ToolTip("더블클릭하면 위 파일 경로가 복사됩니다."))
self.btnSave = wx.Button(self, wx.ID_ANY, u"새로저장", wx.DefaultPosition, wx.DefaultSize, 0)
bSizer3.Add(self.btnSave, 0, wx.ALL, 5)
bSizer1.Add(bSizer3, 0, wx.EXPAND, 5)
# 이 프레임에 bSizer1을 루터로 심는다.
self.SetSizer(bSizer1)
self.Centre(wx.BOTH)
self.Layout()
# Connect Events, 이벤트 연결 하기(이벤트 종류), 이벤트 처리할 메소드는 event도 기본으로 파라미트로 가져야한다. 예:(self, event)
self.btnLoad.Bind(wx.EVT_BUTTON, self.readData) # 불러오기
self.btnClear.Bind(wx.EVT_BUTTON, self.clearData) # 지우기
self.tfFilter.Bind(wx.EVT_TEXT, self.changeData) # 필터
self.btnSave.Bind(wx.EVT_BUTTON, self.saveNewFile) # 저장
self.tfNewfile.Bind(wx.EVT_LEFT_DCLICK,self.setTempData) # 더블클릭
# 제거 메소드
def __del__(self):
# 메모리에서 제거 될 때에 수행해야 할 코딩
pass
def setTempData(self,event):
self.tfNewfile.Clear()
self.tfNewfile.AppendText(self.tfPath.GetValue())
def readData(self, event):
# TODO CSV파일의 첫줄을 읽어 컬럼만들어 tableView에 붙이고
# CSV파일의 두번째줄 부터 데이터를 읽어 tableView에 반영시키는 작업
# [1] 첫줄읽어 컬럼 만들기, 불러오기- scv, txt 확장자 읽기 기능
# file chooser dialog - 파일 선택 기능
# 파일 다이얼로그에서 하는일
with wx.FileDialog(self, "Open CSV file", \
wildcard="CSV files (*.csv *.txt)|*.csv; *.txt", \
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog: # 다이얼로그 창 열기
# 다이얼로그 취소 버튼을 눌렀을때 작업을 중단시키는 기능
if fileDialog.ShowModal() == wx.ID_CANCEL:
return
# 열기 버튼을 눌렀을때 진행 코딩
# 파일 하나를 선택한 경로를 pathname으로 지정
pathname = fileDialog.GetPath()
# 기존 설정된 파일경로를 제거하고
self.tfPath.Clear()
# 새로운 경로를 추가하는 작업
self.tfPath.AppendText(pathname)
# 테이블 뷰에 세팅되어 있는 컬럼이 0보다 크다면(이전에 사용한 컬럼이 배치되어 있다면)
if(self.tableView.GetColumnCount() > 0):
# 테이뷸 뷰의 컬럼을 제거
self.tableView.ClearColumns()
# with open은 파일 close()를 생략할수 있게 사용
with open(pathname, 'r', encoding='utf-8') as f:
line = f.readline() # 첫번째줄이다.
colTokens = line.split(',') # 첫번째줄의 정보를 coltokens(컬럼 토큰) 리스트로 만든다.
for col in colTokens:
col = col.replace('\n', '') # 컬럼 끝에는 \n이 들어있어서 제거
# 테이블뷰에다가 새로운 컬럼을 만들어 붙인다.
column = self.tableView.AppendTextColumn(u"" + col) # UTF-8로 한글도 컬럼을 생성할수 있게 하는 작업
self.columns.append(column)
# [2] 데이터 반영하기
# tableView에 데이터가 있다면 기존의 자료를 깨끗이 제거하는 작업
self.tableView.DeleteAllItems();
# 실제 데이터 한줄을 읽는다.
line = f.readline() # 두번째줄이다.
while line:
dataTokens = line.split(',') # 자료를 ,(콤마)로 쪼개고
num = len(dataTokens)
# num -1은 끝의 자리
# 끝부분의 자료에서 줄바꿈 표시를 제거 하는 작업
dataTokens[num - 1] = dataTokens[num - 1].replace('\n', '')
# tableView에 한번에 한줄의 데이터를 반영 시키는 작업 (리스트를 붙였기 때문에)
self.tableView.AppendItem(dataTokens);
# 새로운 줄을 읽는다.
line = f.readline()
event.Skip() # <- 제거해도 된다.
# 자료 삭제 버튼
def clearData(self, event):
# 모든 데이터 삭제
self.tableView.DeleteAllItems();
# 모든 컬럼 삭제
self.tableView.ClearColumns()
event.Skip()
# 필터링 작업
def changeData(self, event):
# 기존의 데이터를 제거하고 새로이 가져다 쓰기 위해
self.tableView.DeleteAllItems();
# 지정한 파일을 읽어서
with open(self.tfPath.GetValue(), 'r', encoding='utf-8') as f:
line = f.readline() # 첫번째줄이다. - 컬럼명 부분이기 때문에 그냥 건너띈다.
line = f.readline() # 두번째줄이다. - 실재로 반영할 부분이기 때문에 반영할 데이터 한줄씩 읽는다.
while line:
dataTokens = line.split(',')
num = len(dataTokens)
if self.tfFilter.GetValue() in dataTokens[0]:
dataTokens[num - 1] = dataTokens[num - 1].replace('\n', '')
self.tableView.AppendItem(dataTokens);
line = f.readline()
# 새롭게 csv파일로 저장 하는 작업
# 테이블뷰에 반영된 자료만 저장하는 작업
def saveNewFile(self, event):
# TODO tableView 자료를 읽어 새로운 csv 파일을 만들어 저장합니다.
num = self.tableView.GetItemCount() # 데이터뷰 리스트 컨트롤(테이블뷰)에 아이템이 총 몇개인지 파악
colNum = self.tableView.GetColumnCount() # 컬럼의 갯수 파악
# 'w' 쓰기, 'r' 읽기
with open(self.tfNewfile.GetValue(), 'w', encoding='utf-8') as f:
data = [] # 리스트로 선언
titles = [] # 리스트로 선언
# 데이터뷰 리스트 컨트롤(테이블뷰)의 컬럼들을 가져와서
# 컬럼이름(타이틀)을 titles 리스트를 만든다.
# csv의 첫줄
for x in self.tableView.GetColumns():
titles.append(x.GetTitle())
# print(titles)
colLine = ",".join(titles) # 리스트를 가지고 ,[콤마]로 join - 리스트를 콤마로 구분한 문자열 한줄로 변환
colLine += "\n" # 주의 - ~ 줄 끝에 줄 바꿈 표시를 넣는다.
data.append(colLine) # 첫줄의 데이터 리스트에 넣는다.
# 두번째 줄 부터는 실제 데이터 행을 만들어 넣는다.
for row in range(0, num):
datum = []; # 한 행의 데이터를 담을 리스트
for col in range(0, colNum): # row 행
temp = self.tableView.GetValue(row, col)
datum.append(temp);
line = ','.join(datum) # 각 컬럼 값을 한 줄의 문자열로 결합
line += '\n' # 줄바꿈 표시 삽입
# 한줄이 완성되었음
data.append(line)
f.writelines(data) # 완성된 데이터를 한 꺼번에 저장
print("새로운 파일 생성 완료")
#------------------------------페널을 테스트 합니다.
if __name__ == '__main__':
ex = wx.App()
frame = wx.Frame(None)
csvPanel = CSVPanel(frame)
graPanel = GraphicPanel(frame)
bsizer1 = wx.BoxSizer( wx.HORIZONTAL )
bsizer1.Add(csvPanel, 0, wx.EXPAND, 5)
graPanel.setData([120,200,78,89])
bsizer1.Add(graPanel, 0, wx.EXPAND, 5)
frame.SetSizer( bsizer1 )
frame.SetSize(wx.Size(800,300))
frame.Show()
ex.MainLoop()
-------------------------------------------------------------
GraphicPanel
import wx
import math
# 그래피컬 패널의 정의
class GraphicPanel(wx.Panel):
data = [] # 멤버필드로 data 리스트 선언
# 생성 메소드 - parent는 프레임 객체가 전달
# parent는 이 패널이 배치될 프레임을 의미
def __init__(self,parent):
super(GraphicPanel,self).__init__(parent,size=(500,500))
# setData의 메소드는 호출시 전달받은 데이터 리스트를 멤버필드인 data에 전달
def setData(self,data):
self.data = data # 멤버필드로 전달
self.Bind(wx.EVT_PAINT,self.OnPaint) # 이벤트 처리(wx.EVT_PAINT는 그리는 작업 이벤트를 발생, self.OnPaint는 그리는 방법(구체적내용))
self.Refresh() # 중요 - 새로 그리는것이기 때문에 새로 그린 내용으로 갱신
def setPieData(self,data):
self.data = data # 멤버필드로 전달
self.Bind(wx.EVT_PAINT,self.OnPaint2) # 이벤트 처리(wx.EVT_PAINT는 그리는 작업 이벤트를 발생, self.OnPaint는 그리는 방법(구체적내용))
self.Refresh() # 중요 - 새로 그리는것이기 때문에 새로 그린 내용으로 갱신
def clear(self):
# self.OnPaint는 그리는 방법(구체적내용)
self.Bind(wx.EVT_PAINT,self.OnClear)
# 중요 - 새로이 그린 내용으로 갱신
self.Refresh()
def OnClear(self,event):
self.dc = wx.PaintDC(self)
self.brush = wx.Brush("#58FA82") #칠하는 용도
self.dc.SetBackground(self.brush)
self.dc.Clear()
# OnPaint - 그리는 방법 (이벤트 처리의 파라미터는 self, event는 필수적으로 사용)
def OnPaint(self,event):
self.dc = wx.PaintDC(self) #DC - Draw Context
self.brush = wx.Brush("yellow") # brush - 칠하는 용도, 색 지정하는 방법 1.Colour(xx,xx,xx, yy(투명도)) 2.xx=0~255 3.#xxxxxx 3가지로 지정 가능
self.dc.SetBackground(self.brush) # 패널의 백 그라운드 칠하기
self.dc.Clear() # 브러쉬에 지정된 색삭으로 지우기
# 검은색 블러쉬를 만듭니다.
self.brush.SetColour(wx.Colour("red"))
self.dc.SetBrush(self.brush) # 새로 만든 그리는 도구는 반드시 세팅시켜줘야 한다.
# 데이터의 사이즈를 구한다
size = len(self.data)
for x in range(0,size):
self.dc.DrawRectangle((10+(x*40)),10, 30, self.data[x]) # 좌측 상단 x:(10+(x*40), 좌측 상단 y:10, 사각형의 가로:30, 사각형의 세로:self.data[x]
self.dc.DrawText(str(self.data[x]), (10+(x*40)), 0) #데이터의 값을 글씨로 나타냄 - 좌측상단 x, 좌측상단y
def OnPaint2(self,event):
self.dc = wx.PaintDC(self) #DC - Draw Context
self.brush = wx.Brush("#FFFFFF") # brush - 칠하는 용도, 색 지정하는 방법 1.Colour(xx,xx,xx, yy(투명도)) 2.xx=0~255 3.#xxxxxx 3가지로 지정 가능
self.dc.SetBackground(self.brush) # 패널의 백 그라운드 칠하기
self.dc.Clear() # 브러쉬에 지정된 색삭으로 지우기
# 점수들의 안분계산 (점수를 360도로 환산한 값)
total = self.data[0] + self.data[1] + self.data[2]
self.data[0] = int(self.data[0]/total*360) # 안분계산
self.data[1] = int(self.data[1]/total*360)
self.data[2] = int(self.data[2]/total*360)
self.brush.SetColour(wx.Colour(0,0,0,1))
self.dc.SetBrush(self.brush)
self.dc.DrawText(self.data[3]+" 성적분포도",340,10)
self.brush.SetColour(wx.Colour(255,0,0,1))
self.dc.SetBrush(self.brush)
self.dc.DrawEllipticArc(10, 10, 300, 300, 0, self.data[0]) # 원의 기준은 좌측 상단점
self.dc.DrawRectangle(340, 40, 50, 50)
self.dc.DrawText("국어",400,40)
self.brush.SetColour(wx.Colour(0,255,0,1))
self.dc.SetBrush(self.brush)
self.dc.DrawEllipticArc(10, 10, 300, 300, self.data[0]+1, self.data[0]+self.data[1])
self.dc.DrawRectangle(340, 110, 50, 50)
self.dc.DrawText("영어",400,110)
self.brush.SetColour(wx.Colour(0,0,255,1))
self.dc.SetBrush(self.brush)
self.dc.DrawEllipticArc(10, 10, 300, 300, self.data[0]+self.data[1]+1, 360)
self.dc.DrawRectangle(340, 180, 50, 50)
self.dc.DrawText("수학",400,180)