2017-04-23 2 views
0

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

+0

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

+0

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

Antwort

0

Hier ist eine einfache Anwendung, die Sie zu erhalten begonnen .

Python:

import gi 
gi.require_version('Gtk', '3.0') 
from gi.repository import Gtk, GdkPixbuf, Gdk 
import os, sys, psycopg2 

class GUI: 
    def __init__(self): 

     self.builder = Gtk.Builder() 
     self.builder.add_from_file('app.ui') 
     self.builder.connect_signals(self) 

     try: 
      conn = psycopg2.connect("dbname='contacts' user='postgres'") 
      self.cur = conn.cursor(cursor_factory = psycopg2.extras.NamedTupleCursor) 
     except Exception, e: 
      print e 

     window = self.builder.get_object('window') 
     window.show_all() 

    def on_window_destroy(self, window): 
     Gtk.main_quit() 

    def button_clicked (self, button): 
     self.cur.execute("SELECT * from vcardata where surname = %s", [lastname]) 
     cc = self.cur.fetchone()[0] 
     self.builder.get_object('entry1').set_text(str(cc)) 

def main(): 
    app = GUI() 
    Gtk.main() 

if __name__ == "__main__": 
    sys.exit(main()) 

Glade-Datei mit dem Namen app.ui:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.0"/> 
    <object class="GtkWindow" id="window"> 
    <property name="visible">True</property> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">window</property> 
    <property name="default_width">500</property> 
    <property name="default_height">400</property> 
    <signal name="destroy" handler="on_window_destroy" swapped="no"/> 
    <child> 
     <object class="GtkBox" id="box1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkEntry" id="entry1"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">Click here to run SQL command</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <signal name="clicked" handler="button_clicked" swapped="no"/> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Fühlen Sie sich frei, um Erläuterungen zu fragen, auf alles, was Sie nicht

+0

Vielen Dank für meinen "Starter für 10". Ich habe daran gearbeitet, um mein grundlegendes GUI-Fenster anzuzeigen, aber ich habe zu viel Zeit, um es weiter zu entwickeln. Ich nehme gerne Ihr Angebot an, wenn ich nicht weitermachen kann. – ggemmill

+0

Dieser Code wurde aus [PyGtk Posting] (https://sourceforge.net/projects/pygtk-posting/) kopiert und eingefügt. Es ist eine kleine Business-Buchhaltungssoftware, die ich in meiner Freizeit für mich selbst entwickle. Vielleicht finden Sie in diesem Projekt weitere nützliche Informationen. – theGtknerd

+0

Referenz PyGtk-Buchung: Bitte geben Sie an, wie "db_settings" geändert wird; Ich kann keine passende Funktion finden. – ggemmill

Verwandte Themen