너네 땜에 금방 해결될 문제를 한참을 고민했잖아...=_= MS Access Driver를 사용하는데 SQL쿼리를 날리는게 자꾸 매개변수가 1개 부족하다고 나왔다. 그래서 처음에는 낑낑대면서 고치고 있었는데... 하도 답답해서 parameter 로 검색을 해보니 이럴 수가...바로 나온다. 그래...너네를 믿은 내가 잘못이다...=_= 아무튼 이걸 해결하고 나니 나머지는 일사천리. 어차피 공부 겸 도와줄 겸 해서 만든거니까 여기 소스를 올려둬야겠다. 참고로 이건 탑클래스라는 학원관리프로그램에서 학생별로 상담기록이 인쇄가 안 되길래 만든 프로그램이다. UI는 [엉망]이다.ㅋㅋㅋ 나중에 이 코드를 하나씩 분석한 글을 다시 또 올려봐야지. # -*- coding: EUC-KR -*- #아래 세 줄은 wxPython 을 이용한 코드가 py2exe로 변환할때 한글이 끼어있으면 나는 에러를 방지하기 위함. import sys if hasattr(sys, "setdefaultencoding"): sys.setdefaultencoding(sys.getfilesystemencoding()) import wx import wx.grid import dbi, odbc import shutil import os import win32api
class MyPanel(wx.Panel): def __init__(self, parent, id): wx.Panel.__init__(self, parent, id) self.parent = parent self.txtName = wx.TextCtrl(self, -1, "학생이름 입력") self.btnSearch = wx.Button(self, -1, "상담기록 검색") self.btnPrint = wx.Button(self, -1, "인쇄") self.grdData = wx.grid.Grid(self, -1, size=(350,150)) self.grdData.CreateGrid(500, 3) self.txtName.SetPosition((10, 10)) self.btnSearch.SetPosition((120, 10)) self.btnPrint.SetPosition((220, 10)) self.grdData.SetPosition((10,60)) self.grdData.SetColLabelValue(0,"날짜") self.grdData.SetColLabelValue(1,"상담선생님") self.grdData.SetColLabelValue(2,"상담내용") self.txtName.SetFocus()
self.Bind(wx.EVT_BUTTON, self.OnSearchDB, self.btnSearch) self.Bind(wx.EVT_BUTTON, self.OnPrint, self.btnPrint)
def OnSearchDB(self, event): # 여기에 기존 표에 있던 내용 지우는 과정이 들어가야 된다. ClearGrid() result = GetData(self, self.txtName.Value) for row in range(len(result)): for col in range(len(result[row])): values = result[row][col] # print values # print len(values) try: self.grdData.SetCellValue(row,col,str(values)) except: self.grdData.SetCellValue(row,col,"DB입력이 잘못되어 있습니다. 5줄제한을 맞춰주세요.")
def OnPrint(self, event): #텍스트 파일로 저장. result = GetData(self, self.txtName.Value) SaveFile(result, self.txtName.Value) #텍스트 파일 인쇄. PrintFile() #인쇄한 텍스트 파일 삭제. DeleteFile()
def SaveFile(result, Name): SeperateLine = '\n' + ("-" * 80 ) + '\n' SaveFile = open('Record.txt','w') SaveFile.write(' 학 생 : %s\n' % EncodingChange(Name)) for row in range(len(result)): SaveFile.write('%s' % SeperateLine) for col in range(len(result[row])): if col == 0: values = '[상담 일자] : ' + result[row][col] if col == 1: values = '[상담 선생님] : ' + result[row][col] if col == 2: values = '[상담 내용] : \n' + result[row][col]
SaveFile.write('%s\n' % values) SaveFile.close()
def PrintFile(): win32api.ShellExecute(0, "print", "Record.txt", None, ".", 0) pass
def DeleteFile(): #굳이 인쇄한 내용을 삭제할 필요를 못 느끼겠다. # os.remove("Record.txt") pass
class MyFrame(wx.Frame): def __init__( self, parent, ID, title, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE ):
wx.Frame.__init__(self, parent, ID, title, pos, size, style) self.SetTitle(title) def GetData(Frame, Name): Student = EncodingChange(Name) dbc = odbc.odbc("Driver={Microsoft Access Driver (*.mdb)};DBQ=%s;PWD=^^;여기는 비밀^^'"%(DB)) crsr = dbc.cursor() #돌겠다. 아랫줄 mssql 버그라는군... where 문의 인자를 single quote로 묶어줘야 된다는구만. 이것땜에 하루 꼬박 보냈잖아...-_- #영문검색을 생활화하자. parameter로 검색하니까 바로 나오잖어...-_- # crsr.execute("""SELECT \"상담일지.내용\", \"상담일지.교사\" """ + """ FROM \"상담일지\"""" + """ WHERE (((\"상담일지.교사\")=\'이우성 수학선생님\'));""") crsr.execute( """ SELECT 상담일지.날짜, 상담일지.교사, 상담일지.내용 FROM 수강생 INNER JOIN 상담일지 ON 수강생.수강생번호 = 상담일지.수강생번호 WHERE (((수강생.성명)=\'%s\')); """ % (Student) ) result = crsr.fetchall() # fetch the results all at once return result def ClearGrid(): pass def CopyDB(): rS = r'C:\\Program Files\\^^.mdb' DBFile = eval("'%s'" % rS) shutil.copyfile("C:\Program Files\^^.mdb", DBFile) return DBFile
def EncodingChange(SourceString): ReturnString = SourceString.encode('euc-kr') return ReturnString
DB = CopyDB()
wxApp = wx.App(False) frame = MyFrame(None, -1, DB) MyPanel(frame, -1) frame.Show() wxApp.MainLoop() ㅋㅋㅋ 스파게티 소스도 완전히 불어터진 놈이다...^^; 아, py2exe 를 이용해서 실행파일로 만들었는데 이건 py2exe를 실행하기 위한 setup.py 파일이다. # -*- coding: EUC-KR -*-
from distutils.core import setup import py2exe
#다음 코드를 소스파일이 있는 디렉토리에서 실행하시오. #python setup.py py2exe #setup(console=['Main.py'])
setup( options = {"py2exe": {"packages": ["encodings"]}}, console=["C:\Documents and Settings\YWS\My Documents\Eclipse_Workspace\ConsultationList\src\Main.py"] ) 그리고 여기는 내가 이번에 작업을 하면서 도움 받은 사이트들이다. py2exe.orgKoders - sqlite.pyPythonODBC
Datenbankzugriff mit den Win32 extensions - Sonstige Sprachen
@tutorials.de: Forum - Tutorials - Hilfe - Schulung & mehrADOdb for Python파이썬 마을 :: 주제 보기 - window의 odbc로 한글데이터를 읽을때 데이터가Python ODBC 연결하기 (Windows only)mxODBC - Python ODBC InterfaceSerpia: Python/MySQL tutorial
|