Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 26, 2011 16:57:53

n2b
От:
Зарегистрирован: 2011-02-10
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

# -*- 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).

Подскажите где ошибка и как сделать такое обращение к переменной?



Офлайн

#2 Дек. 27, 2011 00:26:14

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

перечитайте топик http://python.su/forum/viewtopic.php?id=12767, зачем одно и тоже спрашивать



Офлайн

#3 Дек. 27, 2011 10:39:03

n2b
От:
Зарегистрирован: 2011-02-10
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

Он был давно, я был совсем глуп в питоне, сейчас поумнел немного и все равно я не вижу там решения моей проблемы в обозначении глобальной переменнной или вытаскивания её из другого модуля.



Офлайн

#4 Дек. 28, 2011 01:39:33

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

n2b
сейчас поумнел немного и все равно я не вижу
Ответ в 10-ом посте приведенного выше топика, Вам просто нужно его слегка поправить



Офлайн

#5 Дек. 28, 2011 16:56:43

n2b
От:
Зарегистрирован: 2011-02-10
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

pyuser
Ответ в 10-ом посте приведенного выше топика, Вам просто нужно его слегка поправить
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.

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

Собственно именно поэтому я хочу connection сделать глобальной и обращаться к ней из всех модулей программы.
Кстати, по этой же схеме есть еще один косяк, с получением таблицы и схемы. Если дадите ответ на вопрос про connection, спрошу про возвращение таблицы и схемы, но мне кажется что решение будет одинаковым.



Офлайн

#6 Дек. 29, 2011 04:38:02

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

n2b
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.
, а что мешает создать и вернуть connection?
Сделайте cjnnection свойством главного окна приложения, получите его один раз с помощью Вашего диалога, а потом передавайте его всем нуждающимся как параметр



Офлайн

#7 Дек. 29, 2011 10:54:15

n2b
От:
Зарегистрирован: 2011-02-10
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

pyuser
n2b
В 10 посте ответ содержит функцию, постоянно получающую логин, пасс и тнс и возврающая список из этих данных.
, а что мешает создать и вернуть connection?
Создать и вернуть connection в функции нельзя, поскольку потом к ней буду обращаться 100500 раз и каждый раз эта функция будет открывать коннект к базе данных и ТНС рухнет… =\
pyuser
Сделайте cjnnection свойством главного окна приложения, получите его один раз с помощью Вашего диалога, а потом передавайте его всем нуждающимся как параметр
Вот именно этого я и не понимаю как сделать…



Отредактировано (Дек. 29, 2011 10:55:45)

Офлайн

#8 Дек. 29, 2011 23:38:39

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

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 ---



Отредактировано (Дек. 30, 2011 00:01:33)

Офлайн

#9 Янв. 4, 2012 18:18:26

n2b
От:
Зарегистрирован: 2011-02-10
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

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

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

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

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

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

Пользователь вводит данные для создания подключения.
В этой же форме я могу создать это подключение с введенными данными. Далее это подключение(переменную self.connection) сделать ГЛОБАЛЬНОЙ для всех модулей. Чтобы я могу оперировать этой переменной в любом модуле (не создавать заного коннектион, что приводит к завалу TNS'a оракловского, а использовать открытый connection).



Отредактировано (Янв. 4, 2012 18:25:50)

Офлайн

#10 Янв. 5, 2012 02:13:44

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

wx.Python, wx.Dialog

n2b
Пользователь вводит данные для создания подключения.
В этой же форме я могу создать это подключение с введенными данными. Далее это подключение(переменную self.connection) сделать ГЛОБАЛЬНОЙ для всех модулей. Чтобы я могу оперировать этой переменной в любом модуле (не создавать заного коннектион, что приводит к завалу TNS'a оракловского, а использовать открытый connection).
Именно это я Вам и показал, если Вы этого не видите - извините, как показать еще доходчивей - я не знаю.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version