Mac build instructions

After looking and not finding anything meaningful to me, I downloaded a zip of picard-master. Unzipped to a different directory. It’s totally on it’s own.

#!/bin/sh

python3 setup.py build
python3 setup.py build_ext -i
pyinstaller --noconfirm --clean picard.spec

Got the libdiscid complaint. (Why? I don’t know. It’s actually installed according to pip3, brew, /usr/local/bin/libdiscid.0.dylib whatever.
Comment out the two lines if os = darwin libdiscid in picard.spec.

D: 08:46:21,965 tagger.__init__:211: Starting Picard from '/Users/tdiaz/PycharmProjects/picard-master/picard/tagger.py'
D: 08:46:21,966 tagger.__init__:213: Platform: Darwin-18.2.0-x86_64-i386-64bit CPython 3.7.5
D: 08:46:21,966 tagger.__init__:214: Versions: Picard 2.3.0a1, Python 3.7.5, PyQt 5.13.0, Qt 5.13.0, Mutagen 1.42.0, Discid discid 1.2.0, libdiscid 0.6.2, astrcmp C, SSL Secure Transport, macOS Mojave (10.14)
D: 08:46:21,966 tagger.__init__:215: Configuration file path: '/Users/tdiaz/.config/MusicBrainz/Picard.ini'
D: 08:46:21,966 tagger.__init__:217: User directory: '/Users/tdiaz/Library/Preferences/MusicBrainz/Picard'
D: 08:46:21,966 i18n.setup_gettext:69: No module named 'Foundation'
D: 08:46:21,966 i18n.setup_gettext:78: Using locale ''
D: 08:46:21,966 i18n.setup_gettext:80: Loading gettext translation, localedir='/Users/tdiaz/PycharmProjects/picard-master/locale'
D: 08:46:21,966 i18n.setup_gettext:87: [Errno 2] No translation file found for domain: 'picard'
D: 08:46:21,967 i18n.setup_gettext:96: _ = <bound method NullTranslations.gettext of <gettext.NullTranslations object at 0x110612950>>
D: 08:46:21,967 i18n.setup_gettext:97: N_ = <function <lambda> at 0x110135d40>
D: 08:46:21,967 i18n.setup_gettext:98: ngettext = <bound method NullTranslations.ngettext of <gettext.NullTranslations object at 0x110612950>>
D: 08:46:21,967 i18n.setup_gettext:99: gettext_countries = <bound method NullTranslations.gettext of <gettext.NullTranslations object at 0x110612990>>
D: 08:46:21,967 i18n.setup_gettext:100: gettext_attributes = <bound method NullTranslations.gettext of <gettext.NullTranslations object at 0x110612a90>>
D: 08:46:21,970 webservice.set_cache:296: NetworkDiskCache dir: '/Users/tdiaz/Library/Caches/network/' size: 40580 / 104857600
D: 08:46:21,970 pluginmanager.load_plugins_from_directory:218: Looking for plugins in directory '/Users/tdiaz/PycharmProjects/picard-master/picard/plugins', 0 names found
D: 08:46:21,971 pluginmanager.load_plugins_from_directory:218: Looking for plugins in directory '/Users/tdiaz/Library/Preferences/MusicBrainz/Picard/plugins', 32 names found
D: 08:46:21,990 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='acousticbrainz_tonal-rhythm' item=<bound method AcousticBrainz_Key.get_data of <picard.plugins.acousticbrainz_tonal-rhythm.AcousticBrainz_Key object at 0x1107afbd0>>
D: 08:46:21,990 pluginmanager._load_plugin_from_directory:276: Loading plugin 'AcousticBrainz Tonal-Rhythm' version 1.1.3, compatible with API: 2.0
D: 08:46:21,999 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='additional_artists_variables' item=<function make_album_vars at 0x1108534d0>
D: 08:46:21,999 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='additional_artists_variables' item=<function make_track_vars at 0x110853560>
D: 08:46:21,999 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Additional Artists Variables' version 0.4, compatible with API: 2.0, 2.1
D: 08:46:22,017 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='addrelease' item=<picard.plugins.addrelease.AddClusterAsRelease object at 0x1105faa50>
D: 08:46:22,017 plugin.register:54: ExtensionPoint: file_actions register <- plugin='addrelease' item=<picard.plugins.addrelease.AddFileAsRecording object at 0x1105fa870>
D: 08:46:22,017 plugin.register:54: ExtensionPoint: file_actions register <- plugin='addrelease' item=<picard.plugins.addrelease.AddFileAsRelease object at 0x1105fad70>
D: 08:46:22,017 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Add Cluster As Release' version 0.7.3, compatible with API: 2.0
D: 08:46:22,026 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='albumartistextension' item=<function add_artist_std_name at 0x11083b680>
D: 08:46:22,026 pluginmanager._load_plugin_from_directory:276: Loading plugin 'AlbumArtist Extension' version 0.6, compatible with API: 2.0
D: 08:46:22,037 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='apiseeds_lyrics' item=<bound method ApiseedsLyricsMetadataProcessor.process_metadata of <picard.plugins.apiseeds_lyrics.ApiseedsLyricsMetadataProcessor object at 0x110829a50>>
D: 08:46:22,037 plugin.register:54: ExtensionPoint: pages register <- plugin='apiseeds_lyrics' item=<class 'picard.plugins.apiseeds_lyrics.ApiseedsLyricsOptionsPage'>
D: 08:46:22,037 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Apiseeds Lyrics' version 1.0.4, compatible with API: 2.0
D: 08:46:22,053 plugin.register:54: ExtensionPoint: album_actions register <- plugin='cuesheet' item=<picard.plugins.cuesheet.GenerateCuesheet object at 0x116cb32d0>
D: 08:46:22,054 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Generate Cuesheet' version 1.2, compatible with API: 2.0
D: 08:46:22,062 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='decode_cyrillic' item=<picard.plugins.decode_cyrillic.DecodeCyrillic object at 0x116cb35f0>
D: 08:46:22,063 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Decode Cyrillic' version 1.1, compatible with API: 2.0
D: 08:46:22,064 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='discnumber' item=<function remove_discnumbers at 0x11083c320>
D: 08:46:22,064 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Disc Numbers' version 0.1, compatible with API: 2.0
D: 08:46:22,068 plugin.register:54: ExtensionPoint: cover_art_providers register <- plugin='fanarttv' item=<class 'picard.plugins.fanarttv.CoverArtProviderFanartTv'>
D: 08:46:22,068 plugin.register:54: ExtensionPoint: pages register <- plugin='fanarttv' item=<class 'picard.plugins.fanarttv.FanartTvOptionsPage'>
D: 08:46:22,068 pluginmanager._load_plugin_from_directory:276: Loading plugin 'fanart.tv cover art' version 1.5.2, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,074 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='featartistsintitles' item=<function move_album_featartists at 0x110846170>
D: 08:46:22,074 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='featartistsintitles' item=<function move_track_featartists at 0x110846200>
D: 08:46:22,074 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Feat. Artists in Titles' version 0.5, compatible with API: 2.0
D: 08:46:22,084 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='fix_tracknums' item=<picard.plugins.fix_tracknums.FixTrackNumsUsingTitles object at 0x116cb3e10>
D: 08:46:22,084 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='fix_tracknums' item=<picard.plugins.fix_tracknums.FixTrackNumsUsingSeq object at 0x11083a050>
D: 08:46:22,084 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Fix Track Numbers' version 0.2, compatible with API: 2.0
D: 08:46:22,099 plugin.register:54: ExtensionPoint: function_registry register <- plugin='getmulti_value_subset' item=('getmultirange', FunctionRegistryItem(function=<function func_get_multi_range at 0x1108465f0>, eval_args=True, argcount=Bound(lower=2, upper=3)))
D: 08:46:22,099 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Get Multi-value Subset' version 1.0.0, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,111 plugin.register:54: ExtensionPoint: function_registry register <- plugin='islossless' item=('is_lossless', FunctionRegistryItem(function=<function is_lossless at 0x110846a70>, eval_args=True, argcount=Bound(lower=0, upper=0)))
D: 08:46:22,111 plugin.register:54: ExtensionPoint: function_registry register <- plugin='islossless' item=('is_lossy', FunctionRegistryItem(function=<function is_lossy at 0x110846b00>, eval_args=True, argcount=Bound(lower=0, upper=0)))
D: 08:46:22,111 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Tagger script functions is_lossless() and is_lossy()' version 0.1, compatible with API: 2.0
D: 08:46:22,124 plugin.register:54: ExtensionPoint: function_registry register <- plugin='keep' item=('keep', FunctionRegistryItem(function=<function keep at 0x110846cb0>, eval_args=True, argcount=Bound(lower=0, upper=None)))
D: 08:46:22,125 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Keep tags' version 1.1, compatible with API: 2.0
D: 08:46:22,137 plugin.register:54: ExtensionPoint: track_actions register <- plugin='loadasnat' item=<picard.plugins.loadasnat.LoadAsNat object at 0x11083a730>
D: 08:46:22,137 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Load as non-album track' version 0.3, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,150 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='musixmatch' item=<function process_track at 0x11084e440>
D: 08:46:22,150 plugin.register:54: ExtensionPoint: pages register <- plugin='musixmatch' item=<class 'picard.plugins.musixmatch.MusixmatchOptionsPage'>
D: 08:46:22,151 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Musixmatch Lyrics' version 1.1.1, compatible with API: 2.0
D: 08:46:22,172 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='no_release' item=<function no_release_album_processor at 0x116cb9200>
D: 08:46:22,172 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='no_release' item=<function no_release_track_processor at 0x116cb94d0>
D: 08:46:22,173 plugin.register:54: ExtensionPoint: album_actions register <- plugin='no_release' item=<picard.plugins.no_release.NoReleaseAction object at 0x11083af50>
D: 08:46:22,173 plugin.register:54: ExtensionPoint: pages register <- plugin='no_release' item=<class 'picard.plugins.no_release.NoReleaseOptionsPage'>
D: 08:46:22,173 pluginmanager._load_plugin_from_directory:276: Loading plugin 'No release' version 0.3, compatible with API: 2.0
D: 08:46:22,188 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='non_ascii_equivalents' item=<function main at 0x116cb97a0>
D: 08:46:22,188 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='non_ascii_equivalents' item=<function main at 0x116cb97a0>
D: 08:46:22,188 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Non-ASCII Equivalents' version 0.3, compatible with API: 2.0
D: 08:46:22,189 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='padded' item=<function add_padded_tn at 0x116cb99e0>
D: 08:46:22,189 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='padded' item=<function add_padded_dn at 0x116cb9a70>
D: 08:46:22,189 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Padded disc and tracknumbers' version 1.0.1, compatible with API: 2.0
D: 08:46:22,201 plugin.register:54: ExtensionPoint: album_actions register <- plugin='papercdcase' item=<picard.plugins.papercdcase.PaperCdCase object at 0x11083ae10>
D: 08:46:22,201 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='papercdcase' item=<picard.plugins.papercdcase.PaperCdCase object at 0x11083ae10>
D: 08:46:22,201 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Paper CD case' version 1.2.1, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,203 plugin.register:54: ExtensionPoint: album_actions register <- plugin='playlist' item=<picard.plugins.playlist.GeneratePlaylist object at 0x116cb60f0>
D: 08:46:22,203 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Generate M3U playlist' version 1.1, compatible with API: 2.0
D: 08:46:22,204 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='release_type' item=<function add_release_type at 0x116cb8320>
D: 08:46:22,204 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Release Type' version 1.4, compatible with API: 2.0
D: 08:46:22,205 plugin.register:54: ExtensionPoint: album_actions register <- plugin='remove_perfect_albums' item=<picard.plugins.remove_perfect_albums.RemovePerfectAlbums object at 0x116cb6870>
D: 08:46:22,205 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Remove Perfect Albums' version 0.2, compatible with API: 2.0
D: 08:46:22,217 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='replace_forbidden_symbols' item=<function main at 0x116c9e440>
D: 08:46:22,217 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='replace_forbidden_symbols' item=<function main at 0x116c9e440>
D: 08:46:22,217 plugin.register:54: ExtensionPoint: function_registry register <- plugin='replace_forbidden_symbols' item=('replace_forbidden', FunctionRegistryItem(function=<function script_replace_forbidden at 0x116c9e3b0>, eval_args=True, argcount=Bound(lower=1, upper=1)))
D: 08:46:22,217 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Replace Forbidden Symbols' version 0.3, compatible with API: 2.0, 2.2
D: 08:46:22,219 plugin.register:54: ExtensionPoint: file_actions register <- plugin='save_and_rewrite_header' item=<picard.plugins.save_and_rewrite_header.save_and_rewrite_header object at 0x116cb6690>
D: 08:46:22,219 plugin.register:54: ExtensionPoint: track_actions register <- plugin='save_and_rewrite_header' item=<picard.plugins.save_and_rewrite_header.save_and_rewrite_header object at 0x116cb6690>
D: 08:46:22,219 plugin.register:54: ExtensionPoint: album_actions register <- plugin='save_and_rewrite_header' item=<picard.plugins.save_and_rewrite_header.save_and_rewrite_header object at 0x116cb6690>
D: 08:46:22,219 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='save_and_rewrite_header' item=<picard.plugins.save_and_rewrite_header.save_and_rewrite_header object at 0x116cb6690>
D: 08:46:22,219 plugin.register:54: ExtensionPoint: clusterlist_actions register <- plugin='save_and_rewrite_header' item=<picard.plugins.save_and_rewrite_header.save_and_rewrite_header object at 0x116cb6690>
D: 08:46:22,219 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Save and rewrite header' version 0.3, compatible with API: 2.0
D: 08:46:22,234 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='soundtrack' item=<function soundtrack at 0x116c9e7a0>
D: 08:46:22,234 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Soundtrack' version 0.2, compatible with API: 2.0
D: 08:46:22,242 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='standardise_feat' item=<function standardise_track_artist at 0x116c9edd0>
D: 08:46:22,242 plugin.register:54: ExtensionPoint: album_metadata_processors register <- plugin='standardise_feat' item=<function standardise_album_artist at 0x116c9ee60>
D: 08:46:22,242 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Standardise Feat.' version 0.2, compatible with API: 2.0
D: 08:46:22,278 plugin.register:54: ExtensionPoint: cover_art_providers register <- plugin='theaudiodb' item=<class 'picard.plugins.theaudiodb.CoverArtProviderTheAudioDb'>
D: 08:46:22,278 plugin.register:54: ExtensionPoint: pages register <- plugin='theaudiodb' item=<class 'picard.plugins.theaudiodb.TheAudioDbOptionsPage'>
D: 08:46:22,278 pluginmanager._load_plugin_from_directory:276: Loading plugin 'TheAudioDB cover art' version 1.0.2, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,279 plugin.register:54: ExtensionPoint: cluster_actions register <- plugin='tracks2clipboard' item=<picard.plugins.tracks2clipboard.CopyClusterToClipboard object at 0x116cb6e10>
D: 08:46:22,280 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Copy Cluster to Clipboard' version 1.0, compatible with API: 2.0
D: 08:46:22,298 plugin.register:54: ExtensionPoint: formats register <- plugin='videotools' item=<class 'picard.plugins.videotools.MatroskaFile'>
D: 08:46:22,298 plugin.register:54: ExtensionPoint: formats register <- plugin='videotools' item=<class 'picard.plugins.videotools.MpegFile'>
D: 08:46:22,298 plugin.register:54: ExtensionPoint: formats register <- plugin='videotools' item=<class 'picard.plugins.videotools.QuickTimeFile'>
D: 08:46:22,298 plugin.register:54: ExtensionPoint: formats register <- plugin='videotools' item=<class 'picard.plugins.videotools.RiffFile'>
D: 08:46:22,298 plugin.register:54: ExtensionPoint: function_registry register <- plugin='videotools' item=('is_audio', FunctionRegistryItem(function=<function is_audio at 0x116cbc440>, eval_args=True, argcount=Bound(lower=0, upper=0)))
D: 08:46:22,299 plugin.register:54: ExtensionPoint: function_registry register <- plugin='videotools' item=('is_video', FunctionRegistryItem(function=<function is_video at 0x116cbc3b0>, eval_args=True, argcount=Bound(lower=0, upper=0)))
D: 08:46:22,299 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Video tools' version 0.4, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,314 plugin.register:54: ExtensionPoint: file_actions register <- plugin='viewvariables' item=<picard.plugins.viewvariables.ViewVariables object at 0x116ca3190>
D: 08:46:22,314 plugin.register:54: ExtensionPoint: track_actions register <- plugin='viewvariables' item=<picard.plugins.viewvariables.ViewVariables object at 0x116ca3190>
D: 08:46:22,314 pluginmanager._load_plugin_from_directory:276: Loading plugin 'View script variables' version 0.7, compatible with API: 2.0
D: 08:46:22,339 plugin.register:54: ExtensionPoint: track_metadata_processors register <- plugin='wikidata' item=<bound method Wikidata.process_track of <picard.plugins.wikidata.Wikidata object at 0x116dcac10>>
D: 08:46:22,339 plugin.register:54: ExtensionPoint: pages register <- plugin='wikidata' item=<class 'picard.plugins.wikidata.WikidataOptionsPage'>
D: 08:46:22,339 pluginmanager._load_plugin_from_directory:276: Loading plugin 'Wikidata Genre' version 1.4.2, compatible with API: 2.0, 2.1, 2.2
D: 08:46:22,339 ui.playertoolbar.__init__:89: Internal player: QtMultimedia available, initializing QMediaPlayer
D: 08:46:22,343 ui.playertoolbar.__init__:96: Internal player: available, QMediaPlayer set up
D: 08:46:22,513 tagger.main:928: Looking for Qt locale C in /usr/local/lib/python3.7/site-packages/PyQt5/Qt/translations
D: 08:46:22,514 tagger.main:932: Qt locale C not available
D: 08:46:22,514 browser.browser.start:69: Starting the browser integration (127.0.0.1:8001)
D: 08:46:22,522 ui.mainwindow.auto_update_check:1203: Skipping start-up check for program updates.  Today: 2019-12-16, Last check: 2019-11-21 (Check interval: 7 days), Update level: 2 (dev)
D: 08:46:22,715 webservice.ratecontrol.get_delay_to_next_request:110: ('musicbrainz.org', 443): First request
D: 08:46:22,715 webservice.ratecontrol.increment_requests:135: ('musicbrainz.org', 443): Incrementing requests to: 1
D: 08:46:24,255 webservice.ratecontrol.decrement_requests:143: ('musicbrainz.org', 443): Decrementing requests to: 0
D: 08:46:24,255 webservice._handle_reply:413: Received reply for https://musicbrainz.org:443/ws/2/collection: HTTP 200 (OK) 
D: 08:46:24,255 collection.request_finished:137: User collections: []
D: 08:46:24,255 webservice.ratecontrol._out_of_backoff:226: ('musicbrainz.org', 443): oobackoff; delay: 1000ms -> 1000ms; slow start; window size 1.000 -> 2.000
E: 08:46:37,042 ui.options.dialog.__init__:128: Failed initializing options page <picard.ui.options.interface_colors.InterfaceColorsOptionsPage object at 0x11536d050>
AttributeError: __getattribute__

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "./picard/ui/options/dialog.py", line 125, in __init__
    page = Page(self.ui.pages_stack)
  File "./picard/ui/options/interface_top_tags.py", line 53, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_options_interface_top_tags.py", line 21, in setupUi
    self.top_tags_list = TagListEditor(InterfaceTopTagsOptionsPage)
  File "./picard/ui/widgets/taglisteditor.py", line 38, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_widget_taglisteditor.py", line 68, in setupUi
    QtCore.QMetaObject.connectSlotsByName(TagListEditor)
SystemError: <built-in function connectSlotsByName> returned a result with an error set
D: 08:46:38,200 coverart.providers.cover_art_providers:96: CA Providers order: Local Files [x] > Cover Art Archive [x] > TheAudioDB [x] > fanart.tv [x] > CaaReleaseGroup [x] > Whitelist [x]
D: 08:46:45,398 webservice.ratecontrol.get_delay_to_next_request:110: ('picard.musicbrainz.org', 443): First request
D: 08:46:45,398 webservice.ratecontrol.increment_requests:135: ('picard.musicbrainz.org', 443): Incrementing requests to: 1
D: 08:46:46,193 webservice.ratecontrol.decrement_requests:143: ('picard.musicbrainz.org', 443): Decrementing requests to: 0
D: 08:46:46,194 webservice._handle_reply:413: Received reply for https://picard.musicbrainz.org:443/api/v2/plugins/: HTTP 200 (OK) 
D: 08:46:46,252 webservice.ratecontrol._out_of_backoff:226: ('picard.musicbrainz.org', 443): oobackoff; delay: 1000ms -> 1000ms; slow start; window size 1.000 -> 2.000
E: 08:47:01,057 ui.options.dialog.__init__:128: Failed initializing options page <picard.ui.options.about.AboutOptionsPage object at 0x138854190>
AttributeError: __getattribute__

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "./picard/ui/options/dialog.py", line 125, in __init__
    page = Page(self.ui.pages_stack)
  File "./picard/ui/options/advanced.py", line 52, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_options_advanced.py", line 92, in setupUi
    self.compare_ignore_tags = TagListEditor(AdvancedOptionsPage)
  File "./picard/ui/widgets/taglisteditor.py", line 38, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_widget_taglisteditor.py", line 68, in setupUi
    QtCore.QMetaObject.connectSlotsByName(TagListEditor)
SystemError: <built-in function connectSlotsByName> returned a result with an error set
E: 08:47:01,069 ui.options.dialog.__init__:128: Failed initializing options page <picard.ui.options.interface_colors.InterfaceColorsOptionsPage object at 0x13585a370>
AttributeError: __getattribute__

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "./picard/ui/options/dialog.py", line 125, in __init__
    page = Page(self.ui.pages_stack)
  File "./picard/ui/options/interface_top_tags.py", line 53, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_options_interface_top_tags.py", line 21, in setupUi
    self.top_tags_list = TagListEditor(InterfaceTopTagsOptionsPage)
  File "./picard/ui/widgets/taglisteditor.py", line 38, in __init__
    self.ui.setupUi(self)
  File "./picard/ui/ui_widget_taglisteditor.py", line 68, in setupUi
    QtCore.QMetaObject.connectSlotsByName(TagListEditor)
SystemError: <built-in function connectSlotsByName> returned a result with an error set
D: 08:47:01,135 coverart.providers.cover_art_providers:96: CA Providers order: Local Files [x] > Cover Art Archive [x] > TheAudioDB [x] > fanart.tv [x] > CaaReleaseGroup [x] > Whitelist [x]

I get a similar result from building/running from picard-master as well.

…and libdiscid can go ID itself in a dark corner, whatever it’s problem is. I can run it from source and not get an error, but it won’t build.

… and I’ve noticed now that everything I’m building has “Other Versions” dimmed in the menu. Even the one built from the straight from latest picard-master. Perhaps that’s related to whatever is going on with the UI initialization too.

I can’t reproduce these errors on the options page, works here on my mac without issue. Similar versions also:

Picard 2.3.0a1, Python 3.7.5, PyQt 5.13.2, Qt 5.13.2, Mutagen 1.43.0, Discid discid 1.2.0, libdiscid 0.6.2, astrcmp C, SSL Secure Transport, macOS 10.15

I also don’t have any good idea what is happening other than maybe some Qt5 incompatibility with something.

Does a recent build like e.g. the one you can get from Release MusicBrainz Picard 2.3.0alpha1 · metabrainz/picard · GitHub have the same issue?

“Other versions” being grayed out seems to be a general issue with the current development version, though. I’ll investigate.

EDIT: Fix in Fix "Other versions" context menu not being active by phw · Pull Request #1419 · metabrainz/picard · GitHub , but definitely unrelated to your issues with the options dialog.

1 Like

Okay, using the distributed build, no- that works for me.

MusicBrainz Picard
Version 2.3.0a1
Python 3.7.5
PyQt 5.13.2
Qt 5.13.2
Mutagen 1.43.0
Discid discid 1.2.0, libdiscid 0.6.2
astrcmp C
SSL Secure Transport, macOS Mojave (10.14) 

OTOH, my environment shows:

picard-17500mph
Picard 2.3.0.dev1, Python 3.7.5, PyQt 5.13.0, Qt 5.13.0, Mutagen 1.42.0, Discid discid 1.2.0, 
libdiscid 0.6.2, astrcmp C, SSL Secure Transport, macOS Mojave (10.14)
picard-master
Picard 2.3.0a1,     Python 3.7.5, PyQt 5.13.0, Qt 5.13.0, Mutagen 1.42.0, Discid discid 1.2.0, 
libdiscid 0.6.2, astrcmp C, SSL Secure Transport, macOS Mojave (10.14)

Maybe something has changed within those releases then.

If I roll back to the build that had the original deployment of Top Tags I can build it. But when the change to move it all a couple days later was applied, I get what you see.


Interestingly, too: The first time I view the Options it shows “Advanced”, but no “Top Tags”. But when I exit and go back, “Advanced” is gone and there are more artifacts.

My local build is the secondary instance that is visible.

Updating Qt5 (5.13.8) didn’t make a difference. I can’t imagine Mutagen having any affect on UI.

But for whatever reason, I’m not able to build that with the changed method of setting it up.
So something after #1371 changed to where combining it with the taglisteditor widget in #1379

Time for some more brute force backwards learning. :wink:

The part that gets me is building from picard-master as is from musicbrainz/picard gives me the same result.

The only thing in common is my Picard.ini, which I also removed, tried with letting a new .ini be created in case there was something affecting it from within.

Unless variables from some kind of setting/environment option (??) is doing it. The builds are in separate directories, separate git checkouts.

The only other thing I did differently between when it was building properly and not was, when applying changes from musicbrainz/picard commits, PyCharm wouldn’t open the files that end in .ui, and I didn’t see the ‘don’t edit, use build_ui’ in the others. Since macOS was offering to open those .ui files with Qt Designer, I figured “okay, lets see what this does” …

It loaded up, I saw a wireframe setup of the section of the Options window for top_tags and commented to myself, “Okay, Something else to learn when I get to the point of doing UI layout stuff. This must be how that is done” (and I quit Qt Designer).

So I just merged the source files figuring that I am not making changes, those changes were done by you, and anything that build_ui was going to do ended up in ASCII form, and merged.

But it was after that next time that a ran from source, that the options window was improperly drawn.

Thats when I took a zip file from GitHub, put that in a different directory, and built it. I figured that “whatever I screwed up” … “would not be present in a clean source tree”.

Except, it was. So running Qt Designer, loading that one file, looking at it, and quitting managed to change something that is affecting building of ‘anything’ python?

I get an “unused import statement” warning from PyCharm for for all the picard.ui.options imports in dialog.py. No where else in any code segment do I see that.