hallo tabellar,
also ich habe mich soweit ich konnte mit deinem code auseinandergesetzt und mir ist da einiges aufgefallen, was wir besprechen sollten,....
1. tablewrapper: import anweisungen würde ich hier machen:
Code: Alles auswählen
if DbType=='MySQL':
import mysqlDAO
self.dbWrapper=mysqlDAO.MySqlDAO()
self.dbWrapper.connect(Host,User,Db,Passwd)
es ist nicht so sinnvoll alle schnittstellen automatisch zu importieren.
2. db_client, es braucht meiner meinung nach auf jeden fall auch die ermitllung der aktuellen tabelle, sonst wird es schwierig die daten auszugeben, in deinem beispiel geht das nur weil du eine konstante verwendest:
Code: Alles auswählen
def getTableColumnsData(self):
cur=self.con.cursor()
sql="""SELECT * from tfoo;"""
cur.execute(sql)
pgresult=cur.fetchall()
tfoo ist gemeint
daher:
Code: Alles auswählen
def __init__(self):
""",host,user,db,db_table,passwd=''"""
self.root=Tk()
self.root.wm_geometry('+20+20')
self.prepare()
self.root.title("Hauptfenster")
#instantiierung DbWrapper...
self.tablewrapper=tableWrapper.TableWrapper()
# Manuelle Datenbankauswahl via Angabe
# des Datenbanktyps: (später durch Dialogauswahl...)
# PgSQL
# MySQL
# XML
self.tablewrapper.connect('MySQL','localhost','ein user','eine db','ein passwort')
#tabellen ermitteln
self.db_tables=self.tablewrapper.getTableNameList()
#erste tabelle als default verwenden, später kann diese variable ueber das auswahlfenster neu gesetzt werden
self.db_table=self.db_tables[0]
self.cols_names=self.tablewrapper.getTableColumnsList(self.db_table)
die tabelle self.db_table muss für diverse anweisungen übergeben werden.
mein nicht fertiges mysqlDAO sieht momentan so aus:
Code: Alles auswählen
import MySQLdb
from _mysql_exceptions import *
class MySqlDAO:
def __init__(self):
"""..."""
def connect(self,host,user,db,passwd=''):
self.db=db
try:
self.conn=MySQLdb.connect(host=host,
user=user,
db=db,
passwd=passwd)
except OperationalError, msg:
print msg[1]
def getTableNameList(self):
cur=self.conn.cursor()
cur.execute("show tables from %s"%self.db)
result=cur.fetchall()
tableNameList=[]
for i in result:
tableNameList.append(i[0])
return tableNameList
def getTableColumnsList(self,db_table):
cur=self.conn.cursor()
cur.execute("show columns from %s"%db_table)
result=cur.fetchall()
tableColList=[]
for i in result:
if 'auto_increment' not in i:
tableColList.append(i[0])
return tableColList
def getTableColumnsData(self,action,db_table):
action=action%db_table
cursor=self.conn.cursor()
cursor.execute(action)
result=cursor.fetchall()
cursor.close()
return result
def insertTableColumnsData(self,action):
cursor=self.conn.cursor()
cursor.execute(action)
cursor.close()
def close(self):
self.conn.close()
prinzipiell arbeite ich ja auch noch an der alten fassung, die bereits tabellen wechseln kann, es scheint sinnvoll den db_client, das hauptfenster so zu gestalten:
Code: Alles auswählen
class HauptFenster(Fenster):
lt="Ausgabe"
def __init__(self,host,user,db,passwd=''):
self.root=Tk()
self.root.wm_geometry('+20+20')
self.prepare()
self.root.title("Hauptfenster")
self.database=MySqlApi(host,user,db,passwd)
if self.database.table_number>1:
auswahl=AuswahlFenster(self,self.root,self.database.db_tables)
self.choice=StringVar()
self.db_table=self.database.db_table
self.db_table_cols=self.database.db_table
self.cols_names=self.database.cols_names
self.s_cols_names=", ".join(self.cols_names)
self.li_1width=len(self.cols_names)*12
# das ist es um was es geht, frames, die spaeter einzeln neu gesetzt werden koennen.
self.frame_1=Frame(self.root)
self.frame_1.grid(row=2,column=0,columnspan=2)
self.set_frame_1()
self.frame_2=Frame(self.root)
self.frame_2.grid(row=5,column=0,columnspan=2)
self.set_frame_2()
self.frame_3=Frame(self.root)
self.frame_3.grid(row=9,column=1)
self.set_frame_3()
def set_frame_1(self):
self.scb_v=Scrollbar(self.frame_1, orient="vertical")
self.scb_h=Scrollbar(self.frame_1, orient="horizontal")
self.li_1=Listbox(self.frame_1,
width=self.li_1width,height=8,
yscrollcommand=self.scb_v.set,
xscrollcommand=self.scb_h.set)
self.scb_v["command"]=self.li_1.yview
self.scb_h["command"]=self.li_1.xview
self.li_1.grid(row=3,column=0,
columnspan=2,
padx=self.a_x,pady=self.a_y)
self.scb_v.grid(row=3,column=2,
padx=self.a_x,pady=self.a_y)
self.scb_h.grid(row=4,column=0,
columnspan=2,
padx=self.a_x,pady=self.a_y)
def set_frame_2(self):
b_1=Button(self.frame_2,width=self.b,text="Alle Daten",
command=lambda:
self.list_data
(result=self.database.get_data
("select %s from %s"%(self.s_cols_names,self.db_table))))
b_1.grid(row=6,column=0,
padx=self.a_x,pady=self.a_y)
b_2=Button(self.frame_2,width=self.b,
text="Loeschen",command=self.ask)
b_2.grid(row=6,column=1,
padx=self.a_x,pady=self.a_y)
b_3=Button(self.frame_2,width=self.b,text="Sortieren",
command=lambda:
self.list_data
(result=self.database.get_data
("select %s from %s order by %s"%(self.s_cols_names,self.db_table,self.choice.get()))))
b_3.grid(row=7,column=0,
padx=self.a_x,pady=self.a_y)
b_4=Button(self.frame_2,width=self.b,text="Eingabe",
command=lambda:
EingabeFenster
(self.frame_2,self.database,
self.db_table,self.cols_names,
self.root.winfo_width()))
b_4.grid(row=7,column=1,
padx=self.a_x,pady=self.a_y)
b_5=Button(self.frame_2,width=self.b,text="Suchen",
command=lambda:
SuchFenster
(self,self.root,self.database,self.db_table))
b_5.grid(row=8,column=0,
padx=self.a_x,pady=self.a_y)
b_6=Button(self.frame_2,width=self.b,text="Bearbeiten",
command=lambda:
BearbeitungsFenster
(self.root,self.database,
self.db_table,self.cols_names,
self.li_1.get("active"),
self.root.winfo_width()))
b_6.grid(row=8,column=1,padx=self.a_x,pady=self.a_y)
def set_frame_3(self):
for i in range(len(self.cols_names)):
self.rb=Radiobutton(self.frame_3,text=self.cols_names[i],
value=self.cols_names[i],
variable=self.choice)
self.rb.grid(row=i+9,column=1,
padx=self.a_x,pady=self.a_y)
if i==0:
self.rb.select()
self.list_data(result=self.database.get_data("select %s from %s"%(self.s_cols_names,self.db_table)))
#usw.
auch habe ich mir ueberlegt gewisse dinge vielleicht doch im konstruktor zu setzen, z.b. im tablewrapper den datenbanktyp
das mit der übergabe von attributen ist net so einfach, will man dein ziel umsetzen einen uni db client zu haben.
Code: Alles auswählen
b_1=Button(self.root,width=self.b,text="Alle Daten",
command=lambda:
self.list_data(self.tablewrapper.getTableColumnsData(action,self.db_table))
die auszuführende anweisung (action) und die betreffende tabelle (self.db_table) müssen hier übergeben werden, aber woher nehmen???
die tabelle ist klar, aber die action, da hirne ich noch
so, das waren mal die wichtigsten überlegungen für den moment, ich mach mal weiter,
bis bald,
wollte einfach auch mal ein lebenszeichen geben,
rolgal