启动应用程序时出现Pyqt4 X错误

时间:2013-08-25 13:27:16

标签: python pyqt4 raspberry-pi raspbian

我正在python和pyqt4中为我的覆盆子pi制作一个程序。 现在我正在我的覆盆子上启动程序,它会出错并且它不会显示我所做的按钮。 我已设计成qtdesinger,它显示窗口,但没有任何内容。

这是我的错误:

X Error: BadAccess (attempt to access private resource denied) 10
  Extension:    129 (MIT-SHM)
  Minor opcode: 1 (X_ShmAttach)
  Resource id:  0x2800001
X Error: BadShmSeg (invalid shared segment parameter) 128
  Extension:    129 (MIT-SHM)
  Minor opcode: 5 (X_ShmCreatePixmap)
  Resource id:  0x280000a
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x280000b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x280000b
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x280000b

这是来自qtdesigner的我的python代码:

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(480, 640)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(120, 140, 83, 24))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.toolButton = QtGui.QToolButton(Form)
        self.toolButton.setGeometry(QtCore.QRect(350, 250, 27, 20))
        self.toolButton.setObjectName(_fromUtf8("toolButton"))
        self.buttonBox = QtGui.QDialogButtonBox(Form)
        self.buttonBox.setGeometry(QtCore.QRect(150, 280, 156, 24))
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDia$
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.commandLinkButton = QtGui.QCommandLinkButton(Form)
        self.commandLinkButton.setGeometry(QtCore.QRect(160, 230, 168, 41))
        self.commandLinkButton.setObjectName(_fromUtf8("commandLinkButton"))
        self.checkBox = QtGui.QCheckBox(Form)
        self.checkBox.setGeometry(QtCore.QRect(130, 380, 84, 19))
        self.checkBox.setObjectName(_fromUtf8("checkBox"))
        self.toolButton_2 = QtGui.QToolButton(Form)
        self.toolButton_2.setGeometry(QtCore.QRect(160, 470, 27, 20))
        self.toolButton_2.setObjectName(_fromUtf8("toolButton_2"))
        self.listView = QtGui.QListView(Form)
        self.listView.setGeometry(QtCore.QRect(60, 460, 256, 192))
        self.listView.setObjectName(_fromUtf8("listView"))

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtG$
        self.pushButton.setText(QtGui.QApplication.translate("Form", "Lamp", None,$
        self.toolButton.setText(QtGui.QApplication.translate("Form", "...", None, $
        self.commandLinkButton.setText(QtGui.QApplication.translate("Form", "Comma$
        self.checkBox.setText(QtGui.QApplication.translate("Form", "CheckBox", Non$
        self.toolButton_2.setText(QtGui.QApplication.translate("Form", "...", None$

这是我的文件显示窗口:     导入系统     来自PyQt4导入QtCore,QtGui     来自test import Ui_Widget

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Widget()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

对我来说有没有解决方案? 我搜索了错误,但没有找到我的问题的答案。

...谢谢

2 个答案:

答案 0 :(得分:1)

我对python应用程序有同样的问题。

我找到了以下内容:

  1. 使用VNC,以我自己的身份登录Gnome桌面并以自己的身份运行应用程序,100%工作
  2. 以我自己的身份登录桌面,运行xhost +
  3. Sudo将用户切换到另一个用户并且应用程序失败
  4. 作为新用户,导出DISPLAY = hostname:
  5. 运行应用程序,现在可以100%
  6. 运行

    这开始发生了python更新,其中包括较新版本的pyqt和libqt。

    作为一个侧面测试,我可以完美地运行“眼睛”和“火狐”(不导出显示变量)

    当使用“/ unix”MIT-MAGIC-COOKIE-1时,pyqt试图“填写”X11窗口时出现问题......使用“hostname:instance”MIT时,相同的例程工作正常MAGIC-COOKIE-1

答案 1 :(得分:1)

我发现Unetbootin存在类似的问题。它需要root权限,并且当从用户启动X-server时,例如使用startx命令,它会产生相同的错误。

解决方案是使用显示管理器,如lxdm,gdm等。

我的猜测是QT无法提升访问某些共享内存的权限,因为X使用 user 权限运行。使用桌面管理器,它以root权限运行。