标签: pyside

如果导入PySide,python子进程在numpy点上崩溃

当使用带有numpy和PySide导入的pytnon多处理池时,我的机器上发生了这种非常特殊的悬挂.这是我迄今为止在生活中看到的最纠结的错误:)以下代码:

import numpy as np
import PySide


def hang():
    import multiprocessing
    pool = multiprocessing.Pool(processes = 1)
    pool.map(f, [None])


def f(ignore):
    print('before dot..')
    np.dot(np.zeros((128, 1)), np.zeros((1, 32)))
    print('after dot.')


if __name__ == "__main__":
    hang()
    print('success!')
Run Code Online (Sandbox Code Playgroud)

仅在'点之前'挂起打印.但它应该打印

before dot..
after dot.
success!
Run Code Online (Sandbox Code Playgroud)

我不是gdb专家,但看起来像gdb显示进程在'np.dot'行退出(或崩溃):

[Inferior 1 (process 2884) exited normally]
Run Code Online (Sandbox Code Playgroud)

我可以采取一些神奇的修改来防止悬挂:

  • 如果你减少进入'点'的数组的形状(例如从128到127)
  • (!)如果你将进入'dot'的数组的形状从128增加到256
  • 如果你不使用多处理并只运行函数'f'
  • (!!!)如果你注释掉在代码中没有使用的PySide导入

任何帮助表示赞赏!

包装版本:

numpy = 1.8.1或1.7.1 PySide = 1.2.1或1.2.2

Python版本:

在达尔文上的Python 2.7.5(默认,2013年9月12日,21:33:34)[GCC 4.2.1兼容的Apple LLVM 5.0(clang-500.0.68)]

要么

在达尔文上的Python 2.7.6(默认,2014年4月9日,11:48:52)[GCC 4.2.1兼容的Apple LLVM 5.1(clang-503.0.38)]

注意:在寻找信息时,我简化了原始代码并提出了一些问题.但是这里有一堆更新,以便为可能遇到此错误的其他人保留历史记录(例如,我开始使用matplotlib,而不是使用pyside)

更新:我缩小了pylab import以导入带有pyside后端的matplotlib并更新了要运行的代码.

更新:我正在修改帖子只导入PySide而不是:

import …
Run Code Online (Sandbox Code Playgroud)

python numpy multiprocessing pyside

9
推荐指数
2
解决办法
957
查看次数

QSettings():如何保存到当前工作目录

对于可以直接从闪存/笔/ USB /跳/拇指驱动器运行的应用程序,为了便于从一台机器移动到另一台机器,将用户设置存储在记忆棒上的同一目录中是有意义的.程序正在运行(而不是每台机器的Windows/Mac/Linux用户或系统目录).

QSettings()很方便,可以告诉它使用当前的工作目录吗?

这是一个小例子程序,它使用QSettings()保持其运行的屏幕位置:

from PySide import QtGui, QtCore
from PySide.QtGui import QTabWidget, QApplication
from PySide.QtCore import QSettings

class AbcApp(QTabWidget):
    def __init__(self):
        super(AbcApp, self).__init__()

        self.settings = QSettings(QSettings.IniFormat,QSettings.SystemScope, '__MyBiz', '__settings')
        self.settings.setFallbacksEnabled(False)    # File only, not registry or or.

        # setPath() to try to save to current working directory
        self.settings.setPath(QSettings.IniFormat,QSettings.SystemScope, './__settings.ini')

        # Initial window size/pos last saved
        self.resize(self.settings.value("size", QtCore.QSize(270, 225)))
        self.move(self.settings.value("pos", QtCore.QPoint(50, 50)))

        self.tab = QtGui.QWidget()
        self.textEdit = QtGui.QTextEdit(self.tab)
        self.textEdit.setHtml('<font color=grey>[QTextEdit area]</font><p><center><font color=blue size=4><b>Allo Woyld</b></font></center>')
        self.addTab(self.tab, 'tab1')

    def closeEvent(self, e):
        # …
Run Code Online (Sandbox Code Playgroud)

python pyqt4 pyside

8
推荐指数
1
解决办法
1万
查看次数

如何实现Qt Designer中定义的信号/槽

我试图将按钮的click()信号连接到我自己的函数.该按钮位于我使用QT Designer创建的小部件中.我用QUiLoader加载.ui文件,如下所示:

class MyWidget(QtGui.QMainWindow):
    def __init__(self, *args):  
        QtGui.QMainWindow.__init__(self, *args)

        loader = QtUiTools.QUiLoader()
        file = QtCore.QFile("pyside_ui_qtdesigner_form_test.ui")
        file.open(QtCore.QFile.ReadOnly)
        self.myWidget = loader.load(file, self)
        file.close()

        self.setCentralWidget(self.myWidget)

        btn = self.myWidget.findChild(QtGui.QPushButton, "HelloWorldButton")
        btn.clicked.connect(self.slot1)        

    def slot1(self):
        print "Received"
Run Code Online (Sandbox Code Playgroud)

这是连接按钮clicked()信号的正确方法吗?我看到我可以直接在Qt Designer中连接信号和插槽,但是我如何准备并在代码中进行这样的连接?附带问题:上面的代码有效,但主窗口显示错误的大小.如何确保尺寸合适?我应该用最小的高度/宽度限制来做到这一点吗?

python pyqt signals-slots qt-designer pyside

8
推荐指数
1
解决办法
8470
查看次数

自定义绘制委托中的可单击元素或子窗口小部件

我有一个QListView,我使用自定义绘图显示项目.在每个项目(即每个列表行)中,我希望能够显示一些用户可以单击的"超链接",然后调用某些功能.

我已经尝试检查官方文档(例如模型/视图编程)以及相当多的谷歌搜索,但还没有弄清楚如何实现这一目标.

我有两个想法,每个都有自己的问题:

  • 我可以使用子小部件绘制它们,就像平面QPushButton一样.然后我如何定位和显示这些小部件?
  • 我也可以将它们绘制为文本字符串.然后如何使它们可点击?或者我可以捕获父QListView上的点击事件,并以某种方式确定那些坐标?然后我可以将坐标与这些可点击元素进行匹配并相应地采取行动

我最初的方法是使用QListWidget和.setItemWidget(),其中我有一个带有布局和子窗口小部件的正确小部件.不幸的是,当我的列表增加到数百或数千个项目时,这太慢了.这就是我用委托更改为QListView的原因.

qt qt4 qlistview qitemdelegate pyside

8
推荐指数
1
解决办法
1414
查看次数

pyside显示/隐藏布局

我正在尝试显示两种布局中的一种,具体取决于是否选中了复选框.

只使用小部件我可以执行以下工作正常:(此示例中的每个小部件都是QLineEdit)

myCheckbox.stateChanged.connect(switchControls)

def switchControls (self, state):
    if state == 2:
        self.widget1.show()
        self.widget2.hide()
    else:
        self.widget1.hide()
        self.widget2.show()
Run Code Online (Sandbox Code Playgroud)

但是,由于我想为每个QLineEdit添加一个描述性标签,我需要在某种布局或容器中组合QLineEdit + QLabel.我一直在尝试使用addlayout/removeLayout/removeItem在布局而不是小部件上执行上述操作,但无法使其工作.程序在我上次尝试时崩溃了.

在两种布局之间切换的最简单方法是什么?它不必使用复选框,但我更喜欢.

python layout show hide pyside

8
推荐指数
1
解决办法
6174
查看次数

如何从PySide Qt中的tabWidget弹出一个单独的窗口

我有一个扩展的主窗口,QtGui.QTabWidget添加了它.我正在创建几个扩展的小部件QtGui.QWidget,我可以在其中添加和删除选项卡小部件.

我想要做的是有一个"弹出"按钮,导致子窗口小部件从选项卡窗口小部件中删除,并作为它自己的独立窗口出现(和一个"弹出"按钮,将其放回到主窗口).与Gtalk-in-Gmail相同的想法.请注意,如果我关闭主窗口,其他"选项卡"或"窗口"也应该关闭,我应该能够并排放置所有窗口并让它们全部可见并同时更新.(我将显示近实时数据).

我是Qt的新手,但是如果我没弄错的话,如果Widget没有父母,那么它就会独立出现.这有效,但我不知道如何能够"弹出"窗口.

class TCWindow(QtGui.QMainWindow): 
    .
    .
    .
    def popOutWidget(self, child):
        i = self.tabHolder.indexOf(child)
        if not i == -1:
             self.tabCloseRequested(i)
        self.widgets[i].setParent(None)
        self.widgets[i].show()
Run Code Online (Sandbox Code Playgroud)

我的直觉说,两者之间应该仍然存在父/子关系.

有没有办法保持父母,但仍然独立出现窗口,或者我是否误解了Qt的风格?

否则,会在子节点中创建一个变量来保存到主窗口的链接(比如self.parentalUnit = self.parent())是一个好主意还是一个hackish/kludgy的想法?

python qt pyside

8
推荐指数
1
解决办法
2672
查看次数

如何调试virtualenv中的pyside分段错误?

我正在用pyside构建一个Qt应用程序,我有随机分段错误.我安装了faulthandler,如果不完整,则调用堆栈清除:

  File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 247 in itemChange
  File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 268 in mousePressEvent
  File "/home/lionel/Libs/python/ProcessGraph/process_graph/qtgraph.py", line 87 in mousePressEvent
  File "main.py", line 219 in main
  File "main.py", line 223 in <module>
Run Code Online (Sandbox Code Playgroud)

崩溃总是在那里(在mousePressEvent中),但除了启动gdb之外,我没有看到我能从那里做什么.

我已经安装了python-gdb并尝试启动:gdb -ex r --args python-dbg main.py但它没有运行.所以我有点卡住了.这里的堆栈:

python2.7-dbg: ../Objects/object.c:65: _Py_AddToAllObjects: Assertion `(op->_ob_prev == ((void *)0)) == (op->_ob_next == ((void *)0))' failed.

Program received signal SIGABRT, Aborted.
0x00007ffff6f09037 in raise ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007ffff6f09037 in raise ()
   from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff6f0c698 in abort ()
   from …
Run Code Online (Sandbox Code Playgroud)

python debugging gdb virtualenv pyside

8
推荐指数
1
解决办法
1287
查看次数

PySide:设置QVBoxLayout的宽度

使用PySide,我在QVBoxLayout中有一组QWidget

vlayout = QVBoxLayout()
vlayout.addWidget(self.a_label)
vlayout.addWidget(self.a)
Run Code Online (Sandbox Code Playgroud)

我可以设置小部件的宽度

self.a.setFixedWidth(60)
Run Code Online (Sandbox Code Playgroud)

但如果我尝试设置的宽度QVBoxLayoutsetGeometry

vlayout.setGeometry(QRect(100, 100, 100, 100))
Run Code Online (Sandbox Code Playgroud)

我没有得到改变.

我如何设置QVBoxLayout的宽度?

python pyside

8
推荐指数
1
解决办法
7838
查看次数

为什么QToolTips不会出现在QMenu中的QActions上

我正在用GUI编写的应用程序PySide.我设置了QMenu一个QPushButton,添加了几个QActionsvia QMenu.addAction.为了进一步说明这些行动给用户我说QToolTip的这些带QAction.setToolTip.

当我运行GUI时,我QToolTip将无法显示.下面发布的示例再现了同样的问题,任何想法?

提前致谢

import sys
from PySide import QtGui

class Example(QtGui.QPushButton):

    def __init__(self, parent = None):
        super(Example, self).__init__(parent)

        self.setText('TestMenu')
        self.setToolTip('This is a Test Button')

        menu = QtGui.QMenu(self)
        action_1 = menu.addAction('Action1')
        action_1.setToolTip('This is action 1')
        action_2 = menu.addAction('Action2')
        action_2.setToolTip('This is action 2')
        action_3 = menu.addAction('Action3')
        action_3.setToolTip('This is action 3')
        action_4 = menu.addAction('Action4')
        action_4.setToolTip('This is action 4')

        self.setMenu(menu)
        self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = …
Run Code Online (Sandbox Code Playgroud)

python pyside qmenu qaction

8
推荐指数
2
解决办法
3065
查看次数

如何在pyside中更改窗口标题?

我已经阅读了有关以下事项的文档,但是Qt非常复杂,我可能错过了这篇文章.

我创建了一个QMainWindow并使用设置标题self.setWindowTitle.稍后在代码中我想简单地更改此标题,因此我self.setWindowTitle再次使用该方法.但这只是从我的应用程序中删除了标题,但在Ubuntu的面板上放了正确的标题.

关于Ubuntu系统的进一步说明:例如,当我在webbrowser窗口中编辑此文本时,标题为"如何更改窗口...",并在计算机屏幕顶部的面板上显示文本'Firefox Web浏览器".

我的pysideQt示例现在从应用程序窗口中删除标题,并将其放在上面的面板上.

除了setWindowTitle更改标题之外,我还需要一种不同的方法吗?也许来自centralWidget,或MenuBar,还是其他一些元素?为什么标题首先消失了?

第一次调用setWindowTitle标题'PicSel' 后的Ubuntu屏幕截图在应用程序窗口标题和顶部Ubuntu面板上设置(或者不管这个名称):

在第一次设置Windows标题后

第二次调用后的Ubuntu截图setWindowTitle- 标题未在应用程序窗口本身上设置,但在最顶层的面板上:

第二次设置Windows标题后

python pyside

8
推荐指数
1
解决办法
4380
查看次数