Скидываю код как сейчас реализовано, т.е. щас все работает. Но ведь хочется чтобы правильно работало!
data_info:
# -*- coding: windows-1251 -*-
import wx
import db_info
import msgbox
import db
import log
class data_info(wx.Frame):
def __init__(self, parent=None):
style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_TOOL_WINDOW
wx.Frame.__init__(self, None, -1, style=style, title='Выберите схему и таблицу',
size=(180, 150))
self.panel = wx.Panel(self, -1, pos=(1,1), size=(400, 50))
wx.Frame.Center(self)
wx.Frame.IsActive(self)
wx.Frame.SetFocus(self)
self.dbdata = db_info.db_info().dbdata()
self.schemasList = db.Get_DB_Schemas(self.dbdata[0], self.dbdata[1], self.dbdata[2])
self.Schema = wx.StaticText(self.panel, -1, "Выберите схему:", pos=(1, 1))
self.ChoiceSchema = wx.Choice(self.panel, -1, size=(165,10), pos=(1,20), choices=[i[0] for i in self.schemasList])
self.SelSchema = self.ChoiceSchema.GetStringSelection()
self.tablesList = db.Get_DB_Tables(self.dbdata[0], self.dbdata[1], self.dbdata[2], self.SelSchema)
self.Table = wx.StaticText(self.panel, -1, "Выберите таблицу:", pos=(1,50))
self.ChoiceTable = wx.Choice(self.panel, -1, size=(165,10), pos=(1,70), choices=[i[0] for i in self.tablesList])
self.ChoiceTable.Disable()
self.OKBtn = wx.Button(self.panel, -1, "OK", pos=(1,100))
self.Bind(wx.EVT_BUTTON, self.OnOKBtn, self.OKBtn)
self.OKBtn.Disable()
self.CancelBtn = wx.Button(self.panel, -1, "Отмена", pos=(90,100))
self.Bind(wx.EVT_BUTTON, self.OnCancelBtn, self.CancelBtn)
self.ChoiceSchema.Bind(wx.EVT_CHOICE, self.OnChoiceSchema)
self.ChoiceTable.Bind(wx.EVT_CHOICE, self.OnChoiceTable)
def OnChoiceSchema(self, event):
self.ChoiceTable.Enable()
self.SelSchema = self.ChoiceSchema.GetStringSelection()
#info = (u'Схема: %s' % (self.SelSchema))
#log.wLog(info)
self.tablesList = db.Get_DB_Tables(self.dbdata[0], self.dbdata[1], self.dbdata[2], self.SelSchema)
self.tables=[i[0] for i in self.tablesList]
self.ChoiceTable.SetItems(self.tables)
def OnChoiceTable(self, event):
self.SelTable = self.ChoiceTable.GetStringSelection()
#info = (u'Таблица: %s' % (self.SelTable))
#slog.wLog(info)
self.OKBtn.Enable()
def OnOKBtn(self, event):
global SelTable, SelSchema
SelTable = self.ChoiceTable.GetStringSelection()
SelSchema = self.ChoiceSchema.GetStringSelection()
self.Close()
def OnCancelBtn(self, event):
self.Destroy()
def Get_Table(self):
try:
Table=SelTable
return Table
except NameError, info:
error = "Вы не выбрали таблицу"
msgbox.Error(error)
def Get_Schema(self):
try:
Schema=SelSchema
return Schema
except NameError, info:
error = "Вы не выбрали схему"
msgbox.Error(error)
db_info
# -*- coding: windows-1251 -*-
import wx
import db
import msgbox
import cx_Oracle
class db_info(wx.Dialog):
def __init__(self):
# инициализация
style=wx.FRAME_TOOL_WINDOW | wx.CLOSE_BOX
wx.Dialog.__init__(self, None, -1, style=style, title='Информация для присоединения к базе',
size=(100,200))
wx.Dialog.SetFocus(self)
#panel = wx.Panel(self, -1)
# Атрибуты
login = wx.StaticText(self, -1, "Login:", pos=(1,1))
self.loginTxt = wx.TextCtrl(self, -1, "artur", pos=(1,15))
tns = wx.StaticText(self, -1, "TNS:", pos=(1,40))
self.tnsTxt = wx.TextCtrl(self, -1, "orcl", pos=(1,55))
self.loginTxt.SetInsertionPoint(0)
passw = wx.StaticText(self, -1, "Password:", pos=(1,80))
self.passwTxt = wx.TextCtrl(self, -1, "123", pos=(1,100),
style=wx.TE_PASSWORD)
# Кнопки
self.ConnectBtn = wx.Button(self, wx.ID_OK, "Присоединится", pos=(1, 125))
self.Bind(wx.EVT_BUTTON, self.OnConnectBtn, self.ConnectBtn)
self.ConnectBtn.SetDefault()
self.CancelBtn = wx.Button(self, wx.ID_CANCEL, "Отмена", pos=(2, 150))
self.Bind(wx.EVT_BUTTON, self.OnCancelBtn, self.CancelBtn)
def OnConnectBtn(self, event):
global dblogin, dbpass, dbtns
dblogin = (self.loginTxt.GetValue())
dbpass = (self.passwTxt.GetValue())
dbtns = (self.tnsTxt.GetValue())
self.connection = db.OpenDB(dblogin, dbpass, dbtns)
self.Close()
def dbdata(self):
dbdata = (dblogin, dbpass, dbtns)
return dbdata
def OnCancelBtn(self, event):
self.Destroy()
data_info - один из модулей где нужна переменная connection
db_info - модуль где форма для ввода данных.
Кстати, функции Get_table и Get_Schema написаны ТОЛЬКО потому что если обращаться к переменной self.SelTable - то эта переменная ТОЖЕ пуста, т.е. выбрал таблицу и схему, нажал ОК, и всё, в любой другой форме где нужна переменная self.SelTable - я не могу к ней обращаться, компилятор пишет что такой переменной НЕТ! А обращаясь к функциям которые я написал, программа почему то опять делает запрос, опять получает весь список таблиц и только потом получает нужную таблицу, почему - тоже не понимаю…
Вот функции из модуля db:
# -*- coding: windows-1251 -*-
import cx_Oracle
import msgbox
from itertools import chain
def OpenDB(dblogin,dbpass,dbtns):
try:
import cx_Oracle
except ImportError,info:
error = ("Import Error: %s" % (info))
msgbox.Error(error)
exit()
if cx_Oracle.version<'3.0':
error = ("Very old version of cx_Oracle : %s" % (cx_Oracle.version))
msgbox.Error(error)
exit()
try:
connection = cx_Oracle.connect("%s/%s@%s" % (dblogin, dbpass, dbtns))
except cx_Oracle.DatabaseError, info:
error = ("Database Error: %s" % (info))
msgbox.Error(error)
exit()
return connection
def Get_DB_Schemas(dblogin, dbpass, dbtns):
zconnection = cx_Oracle.connect("%s/%s@%s" % (dblogin, dbpass, dbtns))
cursor = cx_Oracle.Cursor(connection)
sql_sel = "select USERNAME from dba_users"
cursor.execute(sql_sel)
schemas = cursor.fetchall()
return schemas
cursor.close()
def Get_DB_Tables(dblogin, dbpass, dbtns, SelSchema):
connection = cx_Oracle.connect("%s/%s@%s" % (dblogin, dbpass, dbtns))
cursor = cx_Oracle.Cursor(connection)
sql = ("select TABLE_NAME from dba_tables WHERE OWNER = '%s'" % (SelSchema))
cursor.execute(sql)
tables = cursor.fetchall()
return tables
cursor.close()
def Get_Data(connection, Table, Schema):
cursor = cx_Oracle.Cursor(connection)
sql = ("select * from %s.%s" % (Schema, Table))
cursor.execute(sql)
data = cursor.fetchall()
cursor.close()
data = list(chain(*data))
data = len(data)
return data