【问题标题】:Python Qt/GTK/WxWidgets DataGrid database awarePython Qt/GTK/WxWidgets DataGrid 数据库感知
【发布时间】:2017-10-30 18:46:43
【问题描述】:

有没有DataGrid/DataGridView组件
GUI 组件库的一部分,如 Qt/GTK/WxWidgets/等。
具有相同的功能性和灵活性
作为 C#/WPF 或 C#/Winforms DataGridView ?

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

我的意思是与数据集组件协同工作
或类似的范例/功能来实现 CRUD ?

我不想在这个阶段扩展更多的问题...
我会等待一些答案来展开讨论...

【问题讨论】:

    标签: python database datagrid


    【解决方案1】:

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

    免责声明 2:此应用尚无 CRUD。它只有读取支持。

    最后,我们无法保证这与您正在寻找的内容非常接近。我发帖是因为似乎没有人有更好的解决方案。

    #!/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 发行版。理论上应该是跨平台的。

    【讨论】:

    • 感谢您的回答...我们的目标也是找到人们在该领域使用的东西...并为其他人提供信息...
    • 我会尽快尝试---
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 2013-06-18
    • 2018-01-12
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2016-06-16
    • 2021-03-11
    相关资源
    最近更新 更多