2017-03-01 108 views
0

我试图重新进入Python和我再次坚持了这个问题,我让彼此访问的对象以前吃过。在这个简单的例子,我显示与一个按钮和一个文本框的面板。点击文本框调用其查询数据库,并返回检索到的数据光标的功能。我需要让这个无论是LookupSQL功能或ShowClientData功能可以写这个输出,在一个循环,到文本框。当前任何其他函数都不知道TextBox(outputBox)。我如何使其他功能知道它是什么?的wxPython:编写SQL命令结果outputbox

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.outputBox.AppendText("some text")

只要你有self参考,您可以访问它的属性。

编辑:

当你做对上述变化,你不能指由刚outputBox文本框了,你应该不是通过自我访问:

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

声明它因为全球非常糟糕!

+0

ShowClientData还是当它的定义,并要求自不承认它。 NameError:名字“outputBox”没有定义 我试着声明outputBox全球,而工作,但我不知道这是很好的做法 – pickarooney

+0

见我的编辑,你应该通过自助访问'outputBox',所以作出这样的改变它在哪里使用。 –

+0

仍然收到错误 self.outputBox.WriteText( '%s%S%S%S%S%S%S%S%S \ n' %(rChange,rItemType,RPK,rItemCode,rFieldName,rOldValue,rNewValue ,rUpdateDate,rUserName)) NameError:名字“自我”是没有定义 – pickarooney