Найти - Пользователи
Полная версия: wx.Python, wx.Dialog
Начало » GUI » wx.Python, wx.Dialog
1 2 3
n2b
# -*- 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 OnCancelBtn(self, event):
self.Destroy()
Как можно обратиться к переменной self.connection из другого модуля?
Т.е. это описано в модуле db_info.
А мне нужно получить connection в модуле data_info.
Я делаю так: db_info.db_info().connection - не работает, пишет что нет такой переменной в этом модуле(db_info).

Подскажите где ошибка и как сделать такое обращение к переменной?
pyuser
перечитайте топик http://python.su/forum/viewtopic.php?id=12767, зачем одно и тоже спрашивать
n2b
Он был давно, я был совсем глуп в питоне, сейчас поумнел немного и все равно я не вижу там решения моей проблемы в обозначении глобальной переменнной или вытаскивания её из другого модуля.
pyuser
n2b
сейчас поумнел немного и все равно я не вижу
Ответ в 10-ом посте приведенного выше топика, Вам просто нужно его слегка поправить
n2b
pyuser
Ответ в 10-ом посте приведенного выше топика, Вам просто нужно его слегка поправить
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.

В моем случае мне необходимо вернуть connection cx оракла. Да, я реализовал функцию которая делает connection = db.Open_DB(dblogin, dbpass, dbtns) и в этом случае при КАЖДОМ обращении к функции(а их не мало) я получаю НОВЫЙ открытый connection к прослушивателю оракла - TNS, в следствии чего он падает, так как количество коннектов зашкаливает за разумный предел.

Собственно именно поэтому я хочу connection сделать глобальной и обращаться к ней из всех модулей программы.
Кстати, по этой же схеме есть еще один косяк, с получением таблицы и схемы. Если дадите ответ на вопрос про connection, спрошу про возвращение таблицы и схемы, но мне кажется что решение будет одинаковым.
pyuser
n2b
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.
, а что мешает создать и вернуть connection?
Сделайте cjnnection свойством главного окна приложения, получите его один раз с помощью Вашего диалога, а потом передавайте его всем нуждающимся как параметр
n2b
pyuser
n2b
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.
, а что мешает создать и вернуть connection?
Создать и вернуть connection в функции нельзя, поскольку потом к ней буду обращаться 100500 раз и каждый раз эта функция будет открывать коннект к базе данных и ТНС рухнет… =\
pyuser
Сделайте cjnnection свойством главного окна приложения, получите его один раз с помощью Вашего диалога, а потом передавайте его всем нуждающимся как параметр
Вот именно этого я и не понимаю как сделать…
pyuser
n2b
Создать и вернуть connection в функции нельзя, поскольку потом к ней буду обращаться 100500 раз
Зачем? Есть диалог подключения к базе и он, если я все правильно понимаю, вызывается один раз, т.е. я предлагаю следующее:
# псевдокод
# --- module mainform.py ---
import createconnection
import newrecord

class MainForm:
def __init__(self):
...
self.db = None
...

def get_connection(self):
if self.db is None:
self.db = createconnection.create_connection()
return self.db

def add_record(self):
newrecord.add_record(db)
# --- end module ---

# --- module createconnection.py ---
class Connection:
# пользователь вводит все необходимое для создания подключения
...

def create_connection():
connection = None
dlg = Connection()
if wx.ID_OK == dlg.ShowModal():
connection = # создаем подключение
dlg.Destroy()
return connection
# --- end module ---

# --- module newrecord.py ---
class NewRecord:
# пользователь вводит все необходимое
...

def add_record(db):
dlg = NewRecord()
if wx.ID_OK == dlg.ShowModal():
rs = db.cursor()
rs.execute("INSERT ....")
db.commit()
dlg.Destroy()
# --- end module ---
n2b
class NewRecord:
# пользователь вводит все необходимое

class Connection:
# пользователь вводит все необходимое для создания подключения

Непонятно. Зачем пользователю ДВА раза вводить данные?

А, понял. Нет.

Давайте я еще раз всё объясню:

Пользователь вводит данные для создания подключения.
В этой же форме я могу создать это подключение с введенными данными. Далее это подключение(переменную self.connection) сделать ГЛОБАЛЬНОЙ для всех модулей. Чтобы я могу оперировать этой переменной в любом модуле (не создавать заного коннектион, что приводит к завалу TNS'a оракловского, а использовать открытый connection).
pyuser
n2b
Пользователь вводит данные для создания подключения.
В этой же форме я могу создать это подключение с введенными данными. Далее это подключение(переменную self.connection) сделать ГЛОБАЛЬНОЙ для всех модулей. Чтобы я могу оперировать этой переменной в любом модуле (не создавать заного коннектион, что приводит к завалу TNS'a оракловского, а использовать открытый connection).
Именно это я Вам и показал, если Вы этого не видите - извините, как показать еще доходчивей - я не знаю.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB