Opened 3 months ago

Closed 3 months ago

Last modified 3 months ago

#18360 closed defect (fixed)

PySide6: AttributeError: 'AtomicStructureListWidget' object has no attribute 'SingleSelection'

Reported by: Eric Pettersen Owned by: Zach Pearson
Priority: normal Milestone:
Component: Window Toolkit Version:
Keywords: Cc: chimerax-programmers
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        macOS-15.5-arm64-arm-64bit
ChimeraX Version: 1.11.dev202508010600 (2025-08-01 06:00:49 UTC)
Description
Another PySide problem

Log:
UCSF ChimeraX version: 1.11.dev202508010600 (2025-08-01)  
© 2016-2025 Regents of the University of California. All rights reserved.  
How to cite UCSF ChimeraX  

> open 1mtx

1mtx title:  
Determination of the three-dimensional structure of margatoxin by 1H, 13C, 15N
triple-resonance nuclear magnetic resonance spectroscopy [more info...]  
  
Chain information for 1mtx  
---  
Chain | Description | UniProt  
1.1/A 1.2/A 1.3/A 1.4/A 1.5/A 1.6/A 1.7/A 1.8/A 1.9/A 1.10/A 1.11/A 1.12/A 1.13/A 1.14/A 1.15/A 1.16/A 1.17/A 1.18/A 1.19/A 1.20/A 1.21/A 1.22/A 1.23/A | MARGATOXIN | SCKM_CENMA 1-39  
  

> ui tool show Matchmaker

Traceback (most recent call last):  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/toolshed/info.py", line 571, in start_tool  
ti = api._api_caller.start_tool(api, session, self, tool_info)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/toolshed/__init__.py", line 1400, in start_tool  
return cls._get_func(api, "start_tool")(session, ti.name)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/match_maker/__init__.py", line 44, in start_tool  
return MatchMakerTool(session, tool_name)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/match_maker/tool.py", line 58, in __init__  
self.ref_structure_list = AtomicStructureListWidget(session,
selection_mode='single')  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/atomic/widgets.py", line 40, in __init__  
super().__init__(session, class_filter=AtomicStructure, **kw)  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/ui/widgets/item_chooser.py", line 298, in __init__  
super().__init__(**_process_model_kw(session, **kw))  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/ui/widgets/item_chooser.py", line 117, in __init__  
self.setSelectionMode({'single': self.SingleSelection, 'extended':
self.ExtendedSelection,  
^^^^^^^^^^^^^^^^^^^^  
AttributeError: 'AtomicStructureListWidget' object has no attribute
'SingleSelection'  
  
During handling of the above exception, another exception occurred:  
  
Traceback (most recent call last):  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/ui/gui.py", line 1891, in <lambda>  
run(ses, "ui tool show %s" % StringArg.unparse(tool_name)))  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/commands/run.py", line 49, in run  
results = command.run(text, log=log, return_json=return_json)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/commands/cli.py", line 3230, in run  
result = ci.function(session, **kw_args)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/ui/cmd.py", line 219, in ui_tool_show  
return bi.start_tool(session, name)  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/toolshed/info.py", line 578, in start_tool  
raise ToolshedError(  
chimerax.core.toolshed.ToolshedError: start_tool() failed for tool Matchmaker
in bundle ChimeraX-MatchMaker:  
'AtomicStructureListWidget' object has no attribute 'SingleSelection'  
  
chimerax.core.toolshed.ToolshedError: start_tool() failed for tool Matchmaker
in bundle ChimeraX-MatchMaker:  
'AtomicStructureListWidget' object has no attribute 'SingleSelection'  
  
File
"/Users/chimera/Applications/ChimeraX_Daily.app/Contents/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-
packages/chimerax/core/toolshed/info.py", line 578, in start_tool  
raise ToolshedError(  
  
See log for complete Python traceback.  
  




OpenGL version: 4.1 Metal - 89.4
OpenGL renderer: Apple M1 Max
OpenGL vendor: Apple

Python: 3.11.9
Locale: en_US.UTF-8
Qt version: PySide6 6.9.1, Qt 6.9.1
Qt runtime version: 6.9.1
Qt platform: cocoa
Hardware:

    Hardware Overview:

      Model Name: Mac Studio
      Model Identifier: Mac13,1
      Model Number: Z14J0008FLL/A
      Chip: Apple M1 Max
      Total Number of Cores: 10 (8 performance and 2 efficiency)
      Memory: 32 GB
      System Firmware Version: 11881.121.1
      OS Loader Version: 11881.121.1

Software:

    System Software Overview:

      System Version: macOS 15.5 (24F74)
      Kernel Version: Darwin 24.5.0
      Time since boot: 73 days, 17 hours, 13 minutes

Graphics/Displays:

    Apple M1 Max:

      Chipset Model: Apple M1 Max
      Type: GPU
      Bus: Built-In
      Total Number of Cores: 24
      Vendor: Apple (0x106b)
      Metal Support: Metal 3
      Displays:
        PHL 279P1:
          Resolution: 5120 x 2880 (5K/UHD+ - Ultra High Definition Plus)
          UI Looks like: 2560 x 1440 @ 60.00Hz
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported


Installed Packages:
    alabaster: 1.0.0
    appdirs: 1.4.4
    appnope: 0.1.4
    asttokens: 3.0.0
    babel: 2.17.0
    beautifulsoup4: 4.13.4
    blockdiag: 3.0.0
    blosc2: 3.6.1
    build: 1.2.2.post1
    certifi: 2025.7.14
    cftime: 1.6.4.post1
    charset-normalizer: 3.4.2
    ChimeraX-AddCharge: 1.5.19
    ChimeraX-AddH: 2.2.7
    ChimeraX-AlignmentAlgorithms: 2.0.2
    ChimeraX-AlignmentHdrs: 3.6.1
    ChimeraX-AlignmentMatrices: 2.1
    ChimeraX-Alignments: 3.0
    ChimeraX-AlphaFold: 1.0.1
    ChimeraX-AltlocExplorer: 1.1.2
    ChimeraX-AmberInfo: 1.0
    ChimeraX-Aniso: 1.3.2
    ChimeraX-Arrays: 1.1
    ChimeraX-Atomic: 1.60.10
    ChimeraX-AtomicLibrary: 14.1.21
    ChimeraX-AtomSearch: 2.0.1
    ChimeraX-AxesPlanes: 2.4
    ChimeraX-BasicActions: 1.1.3
    ChimeraX-BILD: 1.0
    ChimeraX-BlastProtein: 3.0.0
    ChimeraX-Boltz: 1.1
    ChimeraX-BondRot: 2.0.4
    ChimeraX-BugReporter: 1.0.2
    ChimeraX-BuildStructure: 2.13.1
    ChimeraX-Bumps: 1.0
    ChimeraX-BundleBuilder: 1.5.1
    ChimeraX-ButtonPanel: 1.0.1
    ChimeraX-CageBuilder: 1.0.1
    ChimeraX-CellPack: 1.0
    ChimeraX-Centroids: 1.4
    ChimeraX-ChangeChains: 1.1
    ChimeraX-CheckWaters: 1.5
    ChimeraX-ChemGroup: 2.0.2
    ChimeraX-Clashes: 2.3
    ChimeraX-ColorActions: 1.0.5
    ChimeraX-ColorGlobe: 1.0
    ChimeraX-ColorKey: 1.5.8
    ChimeraX-CommandLine: 1.3.0
    ChimeraX-ConnectStructure: 2.0.1
    ChimeraX-Contacts: 1.0.1
    ChimeraX-Core: 1.11.dev202508010600
    ChimeraX-CoreFormats: 1.2
    ChimeraX-coulombic: 1.4.5
    ChimeraX-Crosslinks: 1.0
    ChimeraX-Crystal: 1.0
    ChimeraX-CrystalContacts: 1.0.1
    ChimeraX-DataFormats: 1.2.4
    ChimeraX-Dicom: 1.2.7
    ChimeraX-DistMonitor: 1.4.2
    ChimeraX-DockPrep: 1.1.4
    ChimeraX-Dssp: 2.0
    ChimeraX-EMDB-SFF: 1.0
    ChimeraX-ESMFold: 1.0
    ChimeraX-FileHistory: 1.0.1
    ChimeraX-FunctionKey: 1.0.1
    ChimeraX-Geometry: 1.3
    ChimeraX-gltf: 1.0
    ChimeraX-Graphics: 1.4.1
    ChimeraX-Hbonds: 2.5.3
    ChimeraX-Help: 1.3
    ChimeraX-HKCage: 1.3
    ChimeraX-IHM: 1.1
    ChimeraX-ImageFormats: 1.2
    ChimeraX-IMOD: 1.0
    ChimeraX-IO: 1.0.4
    ChimeraX-ItemsInspection: 1.0.1
    ChimeraX-IUPAC: 1.0
    ChimeraX-KVFinder: 1.7.1
    ChimeraX-Label: 1.1.14
    ChimeraX-ListInfo: 1.2.2
    ChimeraX-locscalesurfer: 0.1.1
    ChimeraX-Log: 1.2
    ChimeraX-LookingGlass: 1.1
    ChimeraX-Maestro: 1.9.1
    ChimeraX-Map: 1.3
    ChimeraX-MapData: 2.0
    ChimeraX-MapEraser: 1.0.1
    ChimeraX-MapFilter: 2.0.1
    ChimeraX-MapFit: 2.0
    ChimeraX-MapSeries: 2.1.1
    ChimeraX-Markers: 1.0.1
    ChimeraX-Mask: 1.0.2
    ChimeraX-MatchMaker: 2.2.2
    ChimeraX-MCopy: 1.0
    ChimeraX-MDcrds: 2.15
    ChimeraX-MedicalToolbar: 1.1
    ChimeraX-Meeting: 1.0.1
    ChimeraX-Minimize: 1.1
    ChimeraX-MLP: 1.1.1
    ChimeraX-mmCIF: 2.16
    ChimeraX-MMTF: 2.2
    ChimeraX-ModelArchive: 1.0
    ChimeraX-Modeller: 1.5.22
    ChimeraX-ModelPanel: 1.5.1
    ChimeraX-ModelSeries: 1.0.1
    ChimeraX-Mol2: 2.0.3
    ChimeraX-Mole: 1.0
    ChimeraX-Morph: 1.0.2
    ChimeraX-MouseModes: 1.2
    ChimeraX-Movie: 1.0.1
    ChimeraX-MutationScores: 1.0
    ChimeraX-Neuron: 1.0
    ChimeraX-Nifti: 1.2
    ChimeraX-NMRSTAR: 1.0.2
    ChimeraX-NRRD: 1.2
    ChimeraX-Nucleotides: 2.0.3
    ChimeraX-OpenCommand: 1.15.1
    ChimeraX-OrthoPick: 1.0.1
    ChimeraX-PDB: 2.7.10
    ChimeraX-PDBBio: 1.0.1
    ChimeraX-PDBLibrary: 1.0.4
    ChimeraX-PDBMatrices: 1.0
    ChimeraX-PickBlobs: 1.0.1
    ChimeraX-Positions: 1.0
    ChimeraX-PresetMgr: 1.1.3
    ChimeraX-ProfileGrids: 1.1.4
    ChimeraX-PubChem: 2.2
    ChimeraX-ReadPbonds: 1.0.1
    ChimeraX-Registration: 1.1.2
    ChimeraX-RemoteControl: 1.0
    ChimeraX-RenderByAttr: 1.6.4
    ChimeraX-RenumberResidues: 1.1
    ChimeraX-ResidueFit: 1.0.1
    ChimeraX-RestServer: 1.3.1
    ChimeraX-RNALayout: 1.0
    ChimeraX-RotamerLibMgr: 4.0
    ChimeraX-RotamerLibsDunbrack: 2.0
    ChimeraX-RotamerLibsDynameomics: 2.0
    ChimeraX-RotamerLibsRichardson: 2.0
    ChimeraX-SaveCommand: 1.5.2
    ChimeraX-SchemeMgr: 1.0
    ChimeraX-SDF: 2.0.3
    ChimeraX-Segger: 1.0
    ChimeraX-Segment: 1.0.1
    ChimeraX-Segmentations: 3.5.7
    ChimeraX-SelInspector: 1.0
    ChimeraX-SeqView: 2.17.2
    ChimeraX-Shape: 1.1
    ChimeraX-Shell: 1.0.1
    ChimeraX-Shortcuts: 1.2.1
    ChimeraX-ShowSequences: 1.0.3
    ChimeraX-SideView: 1.0.1
    ChimeraX-SimilarStructures: 1.0.1
    ChimeraX-Smiles: 2.1.2
    ChimeraX-SmoothLines: 1.0
    ChimeraX-SpaceNavigator: 1.0
    ChimeraX-StdCommands: 1.19.1
    ChimeraX-STL: 1.0.1
    ChimeraX-Storm: 1.0
    ChimeraX-StructMeasure: 1.2.1
    ChimeraX-Struts: 1.0.1
    ChimeraX-Surface: 1.0.1
    ChimeraX-SwapAA: 2.0.1
    ChimeraX-SwapRes: 2.5.2
    ChimeraX-TapeMeasure: 1.0
    ChimeraX-TaskManager: 1.0
    ChimeraX-Test: 1.0
    ChimeraX-Toolbar: 1.2.3
    ChimeraX-ToolshedUtils: 1.2.4
    ChimeraX-Topography: 1.0
    ChimeraX-ToQuest: 1.0
    ChimeraX-Tug: 1.0.1
    ChimeraX-UI: 1.47
    ChimeraX-Umap: 1.0
    ChimeraX-uniprot: 2.3.1
    ChimeraX-UnitCell: 1.0.1
    ChimeraX-ViewDock: 1.1
    ChimeraX-VIPERdb: 1.0
    ChimeraX-Vive: 1.1
    ChimeraX-VolumeMenu: 1.0.1
    ChimeraX-vrml: 1.0
    ChimeraX-VTK: 1.0
    ChimeraX-WavefrontOBJ: 1.0
    ChimeraX-WebCam: 1.0.2
    ChimeraX-WebServices: 1.1.5
    ChimeraX-Zone: 1.0.1
    colorama: 0.4.6
    comm: 0.2.3
    contourpy: 1.3.3
    coverage: 7.10.1
    cxservices: 1.2.3
    cycler: 0.12.1
    Cython: 3.1.2
    debugpy: 1.8.15
    decorator: 5.2.1
    docutils: 0.21.2
    einops: 0.3.2
    executing: 2.2.0
    filelock: 3.18.0
    fonttools: 4.59.0
    fsspec: 2025.5.0
    funcparserlib: 2.0.0a0
    glfw: 2.9.0
    grako: 3.16.5
    h5py: 3.14.0
    html2text: 2024.2.26
    idna: 3.10
    ihm: 2.2
    imagecodecs: 2024.6.1
    imagesize: 1.4.1
    iniconfig: 2.1.0
    ipykernel: 6.29.5
    ipython: 8.26.0
    ipywidgets: 8.1.7
    jedi: 0.19.1
    Jinja2: 3.1.6
    jupyter_client: 8.6.3
    jupyter_core: 5.8.1
    jupyterlab_widgets: 3.0.15
    kiwisolver: 1.4.8
    line_profiler: 5.0.0
    lxml: 5.3.1
    lz4: 4.3.2
    Markdown: 3.8.2
    MarkupSafe: 3.0.2
    matplotlib: 3.10.1
    matplotlib-inline: 0.1.7
    mpmath: 1.3.0
    mrcfile: 1.3.0
    msgpack: 1.1.0
    narwhals: 1.41.0
    ndindex: 1.10.0
    nest-asyncio: 1.6.0
    netCDF4: 1.6.5
    networkx: 3.3
    nibabel: 5.2.0
    nptyping: 2.5.0
    numexpr: 2.11.0
    numpy: 2.2.6
    numpy: 1.26.4
    OpenMM: 8.2.0
    openvr: 1.26.701
    packaging: 24.2
    ParmEd: 4.2.2
    parso: 0.8.4
    pep517: 0.13.1
    pexpect: 4.9.0
    pickleshare: 0.7.5
    pillow: 10.4.0
    pip: 25.2
    pkginfo: 1.11.1
    platformdirs: 4.3.8
    plotly: 6.0.1
    pluggy: 1.6.0
    prompt_toolkit: 3.0.51
    psutil: 7.0.0
    ptyprocess: 0.7.0
    pure_eval: 0.2.3
    py-cpuinfo: 9.0.0
    pycollada: 0.8
    pydicom: 2.4.4
    Pygments: 2.18.0
    pyKVFinder: 0.8.1
    pynmrstar: 3.3.5
    pynrrd: 1.0.0
    PyOpenGL: 3.1.9
    PyOpenGL-accelerate: 3.1.9
    pyopenxr: 1.1.4501
    pyparsing: 3.2.3
    pyproject_hooks: 1.2.0
    PySide6: 6.9.1
    PySide6_Addons: 6.9.1
    PySide6_Essentials: 6.9.1
    pytest: 8.4.1
    pytest-cov: 6.2.1
    python-dateutil: 2.9.0.post0
    pytz: 2025.2
    pyzmq: 27.0.0
    qtconsole: 5.5.2
    QtPy: 2.4.3
    qtshim: 1.1
    RandomWords: 0.4.0
    requests: 2.32.4
    roman-numerals-py: 3.1.0
    scipy: 1.10.1
    scipy: 1.14.0
    setuptools: 80.9.0
    sfftk-rw: 0.8.1
    shiboken6: 6.9.1
    six: 1.17.0
    snowballstemmer: 3.0.1
    sortedcontainers: 2.4.0
    soupsieve: 2.7
    Sphinx: 8.2.3
    sphinx-autodoc-typehints: 3.1.0
    sphinxcontrib-applehelp: 2.0.0
    sphinxcontrib-blockdiag: 3.0.0
    sphinxcontrib-devhelp: 2.0.0
    sphinxcontrib-htmlhelp: 2.1.0
    sphinxcontrib-jsmath: 1.0.1
    sphinxcontrib-qthelp: 2.0.0
    sphinxcontrib-serializinghtml: 2.0.0
    stack-data: 0.6.3
    superqt: 0.7.5
    sympy: 1.14.0
    tables: 3.10.2
    tcia_utils: 1.5.1
    tifffile: 2025.3.13
    timm: 0.4.12
    tinyarray: 1.2.5
    tomlkit: 0.13.2
    torch: 2.2.2
    torchvision: 0.17.2
    tornado: 6.5.1
    tqdm: 4.66.6
    traitlets: 5.14.3
    typing_extensions: 4.14.1
    tzdata: 2025.2
    urllib3: 2.5.0
    wcwidth: 0.2.13
    webcolors: 24.11.1
    wheel: 0.45.1
    wheel-filename: 1.4.2
    widgetsnbextension: 4.0.14

Change History (8)

comment:1 by Eric Pettersen, 3 months ago

Cc: chimerax-programmers added
Component: UnassignedWindow Toolkit
Owner: set to Zach Pearson
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionPySide6: AttributeError: 'AtomicStructureListWidget' object has no attribute 'SingleSelection'

comment:2 by Zach Pearson, 3 months ago

Resolution: fixed
Status: assignedclosed

Using the enum from QAbstractItemView works for both PyQt6 and PySide6.

comment:3 by Eric Pettersen, 3 months ago

Really? So instead of self.SingleSelection I have to use QAbstractItemView.SelectionMode.SingleSelection? Seems like a PITA.

comment:4 by Eric Pettersen, 3 months ago

It seems like if we are going to seriously use PySide6, we should have something in the shim equivalent to the promote_enums() call that we already do for PyQt6.

That would avoid these ridiculously long qualified names.

comment:5 by Zach Pearson, 3 months ago

Well, no, now that I've reviewed QItemList, the SelectionMode enum is also in QItemList. I wasn't able to find it on that widget's page in PySide6's documentation. I guess if something inherits from something else they feel no need to duplicate documentation.

I don't see an equivalent promote_enums function from qtpy for PySide6, the project from which we took our current promote_enums function for PyQt. We'd have to write one.

I don't find the enums all that annoying. If you have a language server in your editor, self.Se<TAB>S<TAB> is even shorter than typing out SingleSelection.

comment:6 by Eric Pettersen, 3 months ago

My editor does not have a builtin language server, and suspect many extension developers wouldn't have one either. The whole point of having a shim is so that your code doesn't break when the shim switches from one toolkit to another, so we should strive to have code that worked when PyQt was under the hood also work when PySide6 is under the hood. So we should investigate implementing a PySide version of promote_enums(). It seemed doable after a cursory look at the PyQt version, but maybe I missed something. I can try to implement it tomorrow.

comment:7 by Zach Pearson, 3 months ago

I reverted the previous patch, and added a promote_enums equivalent for PySide6 to the shim.

comment:8 by Eric Pettersen, 3 months ago

Excellent! This also saves us from playing whack-a-mole as users exercise lesser-used code paths that also have this problem over the coming weeks and months.

Note: See TracTickets for help on using tickets.