尝试在 pyqt 中创建文件浏览器,但 qtreewidgetitem 出现意外 bool 错误

Posted

技术标签:

【中文标题】尝试在 pyqt 中创建文件浏览器,但 qtreewidgetitem 出现意外 bool 错误【英文标题】:Trying to create a file browser in pyqt but have error with qtreewidgetitem unexpected bool 【发布时间】:2019-09-18 09:14:33 【问题描述】:

我想得到这个:a link!在我的 pyqt 程序中,但它不起作用我已经尝试了很多并解决了很多错误,但是对于这个我不知道该怎么做。 我只是在使用 pyqt,我对 python 没有很多经验。 有没有办法在程序启动而不是使用临时测试按钮时自动启动:(def load_project_structure)?

PyQt 代码:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
    <x>0</x>
    <y>0</y>
    <width>1483</width>
    <height>638</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="opnemen">
    <property name="geometry">
    <rect>
    <x>470</x>
    <y>10</y>
    <width>75</width>
    <height>23</height>
    </rect>
    </property>
    <property name="text">
    <string>Opnemen</string>
    </property>
</widget>
<widget class="QPushButton" name="import_2">
    <property name="geometry">
    <rect>
    <x>470</x>
    <y>40</y>
    <width>75</width>
    <height>23</height>
    </rect>
    </property>
    <property name="text">
    <string>Inport</string>
    </property>
</widget>
<widget class="QTreeWidget" name="FileStuckture">
    <property name="geometry">
    <rect>
    <x>10</x>
    <y>10</y>
    <width>451</width>
    <height>561</height>
    </rect>
    </property>
    <column>
    <property name="text">
    <string notr="true">1</string>
    </property>
    </column>
</widget>
<widget class="QPushButton" name="testing">
    <property name="geometry">
    <rect>
    <x>470</x>
    <y>80</y>
    <width>75</width>
    <height>23</height>
    </rect>
    </property>
    <property name="text">
    <string>testing</string>
    </property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
    <rect>
    <x>0</x>
    <y>0</y>
    <width>1483</width>
    <height>21</height>
    </rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

Python 代码:

import os, sys
import sounddevice as sd
from scipy.io.wavfile import write
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QTreeWidgetItem
from PyQt5.QtGui import QIcon
from pathlib import Path

qtcreator_file  = "mainwindow.ui" # Enter file here.
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtcreator_file)

class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        self.testing.clicked.connect(self.load_project_structure)
    startpath = Path("D:/DemoGIPhoofdmap")
    def load_project_structure(startpath, FileStuckture):
        startpathh = Path("D:/DemoGIPhoofdmap/")
        for element in os.listdir(startpathh):
            path_info = startpathh / element
            parent_itm = QTreeWidgetItem(FileStuckture, [os.path.basename(element)])
            if os.path.isdir(path_info):
                load_project_structure(path_info, parent_itm)
                parent_itm.setIcon(0, QIcon('assets/folder.ico'))
            else:
                parent_itm.setIcon(0, QIcon('assets/file.ico'))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

第 24 行的错误信息:

parent_itm = QTreeWidgetItem(FileStuckture, [os.path.basename(element)])
TypeError: arguments did not match any overloaded call:
QTreeWidgetItem(type: int = QTreeWidgetItem.Type): too many arguments
QTreeWidgetItem(Iterable[str], type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidget, type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidget, Iterable[str], type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidget, QTreeWidgetItem, type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidgetItem, type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidgetItem, Iterable[str], type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidgetItem, QTreeWidgetItem, type: int = QTreeWidgetItem.Type): argument 1 has unexpected type 'bool'
QTreeWidgetItem(QTreeWidgetItem): argument 1 has unexpected type 'bool'

【问题讨论】:

抱歉没有复制所有内容Traceback (most recent call last): File "save location", line 24, in load_project_structure这是之前的所有内容。 如果你想在开始时运行 load_project_structure() 然后在 __init__ 中运行 self.load_project_structure(parameters) 类中的方法 load_project_structure() 应该将 self 作为第一个参数,以正确地为其他变量赋值 - def load_project_structure(self, startpath, FileStuckture): 错误表明在QTreeWidgetItem(...) 中您使用了错误的值——其中一个值的类型错误。错误还向您显示它可以接受的值。可能是因为您在 def load_project_structure(startpath, FileStuckture): 中使用了名称 FileStuckture,所以它创建了局部变量 FileStuckture 并删除了您在 PyQt - &lt;widget class="QTreeWidget" name="FileStuckture"&gt; 中声明的 FileStuckture 好的,感谢您的快速响应。比我需要创建 FileStruckture 以外的其他变量。我做了那个萌芽我怎么定义呢?我拿了树并用脚本中的所有内容替换了 FileStruckture。但是现在出现了树没有定义的错误。 【参考方案1】:

我不能运行它,但我认为它应该是

编辑:我在self.FileStucktureself.load_project_structure() 中添加了self. def load_project_structure()

class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.load_project_structure("D:/DemoGIPhoofdmap", self.FileStuckture)


    def load_project_structure(self, startpath, tree):
        startpath = Path(startpath)
        for element in os.listdir(startpath):
            path_info = startpath / element
            parent_itm = QTreeWidgetItem(tree, [os.path.basename(element)])
            if os.path.isdir(path_info):
                self.load_project_structure(path_info, parent_itm)
                parent_itm.setIcon(0, QIcon('assets/folder.ico'))
            else:
                parent_itm.setIcon(0, QIcon('assets/file.ico'))

您应该在 __init__ 中运行 load_project_structure 并使用值 "D:/DemoGIPhoofdmap"FileStuckture

self.load_project_structure("D:/DemoGIPhoofdmap", FileStuckture)

但不要在行中使用名称FileStuckture

def load_project_structure(self, startpath, tree):

因为它声明了局部变量 FileStuckture 并删除了您在 PyQt 中声明的类 FileStuckture

【讨论】:

好的,谢谢,我也想多了解一点。现在,当我运行您的代码时出现此错误:Traceback (most recent call last): File "D:\Windows\OneDrive\OneDrive - Campus Sint-Ursula Lier\Schooljaar 2019-2020\GIP\Software\Program\code.py", line 34, in &lt;module&gt; window = MyWindow() File "D:\Windows\OneDrive\OneDrive - Campus Sint-Ursula Lier\Schooljaar 2019-2020\GIP\Software\Program\code.py", line 18, in __init__ self.load_project_structure("D:/DemoGIPhoofdmap", FileStuckture) NameError: name 'FileStuckture' is not defined 它是用 XML 在文件中定义的,但我不知道它后来如何使用它来创建这些对象。也许它被定义为主窗口的一部分,它是self.FileStuckture @furas 是的 - xml ui 文件中的所有小部件将自动成为传递给__init__ 中的setupUi 的对象的属性(即self,在这种特殊情况下)。属性名称取自 ui 文件中定义的名称。所以树小部件可以作为self.FileStuckture 访问。这意味着不需要load_project_structure 的第二个参数——您可以将tree 的所有用法替换为self.FileStuckture。 (当然,如果 OP 在 ui 文件中使用更多 Pythonic 名称也会有所帮助 - 但这是另一回事了)。 @ekhumoro 谢谢你的信息。我不能确定它是否只需要 self. 或者它需要像 FileStuckture = get_by_name("FileStuckture") 这样的方法,我在 Python 的一些 GUI 中看到了 - 可能在 Kivy 中。至于在load_project_structure 中使用第二个参数,我现在看到有递归,load_project_structure 再次运行load_project_structure,第二个参数不同,所以仍然需要它。 @furas 啊 - 你说得对,我完全错过了。

以上是关于尝试在 pyqt 中创建文件浏览器,但 qtreewidgetitem 出现意外 bool 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt 中创建图像浏览器?从哪儿开始? [关闭]

当我尝试在 python 中创建浏览器时出现错误

在PyQt中创建MapQuickItem并将其添加到Map中

在 PyQt 中创建动态按钮

在 PYQT5 中创建全屏按钮

无法在python中创建成功的exe文件[重复]