2017-03-01 5 views
0

저는 파이썬으로 돌아가려고 노력하고 있습니다. 이전에이 객체에 접근 할 수있게 해 놓았던이 문제에 다시 한번 매달 렸습니다. 이 간단한 예제에서는 버튼과 텍스트 상자가있는 패널을 표시하고 있습니다. 텍스트 상자를 클릭하면 데이터베이스를 쿼리하고 검색된 데이터와 함께 커서를 반환하는 함수가 호출됩니다. LookupSQL 함수 또는 ShowClientData 함수 중 하나가이 출력을 텍스트 상자에 루프로 쓸 수 있도록해야합니다. TextBox (outputBox)는 현재 다른 모든 함수에서 알 수 없습니다. 다른 기능이 무엇인지 알 수 있도록 어떻게 만들 수 있습니까?wxPython : 출력 상자에 SQL 명령 결과를 입력하십시오.

import wx 
import pypyodbc 
conn = pypyodbc.connect(driver='{SQL Server}', server='.', database='TheDB', uid='sa', pwd='Pass') 


class Audit(wx.Frame): 

def __init__(self, *args, **kwargs): 
    super(Example, self).__init__(*args, **kwargs) 

    self.InitUI() 

def InitUI(self):  

    panel = wx.Panel(self) 

    hbox = wx.BoxSizer() 
    sizer = wx.GridSizer(6,1,2,2) 

    btn1 = wx.Button(panel, label='Clients') 

    outputBox = wx.TextCtrl(panel, -1, style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) 
    sizer.AddMany([btn1, btn2, btn3, btn4, btn5, btn6]) 

    hbox.Add(sizer, 0, wx.ALL, 15) 
    hbox.Add(outputBox, 1, wx.EXPAND) 


    panel.SetSizer(hbox) 

    btn1.Bind(wx.EVT_BUTTON, self.ShowClientData) 

    self.SetSize((800, 600)) 
    self.SetTitle('Audit View') 
    self.Centre() 
    self.Show(True) 


def ShowClientData(self, event): 
    SQL = 'select * from V_UpdatedClient' 
    recursor = lookupSQL(SQL) 
    for row in recursor: 
     rChange = row[0] 
     rItemType = row[1] 
     rPK = row[2] 
     rItemCode = row[3] 
     rFieldName = row[4] 
     rOldValue = row[5] 
     rNewValue = row[6] 
     rUpdateDate = row[7] 
     rUserName = row[8] 
     print('%s %s %s %s %s %s %s %s %s' % (rChange, rItemType, rPK, rItemCode, rFieldName, rOldValue, rNewValue, rUpdateDate, rUserName)) 


def lookupSQL(SQLString):  
    cursor = conn.cursor() 
    cursor.execute(SQLString) 

    return cursor   
    cursor.close() 


def main(): 

    ex = wx.App() 
    Audit(None) 
    ex.MainLoop()  


if __name__ == '__main__': 
    main() 

답변

1

찾고있는 것은 data attributes입니다.

self.outputBox = wx.TextCtrl(panel, -1, style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) 

그리고 ShowClientData 내에서 당신은 당신이 self 참조, 당신은 그 속성에 액세스 할 수 있습니다로

self.outputBox.AppendText("some text")

를 작성할 수 있습니다.

편집 :

위의 변경 작업을 수행 할 때, 당신은 더 이상 단지 outputBox하여 텍스트 상자를 참조 할 수 없습니다, 대신 자기를 통해 액세스해야합니다

hbox.Add(self.outputBox, 1, wx.EXPAND)

을 선언 전 세계적으로 매우 나쁜 것처럼!

+0

ShowClientData는 self로 정의되고 호출 될 때 여전히 인식하지 못합니다. 나가서 설명하자면 NameError : 이름이 'outputBox은' 내가 세계로 outputBox 선언 시도 정의, 그리고 그 일을,하지만 난 내 편집, 당신은 자기를 통해'outputBox'에 액세스해야보기 좋습니다 – pickarooney

+0

확실하지 않다, 그래서 있는지 확인되지 사용되는 곳마다 변경하십시오. –

+0

은 여전히 ​​오류가 발생합니다. self.outputBox.WriteText ('% s % s % s % s % s % s % s % s % s % s % n'% (rChange, rItemType, rPK, rItemCode, rFieldName, rOldValue, rNewValue , rUpdateDate, rUserName)) NameError : name 'self'가 정의되지 않았습니다. LookupSQL이 자체로 정의되어 있지 않기 때문에 – pickarooney