Python Qt/GTK/WxWidgets数据网格数据库

2024-05-29 11:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

(主要用于Python3。。。跨平台/避开MS.net)

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

我不想在这一阶段继续提问…
我将等待一些答案来展开讨论…


Tags: 功能gtk跨平台etc组件guiqtpython3
1条回答
网友
1楼 · 发布于 2024-05-29 11:23:06

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

免责声明2:这个应用程序还没有积垢。它只有读支持。在

最后,也不能保证这是你所要找的。我发帖是因为似乎没有人有更好的解决办法。在

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

相关问题 更多 >

    热门问题