使用PyQt5在我的GUI中嵌入DataTable

时间:2017-07-18 16:28:49

标签: python user-interface embed pyqt5

我对python很新,对PyQt来说还是新手。

当我点击文件浏览按钮时,我正在尝试在我的pyqt程序中嵌入一个QTableWidget。我的目标是创建一个类来创建多个表,但是为了简化事情,我将类设置为静态,因此当它被调用时会生成一个预定义的表。现在我只想看看如何嵌入表格。

我在我的类MainWindow中定义了两个方法“InitializeUI”和“import”。 InitializeUI负责我的大多数小部件的创建和布局,我希望import能够使用我在InitializeUI中创建的布局创建和嵌入我的表。我该怎么做呢?

此外,我运行的代码只是给出了错误“进程已完成退出代码1”,因此很难调试。这是我目前的代码。

将我的浏览按钮连接到导入方法的代码

import pandas as pd
from cytoolz.dicttoolz import merge
from cytoolz import concat
from bs4 import BeautifulSoup
from glob import glob

lox = glob('./*xml')

def p_item(i):
    s = i.find_all('stock')
    return merge([j.attrs for j in s] + [i.attrs])

def p_soup(f):
    soup = BeautifulSoup(open(f), "lxml")
    return [p_item(i) for i in soup.find_all('item')]

pd.DataFrame(list(concat([p_soup(f) for f in lox])))

     alt    alt_id       grocery    id       type   type_id
0   True  10069227         apple   id1      fruit  10067060
1   True  10015946       bannana   id2        NaN       NaN
2   True  10019211        orange   id3        NaN       NaN
3  False  10028810        garlic   id4        NaN       NaN
4  False  10020751        tomato   id5  vegetable  10020756
5  False  10037087        carrot   id6  vegetable  10023084
6  False  10037844         onion   AR7        NaN       NaN
7   True  10024570  water mellon   id8      fruit  10042703
8   True  10042727        cherry   id9      fruit  10042706
9  False  10034829       Apricot  id10      fruit  10043525

导入方法的代码。我的主窗口有三个布局,左侧,右上方和右下方有一个垂直框。我希望我的桌子进入窗户的右下角。

self.BrowseBtn.clicked.connect(self.import1)

用于创建表的类

    def import1(self):
        self.Table = CreateTable()
        vboxRightBottom.addWidget(self.Table)

我觉得我不能用另一种方法从一个方法调用布局,但我不确定如何以任何其他方式嵌入我的表。

抱歉,当我复制/粘贴我的代码时,如果代码没有正确缩进,那么堆栈很糟糕。

如果您需要进一步参考,请参阅我的完整代码链接

https://github.com/Silvuurleaf/Data-Analysis-and-Visualization-GUI/blob/master/Plotter3.1.py

1 个答案:

答案 0 :(得分:1)

vboxRightBottom看起来不在课堂上,首先你应该在它被调用的地方(在__init__的声明中和每个方法中)解决这个问题:

self.vboxRightBottom = QVBoxLayout()
def import1(self):
    self.Table = CreateTable()
    self.vboxRightBottom.addWidget(self.Table)

然后你处理类的方式不方便,你应该直接创建一个对象QTableWidget,如下所示:

class CreateTable(QTableWidget):
      def __init__(self):
         super(CreateTable, self).__init__()
         self.setRowCount(4)
         self.setColumnCount(2)
         self.setItem(0,0, QTableWidgetItem("Cell (1,1)"))
         self.setItem(0,1, QTableWidgetItem("Cell (1,2)"))
         self.setItem(1,0, QTableWidgetItem("Cell (2,1)"))
         self.setItem(1,1, QTableWidgetItem("Cell (2,2)"))
         self.setItem(2,0, QTableWidgetItem("Cell (3,1)"))
         self.setItem(2,1, QTableWidgetItem("Cell (3,2)"))
         self.setItem(3,0, QTableWidgetItem("Cell (4,1)"))
         self.setItem(3,1, QTableWidgetItem("Cell (4,2)"))

因此,当您对该类进行实例化时,它会返回该小部件,否则您应该将self.Table.tableWidget提供给addWidget方法

self.table = CreateTable()
self.vboxRightBottom.addWidget(self.table)