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

4
我是一名有用的助手,可以为您翻译文本。
我正在使用Python和PyQt4为我的树莓派制作程序。 现在我在我的树莓派上启动程序时出现了错误,并且它没有显示我制作的按钮。 我已经在Qt Designer中设计了它,它显示了窗口但上面什么都没有。
这是我的错误信息:
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

这是我从Qt Designer中提取的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$

以下是我的文件以显示窗口: import sys from PyQt4 import QtCore, QtGui from 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_())

有人能为我提供解决方案吗?我在谷歌上搜索了错误信息,但没有找到适用于我的问题的答案。

谢谢...


问题可能是真正的VNC吗?我想在VNC会话中启动程序。网上说问题可能是真正的VNC,这可能是可能的吗? - Stijnb
2个回答

1
我发现Unetbootin存在类似的问题。它需要root权限,当用户启动X服务器时,例如使用startx命令时,会出现相同的错误。
解决方法是使用显示管理器,如lxdm、gdm等。
我猜测QT无法提升权限以访问某些共享内存,因为X是以用户权限运行的。而使用桌面管理器则以root权限运行。

1
我有一个与Python应用程序相同的问题。
我发现以下内容:
1. 使用VNC,以我的身份登录到Gnome桌面并以我的身份运行应用程序,可以100%工作。 2. 在我的桌面上登录时,运行xhost +。 3. Sudo切换用户到另一个用户,应用程序失败。 4. 作为新用户,导出DISPLAY = hostname: 5. 运行应用程序,现在它可以100%工作。
这个问题始于包含更新版本的pyqt和libqt的Python更新。
作为一个副测试,我可以完美地运行"eyes"和"firefox"(不需要导出显示变量)。
当使用"/unix"MIT-MAGIC-COOKIE-1时,pyqt尝试“填充”X11窗口时出现问题...当使用“hostname:instance”MIT-MAGIC-COOKIE-1时,相同的例程可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接