• Stars
    star
    2,587
  • Rank 17,718 (Top 0.4 %)
  • Language
    Python
  • License
    BSD 3-Clause "New...
  • Created over 5 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Cross platform GUI plist editor written in python.

What is it?

ProperTree is a cross-platform GUI plist editor written using Python (compatible with both 2.x and 3.x) and Tkinter.

Features

  • Cross-platform - should work anywhere python and tkinter do
  • Document-based to support multiple windows
  • Node drag and drop to reorder
  • Copy and paste
  • Find/Replace - allows searching keys or values
  • Ordered - or unordered - dictionary support
  • Full undo-redo stack
  • Backported support for binary property lists and unicode in python 2
  • Expanded integer casting to allow for hex integers (eg. 0xFFFF) in xml <integer> tags
  • Context-aware right-click menu that includes template info to OpenCore or Clover config.plist files
  • OC (Clean) Snapshot to walk the contents of ACPI, Drivers, Kexts, and Tools for OpenCore config.plist files
  • Value converter that supports Base64, Hex, Ascii, and Decimal

Getting ProperTree

Downloading The Repo As A ZIP File

On any system you can choose the green Code button, followed by the Download ZIP button (or click here) to download the entire repo as a zip file (note, this does not allow you to update via git pull - any updates would require you to download the repo again in the same fashion).

Cloning The Repo Via Git

On *nix systems:

git clone https://github.com/corpnewt/ProperTree
python ./ProperTree/ProperTree.py
- or -
python3 ./ProperTree/ProperTree.py

* On macOS, you can simply double-click the ProperTree.command after cloning to launch.

On Windows:

git clone https://github.com/corpnewt/ProperTree
./ProperTree/ProperTree.bat

FAQ

  • What does OC Snapshot do?

    The OC Snapshot function will prompt you to select an OC folder, then walk the contents of the ACPI, Kexts, Tools, and Drivers directories within that folder - comparing all entries to the current document's ACPI -> Add, Kernel -> Add, Misc -> Tools, and UEFI -> Drivers respectively. It will add or remove entries as needed, and also ensures kext load order by comparing each kext's CFBundleIdentifier to all other kexts' OSBundleLibraries within their Info.plist - making sure that any kext that is relied on by others is loaded before them. It will also warn if it detects duplicate CFBundleIdentifiers (with support for MinKernel, MaxKernel, and MatchKernel overlap checks), and offer to disable all after the first found. It checks for disabled parent kexts with enabled child kexts as well. The schema used is (by default) determined by comparing the MD5 hash of the OpenCore.efi file to a known list of Acidanthera debug/release versions. If the MD5 hash does not match any known version, it will fall back to the newest schema in the script's snapshot.plist. This behavior can be customized in the Settings per the OC Snapshot Target Version menu.

  • What is the difference between OC Snapshot and OC Clean Snapshot?

    Both snapshot variants accomplish the same tasks - they just leverage different starting points. An OC Clean Snapshot will first clear out ACPI -> Add, Kernel -> Add, Misc -> Tools, and UEFI -> Drivers, then add everything from within the respective ACPI, Kexts, Tools, and Drivers directory anew. A regular OC Snapshot starts with the information within the current document for those four locations, and only pulls changes - adding and removing entries as needed.

  • When should I use an OC Clean Snapshot vs an OC Snapshot?

    Typically, an OC Clean Snapshot should only be used the first time you snapshot to ensure any sample entries in the config.plist are removed and added anew. Every subsequent snapshot should be a regular OC Snapshot to ensure any customizations you've made are preserved.

  • ProperTree opens a black window on macOS Monterey (12.x) and Newer

    It appears the default tk implementation that ships with macOS Monterey (and the version installed with the Command Line Tools) doesn't display correctly. A workaround is to download and install the latest build of python from python.org (found here) which has a compatible tk bundled, then use the buildapp-select.command located in ProperTree's Scripts directory to build an application bundle targeting the installed python's path. You can then leverage the ProperTree.app bundle it creates.

  • ProperTree cannot open or save plist files on macOS Monterey (12.x)

    This appears to be an issue with the built-in tk, and the earlier "universal" installers from python.org. With at least python 3.10.2, this issue has been resolved in the universal builds. You can get the latest python 3 installer here. After installing, use the buildapp-select.command located in ProperTree's Scripts directory to build an application bundle targeting the installed python's path. You can then leverage the ProperTree.app bundle it creates.

  • How can I have ProperTree open when I double-click a .plist file?

    On macOS you can run buildapp-select.command located in ProperTree's Scripts directory to build an application bundle which can be associated with .plist files.

    On Windows, you can run AssociatePlistFiles.bat located in ProperTree's Scripts directory to associate .plist files with ProperTree.bat, and also to add an Open with ProperTree option to the contextual menu when right-clicking .plist files. This approach is location-dependent, and moving your copy of ProperTree will require you re-run AssociatePlistFiles.bat.

  • When I try to run ProperTree, I get [ModuleNotFoundError: No module name 'tkinter']

    That is because the graphical interface library that ProperTree depends on isn't present or cannot be detected, you need to install tkinter from your package manager.

    To install it on Ubuntu (and Ubuntu-based distros), you can run sudo apt-get install python3-tk -y

  • ProperTree doesn't run because it doesn't have permissions, what gives?

    This shouldn't happen and it is recommended that you download only from the official ProperTree repository, but if you are confident about your source, then running chmod +x ProperTree.command should sort it out

  • I use an international keyboard layout on macOS and some keys crash ProperTree with NSRangeException', reason: '-[__NSCFConstantString characterAtIndex:]: Range or index out of bounds

    This is a bug in the Cocoa implementation of Tcl/Tk on macOS (discussed here). The latest python 2 installer from python.org ships with, and uses Tcl/Tk 8.6.8 which has this issue fixed. Given that the shebang in ProperTree.command leverages #!/usr/bin/env python - the first python 2 binary found should be used. buildapp-select.command from ProperTree's Scripts directory can be used to hardcode a specific python install's path into the .app bundle's executable shebang.

  • ProperTree crashes on Big Sur (macOS 11)

    As of macOS 11.2 (20D5029f), the system's tk installation appears to be fixed, and works correctly. As such, it should not require an external python version to function.

    This is due to the default python installs on macOS leveraging an older tk version - which lacks support for macOS 11. To solve this, you can download and install the latest python 3 version from https://www.python.org/downloads/mac-osx/ (note: Currently the "universal" 3.9.1 installer causes theme issues and should not be used) then leverage the buildapp-select.command from ProperTree's Scripts directory to build a .app bundle that will leverage that python version.

    If you already have python 3 installed via brew or another package manager - it is likely still linking to the system tk version, which will still have issues unless linked against a newer version.

  • buildapp-select.command Usage

    An example of the output of buildapp-select.command is shown below. It will walk the output of which python and which python3, then attempt to load the tk interface while keeping track of which work and which fail. The example below is from macOS 11.2 (20D4029f) with the system versions of python 2 and 3, as well as python 3.9.1 installed from python.org. If there's an existing ProperTree.app in the directory above the Scripts folder, the shebang of that app will be located and served up as the C. Current option. At the following menu, I would select option 3 or C to use the non-system python install.

 - Currently Available Python Versions -

1. /usr/bin/python 2.7.16 - tk 8.5 (8.6+ recommended)
2. /usr/bin/python3 3.8.2 - tk 8.5 (8.6+ recommended)
3. /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 3.9.1 - tk 8.6
4. /usr/bin/env python
5. /usr/bin/env python3

C. Current (/Library/Frameworks/Python.framework/Versions/3.9/bin/python3)
Q. Quit

Please select the python version to use:  

More Repositories

1

gibMacOS

Py2/py3 script that can download macOS components direct from Apple
Python
5,727
star
2

GenSMBIOS

Py script that uses acidanthera's macserial to generate SMBIOS and optionally saves them to a plist.
Python
1,557
star
3

SSDTTime

SSDT/DSDT hotpatch attempts.
Python
1,039
star
4

USBMap

Python script for mapping USB ports in macOS and creating a custom injector kext.
Python
1,032
star
5

MountEFI

An even more robust edition of my previous MountEFI scripts
Python
1,028
star
6

Hackintosh-Guide

474
star
7

Lilu-and-Friends

A python script that can download and build a number of kexts.
Python
365
star
8

OCConfigCompare

Python script to compare two plists and list missing keys in either.
Python
305
star
9

CorpBot.py

A very clumsy python bot for discord
Python
194
star
10

CPUFriendFriend

Py script to walk frequency vectors and leverage acidanthera's CPUFriend ResourceConverter.
Python
148
star
11

CPU-Name

Small py script to change the CPU name in About This Mac by leveraging functionality in Acidanthera's RestrictEvents
Python
95
star
12

Web-Driver-Toolkit

A small python script for downloading NVIDIA Web Drivers based on either the current OS build version - or a selected build version.
Python
87
star
13

Hackintosh-Tips-And-Tricks

A collection of things I've learned about Hackintosh - Hopefully it helps others!
82
star
14

KextExtractor

A py script to extract/copy a folder of kexts or zips to a target EFI partition
Python
75
star
15

USB-Installer-Creator

A subset of commands from Mac Multi-Tool that *only* build USB installers.
Python
49
star
16

EFI-Backup-Restore

A smallish script that can backup EFI partitions - and eventually restore them (hopefully).
Python
41
star
17

PyVega

Python fork (kinda) of lihaoyun6's VGTab
Python
39
star
18

UnPlugged

Bash script to help build and run an offline installer in recovery.
Shell
39
star
19

EssentialsList

A small python script that creates a timestamped zip on your Desktop containing troubleshooting info.
Python
38
star
20

Mac-Multi-Tool

A tool I put together for creating OSX86 installers (OS X 10.9+)
Shell
38
star
21

HackUpdate

Python script to automate Lilu and Friends, KextExtractor, OC-Update, and OCConfigCompare.
Python
34
star
22

NullCPUPowerManagement

NullCPUPowerManagement.kext tweaked to build on newer setups
C++
33
star
23

AMDVanillaPatches

Py script that can download and merge the AMD vanilla config.plist patches.
Python
26
star
24

OC-Update

Bash script to update OpenCore and some efi drivers
Shell
21
star
25

ACPIRename

Py script to list paths in DSDT as well as generate unique method/device renames.
Python
20
star
26

VGTabMerge

Small py script to merge aty_properties from a VGTab injector kext to the config.plist -> Devices -> Properties for WEG injection.
Python
15
star
27

CheckAudio

Small py script to offer some debugging info on HDEF and current outputs.
Python
15
star
28

CsrDecode

Small py script to show what different CsrActiveConfig values enable/disable
Batchfile
15
star
29

Plist-Tool

A sloppy plist patching tool (yay!)
Python
15
star
30

OCSnapshot

Python CLI version of ProperTree's OC Snapshot function.
Python
14
star
31

BootChime

Py script to aid in setting up the boot chime in OpenCore.
Python
13
star
32

gibMacRecovery

Wrapper around Acidanthera's macrecovery.py to help setup python and automate the process.
Python
12
star
33

BitmaskDecode

Python script to help demystify a number of known bitmasks.
Batchfile
11
star
34

FixHPET

Py script to examine a DSDT and attempt to patch out IRQ conflicts.
Python
11
star
35

CheckGPU

Small py script to offer some debugging info on GPUs.
Python
10
star
36

SetAudio

Small py/applescript combo script that allows the user to select audio input/output.
Python
10
star
37

Batch-Scripts

A collection of batch scripts I've written over the years.
Batchfile
10
star
38

CloverExtractor

Small py script to extract CLOVERX64.efi from an install package and copy it to a target drive's EFI partition.
Python
10
star
39

MmioDevirt

Python script to create a template MmioWhitelist.
Python
9
star
40

LogCheck

Py script to scrape high level info from an opencore log
Python
9
star
41

Mac-Multi-Tool-GUI

Attempt at an Objective C rewrite of my Mac Multi-Tool script
Objective-C
9
star
42

CleanDock

Small py script to remove any apps from the dock not in a settings.json file.
Python
8
star
43

BridgeBuilder

Python script to generate ACPI for PCI bridges using DSDT + Device Paths
Python
8
star
44

ForceRGB

Py script to download, run, and setup results of Andrew Daugherityโ€™s patch-edid script
Python
8
star
45

Web-Driver-Getter

A small python script for downloading NVIDIA Web Drivers based on either the current OS build version - or a selected build version.
Python
7
star
46

AppleALC-Scrub

Dynamically reroutes layouts to valid counterparts in AppleHDA.kext
Python
7
star
47

pymodules

A repo of a number of helper modules I've made
Python
7
star
48

DevicePath

Py script to convert Windows device paths to fit OpenCore's expectations.
Batchfile
7
star
49

OpenConfig

Small bash script to mount the booted OC EFI and open the config.plist.
Shell
6
star
50

Hack-Fix-It

A custom script to aid in Hack setup
Shell
5
star
51

Convert.command

Small py2/py3 script to convert between a few value types
Batchfile
5
star
52

GPUP

Script to add/remove/edit GPU priority for apps in Windows 10
Batchfile
5
star
53

APFS-Non-Verbose

A small py script to patch apfs.efi
Python
4
star
54

PowerSettings

Py script to set some basic pmset commands and/or reset power settings.
Python
4
star
55

GetUUID

Bash script to grab UUID for the target volume
Shell
4
star
56

RoR2Unlocker

Py script to unlock characters and adjust lunar coins in Risk Of Rain 2
Python
4
star
57

OpenAsarInstall

Py script to fetch and install OpenAsar on macOS/Windows
Python
4
star
58

GetTex

Py script to download the Configuration.tex from the OpenCorePkg repo.
Python
4
star
59

icontool

A small script to take images and convert them to OSX icns files
Shell
4
star
60

IORegPy

Script to walk the plist output of the ioreg command
Python
3
star
61

Exclusions.bat

Small script to add/remove Windows Defender exclusions programatically.
Batchfile
3
star
62

CheckAPFS

Small py2 script to check the version of a passed, or local apfs.efi file.
Python
3
star
63

Start-Xcode

Bash script to directly launch Xcode via its binary
Shell
3
star
64

Check-Some

A small script to check OSX/macOS installer checksums
Shell
3
star
65

GetHash

Py script to list MD5, SHA1, and SHA256 of a specified file.
Python
3
star
66

ToggleDebug

A py script to toggle debug settings in an OC config.plist.
Python
3
star
67

CheckClover

Small py2 script to check the version of clover on a mounted EFI, or local CLOVERX64.efi file.
Batchfile
3
star
68

FontRendering

Py script to fix font rendering on non-HiDPI displays in Mojave.
Python
3
star
69

GetPlatforms

Small py2/py3 script to get ig/snb-platform-id's from Clover source or local gma.c file and format them for readability.
Batchfile
3
star
70

Mastermind

Single player python version of the Mastermind board game.
Python
3
star
71

GetHDEF

Small py script to locate HDEF in ioreg and print verbose info
Python
2
star
72

Bash-Scripts

Some Bash scripts I've written over the years.
Shell
2
star
73

OneScript

A little script to update some other scripts
Python
2
star
74

macrecovery-legacy

Python 2 and 3 compatible fork of macrecovery.py
Python
2
star
75

iasl-legacy

Rehost for legacy iasl tools.
1
star
76

CloverBootFiles

boot, boot0af, and boot1f32alt from Clover
1
star
77

StripPlistComments.py

A small script that should work on Python 2 or 3, macOS or Windows, that can strip plist comments
Python
1
star
78

Dilbert.py

A simple python script that crawls through Dilbert comics
Python
1
star
79

Essentials-Pruner

A private script (public now) to prune the essentials list against a preset list of kexts
Shell
1
star
80

RenameExt

A simple batch script to recursively rename files with a specified extension.
Batchfile
1
star
81

PyWordle

Python clone of Wordle for fun.
Python
1
star
82

linux_iasl

Rehost of the iasl.zip for Linux
1
star
83

Lavalink-Updater

Py script to update and launch Lavalink.jar
Python
1
star