当使用带有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)
我可以采取一些神奇的修改来防止悬挂:
任何帮助表示赞赏!
包装版本:
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) 对于可以直接从闪存/笔/ 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) 我试图将按钮的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中连接信号和插槽,但是我如何准备并在代码中进行这样的连接?附带问题:上面的代码有效,但主窗口显示错误的大小.如何确保尺寸合适?我应该用最小的高度/宽度限制来做到这一点吗?
我有一个QListView,我使用自定义绘图显示项目.在每个项目(即每个列表行)中,我希望能够显示一些用户可以单击的"超链接",然后调用某些功能.
我已经尝试检查官方文档(例如模型/视图编程)以及相当多的谷歌搜索,但还没有弄清楚如何实现这一目标.
我有两个想法,每个都有自己的问题:
我最初的方法是使用QListWidget和.setItemWidget(),其中我有一个带有布局和子窗口小部件的正确小部件.不幸的是,当我的列表增加到数百或数千个项目时,这太慢了.这就是我用委托更改为QListView的原因.
我正在尝试显示两种布局中的一种,具体取决于是否选中了复选框.
只使用小部件我可以执行以下工作正常:(此示例中的每个小部件都是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在布局而不是小部件上执行上述操作,但无法使其工作.程序在我上次尝试时崩溃了.
在两种布局之间切换的最简单方法是什么?它不必使用复选框,但我更喜欢.
我有一个扩展的主窗口,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的想法?
我正在用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) 使用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)
但如果我尝试设置的宽度QVBoxLayout与setGeometry
vlayout.setGeometry(QRect(100, 100, 100, 100))
Run Code Online (Sandbox Code Playgroud)
我没有得到改变.
我如何设置QVBoxLayout的宽度?
我正在用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) 我已经阅读了有关以下事项的文档,但是Qt非常复杂,我可能错过了这篇文章.
我创建了一个QMainWindow并使用设置标题self.setWindowTitle.稍后在代码中我想简单地更改此标题,因此我self.setWindowTitle再次使用该方法.但这只是从我的应用程序中删除了标题,但在Ubuntu的面板上放了正确的标题.
关于Ubuntu系统的进一步说明:例如,当我在webbrowser窗口中编辑此文本时,标题为"如何更改窗口...",并在计算机屏幕顶部的面板上显示文本'Firefox Web浏览器".
我的pysideQt示例现在从应用程序窗口中删除标题,并将其放在上面的面板上.
除了setWindowTitle更改标题之外,我还需要一种不同的方法吗?也许来自centralWidget,或MenuBar,还是其他一些元素?为什么标题首先消失了?
第一次调用setWindowTitle标题'PicSel' 后的Ubuntu屏幕截图在应用程序窗口标题和顶部Ubuntu面板上设置(或者不管这个名称):

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