wxPython:将 SQL 命令结果写入输出框

wxPython: write SQL command results to outputbox

我正试图回到 Python 并且我又一次被这个问题所困扰,这个问题是我之前遇到的使对象可以相互访问的问题。在这个简单的示例中,我将显示一个带有按钮和文本框的面板。单击文本框会调用查询数据库的函数和 returns 带有检索到的数据的游标。我需要这样做,以便 LookupSQL 函数或 ShowClientData 函数可以将此输出循环写入文本框。 TextBox (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() 

你要找的是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 引用文本框,您应该通过 self:

访问它

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

声明为全局是非常糟糕的!