【问题标题】:argument 1 has unexpected type 'Ui_mainWindow'参数 1 具有意外类型“Ui_mainWindow”
【发布时间】:2012-02-17 14:32:15
【问题描述】:

我正在尝试为我在此处的一些人的帮助下编写的小程序制作 GUI,无论如何,我在 PyQt 中制作了 GUI,它看起来不错。我添加了一个名为 dirButton 的按钮,上面写着“选择目录”

self.dirButton = QtGui.QPushButton(self.buttonWidget)
self.dirButton.setGeometry(QtCore.QRect(0, 0, 91, 61))
self.dirButton.setObjectName(_fromUtf8("dirButton"))
self.dirButton.clicked.connect(self.browse)

在最后一行中,当我单击它时,我将其命名为 self.browse,即:

def browse(self):
    filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '.')
    fname = open(filename)
    data = fname.read()
    self.textEdit.setText(data)
    fname.close()

但是,这是我得到的错误:

Traceback (most recent call last):
File "C:\Users\Kevin\Desktop\python-tumblr-0.1\antearaGUI.py", line 88, in browse
filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '.')
TypeError: QFileDialog.getOpenFileName(QWidget parent=None, QString caption=QString(),     QString directory=QString(), QString filter=QString(), QString selectedFilter=None, QFileDialog.Options options=0): argument 1 has unexpected type 'Ui_mainWindow'

所以,ui_mainWindow 是我所有的 GUI 按钮和 GUI 本身都存储在其中的类。

class Ui_mainWindow(object):

我不明白为什么会出错,有人有什么想法吗?

这是整个 GUI 的 pastebin 链接:http://pastebin.com/BWCcXxUW

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    据我了解,您使用的是从.ui 文件生成的Ui_mainWindow。如您所见,Ui_mainWindow 只是包含小部件的 python 类。 getOpenFileName 接收 QWidget 实例作为第一个参数。因此,您需要继承 QWidget 或 QMainWindow 并在该类中定义方法。

    代码将如下所示:

    import sys
    
    from PyQt4 import QtCore, QtGui
    
    from file_with_ui import Ui_MainWindow
    
    class Main(QtGui.QMainWindow, Ui_MainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)
            self.setupUi(self)
    
        def browse(self):
            filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '.')
            fname = open(filename)
            data = fname.read()
            self.textEdit.setText(data)
            fname.close()
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = Main()
        window.show()
        sys.exit(app.exec_())
    

    您也可以将ui 存储为实例属性:

    class Main(QtGui.QMainWindow):
        def __init__(self):
             QtGui.QMainWindow.__init__(self)
             self.ui=Ui_MainWindow()
             self.ui.setupUi(self)
    

    并通过self.ui 访问您的控件,例如:self.ui.textEdit.setText(data)

    考虑阅读有关pyuic使用PyQt by Example (Session 1)的教程

    【讨论】:

    • 好的,谢谢,我会看的,我还有一个问题,我真的不知道该怎么做。我是类和方法的新手,所以请耐心等待。
    • 我有一个脚本可以读取目录中的文件然后上传它们:pastebin.com/fnZN1rwS 这样我就可以上传目录中的每张照片。但是,因为我使用的是一个类,所以我不知道如何从方法浏览中返回变量目录。我试过返回目录,但它什么也没做。我也尝试搜索但找不到任何相关内容。 pastebin.com/S57DHQfF 这是我从浏览方法定义目录的地方。
    • @Anteara,您可以在类中定义def upload(self, directory):...,并将脚本中的代码添加到该函数中。然后在browse 中添加对self.upload(directory) 的调用。另请阅读Python tutorial - 4.6. Defining Functions
    【解决方案2】:

    导入以下内容:

    import sys
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    from PyQt4 import QtGui, QtCore
    

    在类 Ui_MainWindow(object) 中,用 QWidget 替换 object:

    Ui_MainWindow(QWidget)
    

    【讨论】:

      【解决方案3】:
      def browseFiles(self):
              text, placeholder = QFileDialog.getOpenFileName(None, 'Select file') 
      

      对我来说解决的方法是使用None,而不是self,因为self继承了它上面窗口的类型,预计为None,但将QMainWindow作为一个类型.

      我还解压了它返回的元组,因为这个函数返回两个对象来处理。

      我希望这会有所帮助,也许其他人可以更好地解释它为什么有效。

      TLDR:该函数需要None作为第一个参数,但由于self,继承了QmainWindow作为类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2012-12-12
        • 2021-03-18
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多