{"id":6910,"date":"2026-05-11T22:01:58","date_gmt":"2026-05-12T05:01:58","guid":{"rendered":"https:\/\/blackcap.name\/blog\/new\/?p=6910"},"modified":"2026-05-11T22:02:23","modified_gmt":"2026-05-12T05:02:23","slug":"portable-gui-frameworks","status":"publish","type":"post","link":"https:\/\/blackcap.name\/blog\/new\/?p=6910","title":{"rendered":"Portable GUI Frameworks"},"content":{"rendered":"\n<p>I&#8217;ve been experimenting with them, because I have a need to rewrite a tool I use from <a href=\"https:\/\/kotlinlang.org\/\" data-type=\"link\" data-id=\"https:\/\/kotlinlang.org\/\">Kotlin<\/a> into some other programming language. Not because of any real defects in Kotlin (despite its proximity to the Java world and its associated <a href=\"https:\/\/blackcap.name\/blog\/new\/?p=6756\" data-type=\"post\" data-id=\"6756\">JCA&#8217;s<\/a>, this is not a show-stopper).<\/p>\n\n\n\n<p>No, the problem is that I need to read <a href=\"https:\/\/en.wikipedia.org\/wiki\/High_Efficiency_Image_File_Format\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/High_Efficiency_Image_File_Format\">HEIC<\/a> files, and there is no good, easy way to do this in Kotlin, because there are simply no good, open-source, comprehensive, general-purpose imaging processing libraries available for the JVM. There are limited libraries that do not support HEIC nor the large size of the HEIC images I wish to read (such as the built-in stuff in the standard Java class library). There are esoteric libraries like <a href=\"https:\/\/imagej.net\/ij\/\" data-type=\"link\" data-id=\"https:\/\/imagej.net\/ij\/\">ImageJ<\/a> that support all sorts of oddball image formats used in the microscopy and health care fields, but not HEIC. There is no shortage of libraries that are abandonware and haven&#8217;t had an update in a decade or more.<\/p>\n\n\n\n<p>By contrast, C# has <a href=\"https:\/\/github.com\/dlemstra\/Magick.NET\" data-type=\"link\" data-id=\"https:\/\/github.com\/dlemstra\/Magick.NET\">Magick.NET<\/a> and Python has <a href=\"https:\/\/pillow.readthedocs.io\/en\/stable\/\" data-type=\"link\" data-id=\"https:\/\/pillow.readthedocs.io\/en\/stable\/\">Pillow<\/a>, both of which do what I want. So I have been looking into GUI frameworks for those languages. Lets just say there are a lot of bad ones and leave it at that for now. I will post some details on the badness later (some of it is pretty mind-blowingly bad).<\/p>\n\n\n\n<p>Suffice it to say that at this point I am reasonably sure <a href=\"https:\/\/wxpython.org\/\" data-type=\"link\" data-id=\"https:\/\/wxpython.org\/\">wxPython<\/a> will suit my needs, and it took a disgustingly long period of trial-and-error to get to that conclusion.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been experimenting with them, because I have a need to rewrite a tool I use from Kotlin into some other programming language. Not because of any real defects in Kotlin (despite its proximity to the Java world and its associated JCA&#8217;s, this is not a show-stopper). No, the problem is that I need to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-6910","post","type-post","status-publish","format-standard","hentry","category-computers"],"_links":{"self":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6910"}],"version-history":[{"count":3,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6910\/revisions"}],"predecessor-version":[{"id":6913,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=\/wp\/v2\/posts\/6910\/revisions\/6913"}],"wp:attachment":[{"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blackcap.name\/blog\/new\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}