我如何将数据(PostgreSQL)数据馈送到GTK条目字段中



尝试设置一个Python 3程序以显示和编辑PostgreSQL数据库的数据。附加的代码是我正在尝试的简化"硬编码"示例(实际上使用等效的GTK.builder Construction(。如果没有" set_text"指令,则完全显示了我想要的vcard窗口。

这是痕迹:

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

这是代码:

#!/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)

非常感谢您的投入graeme

这是一个可以使您开始的基本应用。

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

带有名称app.ui的GLADE文件:

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

随时要求对您不了解的任何内容进行解释