首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Qt/GTK/WxWidgets DataGrid数据库感知

Python Qt/GTK/WxWidgets DataGrid数据库感知
EN

Stack Overflow用户
提问于 2017-10-31 02:46:44
回答 1查看 497关注 0票数 2

是否有任何DataGrid/DataGridView组件

GUI组件库的一部分,如Qt/GTK/WxWidgets/等。

具有相同的功能性和灵活性

是C#/WPF还是C#/Winforms DataGridView?

(主要用于Python 3...跨平台/避免MS .net)

我的意思是与Dataset组件协同工作

或者类似的范例/功能来实现CRUD?

我不想在这个阶段更多地扩展这个问题...

我将等待一些答案来展开讨论……

EN

回答 1

Stack Overflow用户

发布于 2018-02-19 09:24:34

免责声明:我从未使用过C#WPF或您提到的其他工具。

Disclaimer2:这个应用还没有CRUD。它只有读支持。

最后,不能保证这甚至接近你正在寻找的东西。我发帖是因为似乎没有人有更好的解决方案。

代码语言:javascript
复制
#!/usr/bin/python3
# sql_window.py

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

class SQLWindowGUI :
    def __init__(self):

        self.db = psycopg2.connect(dbname = 'trial_new_db', user = 'postgres', password = 'true', host = '192.168.0.120')
        button = Gtk.Button('Run SQL')
        button.set_property('valign', Gtk.Align.END)
        button.set_property('halign', Gtk.Align.END)
        button.connect('clicked', self.run_sql_clicked)
        overlay = Gtk.Overlay()
        overlay.add_overlay(button)
        self.sql_buffer = Gtk.TextBuffer()
        self.sql_buffer.set_text("SELECT id, name FROM contacts")
        textview = Gtk.TextView.new_with_buffer(self.sql_buffer)
        textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
        overlay.add (textview)
        pane = Gtk.Paned()
        pane.set_orientation(Gtk.Orientation.VERTICAL)
        pane.set_position(100)
        pane.add1(overlay)
        self.scrolledwindow = Gtk.ScrolledWindow()
        self.treeview = Gtk.TreeView()
        self.scrolledwindow.add(self.treeview)
        self.sql_error_buffer = Gtk.TextBuffer()
        self.textview = Gtk.TextView.new_with_buffer(self.sql_error_buffer)
        self.textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
        box = Gtk.Box()
        box.pack_start(self.scrolledwindow, True, True, 0)
        box.pack_start(self.textview, True, True, 0)
        pane.add2(box)
        self.window = Gtk.Window()
        self.window.add(pane)
        self.window.set_title("SQL Window")
        self.window.set_default_size(600, 500)
        self.window.show_all()
        self.window.connect('destroy', Gtk.main_quit)

    def run_sql_clicked (self, button):
        for column in self.treeview.get_columns():
            self.treeview.remove_column(column)
        start_iter = self.sql_buffer.get_start_iter ()
        end_iter = self.sql_buffer.get_end_iter ()
        string = self.sql_buffer.get_text(start_iter, end_iter, True)
        cursor = self.db.cursor()
        try:
            cursor.execute(string)
        except Exception as e:
            self.sql_error_buffer.set_text(str(e))
            self.textview.set_visible(True)
            self.scrolledwindow.set_visible(False)
            self.db.rollback()
            return
        #probably an UPDATE, report rows affected
        if cursor.description == None: 
            result = "%s row(s) affected" % cursor.rowcount
            self.sql_error_buffer.set_text(result)
            self.textview.set_visible(True)
            self.scrolledwindow.set_visible(False)
            self.db.rollback()
            return
        #create treeview columns and a liststore to store the info
        self.textview.set_visible(False)
        self.scrolledwindow.set_visible(True)
        type_list = list()
        for index, row in enumerate(cursor.description):
            column_name = row.name
            type_ = row.type_code
            if type_ == 23:
                type_list.append(int)
                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_name, renderer, text=index)
                self.treeview.append_column(column)
                column.set_sort_column_id(index)
            elif type_ == 16:
                type_list.append(bool)
                renderer = Gtk.CellRendererToggle()
                column = Gtk.TreeViewColumn(column_name, renderer, active=index)
                self.treeview.append_column(column)
                column.set_sort_column_id(index)
            else:
                type_list.append(str)
                renderer = Gtk.CellRendererText()
                column = Gtk.TreeViewColumn(column_name, renderer, text=index)
                self.treeview.append_column(column)
                column.set_sort_column_id(index)
        store = Gtk.ListStore()
        store.set_column_types(type_list)
        self.treeview.set_model(store)
        for row in cursor.fetchall():
            # do a convert, cell by cell, to make sure types are correct
            store_row = list()
            for index, element in enumerate(row):
                store_row.append(type_list[index](element))
            store.append (store_row)
        self.db.rollback()
        cursor.close()

def main_gui():

    app = SQLWindowGUI()
    Gtk.main()


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

历史:我将其创建为PGAdmin的轻量级替代品,以便在Postgres中简单地查看数据。它应该可以在任何安装了psycopg2和Gtk3的Linux发行版上运行。理论上,它应该是跨平台的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47022253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档