Der Versuch, ein Python 3-Programm zum Anzeigen und Bearbeiten von Daten aus einer Postgresql-Datenbank einzurichten. Der angehängte Code ist ein vereinfachtes "hartcodiertes" Beispiel dessen, was ich versuche (tatsächlich mit einer äquivalenten Gtk.Builder-Konstruktion.) Ohne die Anweisung "set_text" wird das Vcard-Fenster genau so angezeigt, wie ich es möchte.Wie füttere ich (Postgresql) Daten in GTK-Eingabefelder?
Hier ist die Trace-Back:
$ python3 Q1.py
Database connection closed.
Record(vindex=5, prefix='Mrs D ', firstname='Nona', addnlnames=None, surname='***', suffix=None, nickname=None, kind='private', bday=None, anniversary=None, gender=None, workpobox=None, workaddr2=None, workaddr=None, workcity=None, workstate=None, workpostcode=None, workcountry=None, homepobox=None, homeaddr2=None, homeaddr='********', homecity='****', homestate=None, homepostcode='BT** ***', homecountry='N Ireland', worktel=None, hometel='02870 ******', faxtel=None, pagertel=None, mobiletel='07931 ******', email1=None, email2=None, title=None, workrole=None, workdept=None, workorg=None, rev=None, notes=None, webpage=None, orgwebpage=None)
Traceback (most recent call last):
File "Q1.py", line 92, in <module>
y = displaydata(x)
File "Q1.py", line 81, in displaydata
Vcard.prefixentry.set_text(xstr(c['prefix']))
AttributeError: type object 'Vcard' has no attribute 'prefixentry'
Hier ist der Code:
#!/usr/bin/python3
import sys
from collections import deque
import psycopg2
import psycopg2.extras
from outputvcard import *
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
c = {}
version = "2.1"
buffer = deque([])
lastname = "Bell"
def readacard(lastname, cc):
conn = psycopg2.connect("dbname='contacts' user='postgres'")
cur = conn.cursor(cursor_factory = psycopg2.extras.NamedTupleCursor)
cur.execute("SELECT * from vcardata where surname = %s", [lastname])
cc = cur.fetchone()
cur.close()
conn.close()
print('Database connection closed.')
return cc;
class Vcardclass(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.Window.__init__(self, title="Vcard editor", application=app)
self.set_title("Vcard editor")
self.set_default_size(300, 600)
self.connect("destroy", Gtk.main_quit)
self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
self.add(self.vbox)
self.swin = Gtk.ScrolledWindow(expand=True)
self.swin.set_policy(Gtk.PolicyType.ALWAYS, Gtk.PolicyType.ALWAYS)
self.swin.set_vadjustment
self.vbox.add(self.swin)
self.grid = Gtk.Grid(orientation=Gtk.Orientation.VERTICAL)
self.swin.add(self.grid)
self.prefixlabel = Gtk.Label("Prefix")
self.prefixentry = Gtk.Entry()
self.grid.attach(self.prefixlabel, 0, 0, 1, 1)
self.grid.attach(self.prefixentry, 1, 0, 1, 1)
self.prefixentry.set_text(xstr(c['prefix']))
self.firstnamelabel = Gtk.Label("First name")
self.firstnameentry = Gtk.Entry()
self.grid.attach_next_to(self.firstnamelabel, self.prefixlabel, Gtk.PositionType.BOTTOM, 1,1)
self.grid.attach_next_to(self.firstnameentry, self.prefixentry, Gtk.PositionType.BOTTOM, 1,1)
"""
lots more like that
"""
class Vcard(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
window = Vcardclass(self)
window.show_all()
def do_startup(self):
Gtk.Application.do_startup(self)
app = Vcard()
def xstr(s):
if s is None:
return ''
else:
return s
def displaydata(c):
print (c)
Vcard.prefixentry.set_text(xstr(c['prefix']))
Vcard.firstnameentry.set_text(xstr(c['firstname']))
"""
lots more like that
"""
x = readacard(lastname, c)
#print (x)
y = displaydata(x)
x = outcard(version, c, buffer)
i = len(buffer)
outfile = 'out.vcf'
f = open(outfile, 'w')
while i > 0:
f.write(buffer.popleft() + "\n")
i = i - 1
f.close
exit_status = app.run(sys.argv)
sys.exit(exit_status)
Vielen Dank für Ihre Eingabe Graeme
nicht verstehen, Sie zu beleidigen, aber Ihr Code ist schlecht gestaltet. Möchten Sie eine Anfängerversion von Gtk, Python und Postgresql? Oder verwenden Sie absichtlich erweiterte Python/Gtk-Methoden? – theGtknerd
Als Anfänger zu Python, obwohl nicht ohne Erfahrung in anderen Computersprachen, versuche ich Tutorials auf verschiedenen Websites zu verstehen und eine Anwendung inkrementell zu erstellen. . Momentan mache ich mir keine Sorgen über Ausnahmen, aber ich begrüße Kommentare zur Verbesserung des Designs. Insbesondere muss ich verstehen, warum eine Instanz von Vcardclass nicht erkannt wird und wie set_text und get_text zum Anzeigen und Ändern von Daten verwendet werden. Ich verwende Gtk.Builder wegen seiner WYSIWYG-Fähigkeit. – ggemmill