Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 20, 2007 17:27:34

FoxPython
От:
Зарегистрирован: 2007-09-15
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

shiza

shiza
Можно написать на питоне мааленький скриптик
Я не умею писать мааааленький скриптик. Я кроме фокспро ничего не знаю. Я питон еле-еле с горем пополам изучать начал понемножку (русскоязычной документации-то гулькин нос). :(

П.С. А древний досовский фокспро изучил по встроенной справке. Он русифицированный был.



Офлайн

#2 Сен. 20, 2007 17:32:10

FoxPython
От:
Зарегистрирован: 2007-09-15
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

ПОВТОР ВОПРОСА: Как НАПРОЧЬ выкинуть удалённые записи из файла базы данных, безвозвратно? А то он пухнет и пухнет, не взирая на DROP TABLE.

wxPyGridTableBase
Буду смотреть, кажись у меня даже по-русски чего-то есть на этот счёт.



Офлайн

#3 Сен. 20, 2007 17:40:41

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Sqlite+Python+wx.Python

VACUUM
Еще почитай про auto_vacuum



Офлайн

#4 Сен. 21, 2007 08:15:08

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

FoxPython
Я смотрю старые питонисты ничем не хотят вам помочь, только больше голову забивают)) Объясняю как чайник чайнику))))

1) Пример работы с гридом:

# -*- coding: cp1251 -*-

“Пример работы с гридом”

from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)

self.SetSize((550, 400))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)

self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)

self.exit = wxButton(self.panel2, -1, “Выход”)
self.exit.SetFont(font_1)

#создание грида
self.grid = wxGrid(self.panel1, -1, size=(1, 1))
self.grid.CreateGrid(100, 100)
self.grid.SetRowLabelSize(40)
self.grid.SetColLabelSize(40)
self.grid.SetMinSize((500,300))

self.grid.SetColLabelValue(0, “Столбец широкий”)
self.grid.SetColSize(0,200)
self.grid.SetColLabelValue(1, “Узкий”)
self.grid.SetColSize(1,50)


EVT_BUTTON(self, self.exit.GetId(), self.on_exit) # выход
EVT_GRID_CELL_CHANGE(self.grid, self.on_change) #событие на изменение данных в таблице на первой вкладке


self.panel1.SetMinSize((550, 370))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 400))

sizer = wxBoxSizer(wxVERTICAL) #сайзеры, на которых держатся элементы формы
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxVERTICAL)

sizer_1.Add(self.grid, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
sizer_2.Add(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)

self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()

def on_exit(self, event):
self.Destroy()

def on_change(self, event):
row = self.grid.GetGridCursorRow()
col = self.grid.GetGridCursorCol()
val = self.grid.GetCellValue(row,col)
print ‘Изменилась ячейка ’+str(row)+','+str(col)+'! Новое значение ‘+str(val)+’!'
event.Skip()

class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример Грида”)
self.SetTopWindow(frame)
frame.Show()
return 1

if __name__ == “__main__”:
app = MyApp(redirect=True)
app.MainLoop()


Попозже выложу пример работы с sqlite и dbf.



Офлайн

#5 Сен. 21, 2007 08:41:45

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

FoxPython
Вот тебе пример работы с sqlite, для его работы должен быть установлен сопряженный пакет pysqlite, в моем примере он называется pysqlite2.


# -*- coding: cp1251 -*-

“Пример работы с sqlite”

from pysqlite2 import dbapi2 as db

mydb = ‘mydb.db’

def pr1():
con = db.connect(mydb)
cur = con.cursor()
try:
cur.execute(“”“
create table my (
name varchar(40),
age integer);
”“”)
except db.DatabaseError, x:
print “Не могу создать базу!”, x
con.commit()
con.close()
return True

def pr2():
con = db.connect(mydb)
cur = con.cursor()
try:
cur.execute(“select * from my”)
print cur.fetchall()
except db.DatabaseError, x:
print “Не могу считать данные!”, x
con.commit()
con.close()
return True

if pr1():
print “База создана!”
if pr2():
print “Данные считаны!”



Отредактировано (Сен. 21, 2007 08:51:46)

Офлайн

#6 Сен. 21, 2007 13:40:02

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

FoxPython
А вот тебе еще и пример работы с dbf-файлами, только для этого нужно распаковать файлы dbf.py, binnum.py и strutil.py из пакета dbfpy.tgz в каталог с программой.


# -*- coding: cp1251 -*-

“”“Пример работы с dbf”“”

from dbf import *

mydbf = ‘mydbf.dbf’

class dbf_new:
#создание dbf-таблицы
debug=None
def __init__(self):
self.fields=
return None
def add_field(self,name,typ,len,dec=0):
self.fields.append()
def write(self,filename):
dbfh=DbfHeader()
dbfh.setCurrentDate()
for f in self.fields:
if f== ‘N’:
dbf_f=DbfNumericFieldDef()
dbf_f.decimalCount =f
elif f== ‘L’:
dbf_f=DbfLogicalFieldDef()
dbf_f.decimalCount =0
elif f== ‘D’:
dbf_f=DbfDateFieldDef()
dbf_f.decimalCount =0
f=8
else:
dbf_f=DbfCharacterFieldDef()
dbf_f.decimalCount =0
dbf_f.length=f
dbf_f.name=f
dbfh.addFieldDef(dbf_f)
dbfh.recordLength = dbfh.recordLength+dbf_f.length
dbfh.recordLength = dbfh.recordLength+1
dbfh.headerLength = 32+(32*len(dbfh.fieldNames))+1
dbfStream = open(filename,“wb”)
dbfh.writeOn(dbfStream)
dbfStream.close()

def new():
#Создание dbf файла
dbfn=dbf_new()
dbfn.add_field(“Name”,'C',40) #имя
dbfn.add_field(“Age”,'N',3,0) #возраст
dbfn.write(mydbf)
return True

def read():
dbft = Dbf()
dbft.openFile(mydbf, readOnly=0)
rec=DbfRecord(dbft)
for fldName in dbft.fieldNames(): # заносим данные
if fldName == “Name”:
rec = “Руссалина”
else:
rec = 20
rec.store()

for i in range(dbft.recordCount()): # читаем
rec = dbft
for fldName in dbft.fieldNames():
print str(fldName)+'='+str(rec)
dbft.close()
return True

if new():
print “Файл ”+str(mydbf)+“ создан!”
read()



Офлайн

#7 Сен. 22, 2007 17:40:35

FoxPython
От:
Зарегистрирован: 2007-09-15
Сообщения: 71
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

proDiva
Огромадное спасибо!

Только зачем для работы с SQLite нужен pysqlite2?
У меня питон 2.5
В нём встроенный модуль sqlite3.
Я пользуюсь им (import sqlite3 as db).
——————————————————————————————–
А как сделать чтобы объект-соединение с базой данных и курсор были глобально доступными из любого класса и любого места программы?

Боюсь, работать напрямую с dbf-файлами мне будет трудно. Изучить бы sqlite сперва А то, если буду заморачиваться ещё как с dbf через питон работать (какие команды выполняют индексирование, сканирование, замену значений полей по условию и т.д.), опухну с натуги ещё. А вот программка конвертер из sqlite в dbf и обратно не помешала бы. Мне главное итоговые файлы-отчёты в dbf-формате получить и заливать в базу sqlite файлы dbf, которые получены извне. Сама рабочая база может храниться в sqlite-формате.



Офлайн

#8 Сен. 22, 2007 20:59:21

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

FoxPython
Только зачем для работы с SQLite нужен pysqlite2?
У меня питон 2.5
В нём встроенный модуль sqlite3.
Я пользуюсь им (import sqlite3 as db).
Значит тебе повезло больше)) у меня питон 2.4 и этого модуля не было.
FoxPython
А как сделать чтобы объект-соединение с базой данных и курсор были глобально доступными из любого класса и любого места программы?
Я не знаю, что тебе посоветуют застарелые питонисты))) но я думаю, что нужно создавать соединение с базой внутри главного класса, от которого ты и будешь плясать свою программу (в моем случае это главная форма приложения, где и размещены кнопки, запускающие все операции). Если так, то создаешь соединение self.con = db.connect(mydb) внутри класса myclass, а из других классов уже можно будет создавать курсор curs = myclass.con.cursor(). Кажется так))



Офлайн

#9 Сен. 22, 2007 21:19:16

proDiva
От:
Зарегистрирован: 2007-02-15
Сообщения: 244
Репутация: +  0  -
Профиль   Отправить e-mail  

Sqlite+Python+wx.Python

FoxPython
А вот программка конвертер из sqlite в dbf и обратно не помешала бы.
можно попробовать)) не обещаю сразу, проверка на носу, работы много, но постараюсь:))



Офлайн

#10 Сен. 22, 2007 21:23:37

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Sqlite+Python+wx.Python

Все правильно.
Если мы о wxPython, то можно сделать

#module mainapp
app = None
class App(wx.PyApp):
def OnInit(self):

self.con = db.connect(mydb)
global app
app = self


#module myclass
import mainapp
class A(…):
def do_it(self):
curs = mainapp.app.con.cursor()
….



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version