Das „eine Datei“-Argument ist keins. Das interessiert keinen ausser Leute, die versuchen wollen ihren Code zu verstecken. Eine Datei für den Endnutzer bekommt man auch wenn man einfach alles in eine Archivdatei steckt. Wobei ich mir auch fast sicher bin, dass man auch .ui-Dateien in Qt-Ressourcen stecken kann. Und man kann bei den üblichen Werkzeugen um ”eine” Datei aus Python-Programmen zu erzeugen auch Datendateien mit verpacken. Letztlich bekommt halt ein ZIP-Archiv mit einem kleinen EXE-Kopf, der jedes mal wenn man das Programm ausführt, alles in ein temporäres Verzeichnis entpackt, also den Python-Interpreter, die Standardbibliothek, Qt, die Python-Anbindung an Qt, andere Module von Drittanbietern, die Module des Programms selbst. Das wird alles entpackt und dann ausgeführt. Ich finde das an sich schon irre, aber unter Linux noch bekloppter, weil die ganzen Sachen ausser dem eigenen Code dort ja schon da sind, oder zumindest über die Linux-Paketverwaltung installiert werden können.
Man hat mit den .ui-Dateien einen Arbeitsschritt weniger. Und man kann auch alles unter Versionsverwaltung stellen, ohne das man nach dem auschecken, entweder selbst, oder wenn das jemand anderes tut, noch irgendwelche Dateien generieren muss, um das Programm dann komplett zu haben. Denn generierte Dateien gehören nicht in die Versionsverwaltung.
Generierten Code will man in der Regel auch gar nicht sehen, denn Codegeneratoren sind in der Regel nicht darauf ausgelegt was zu erzeugen was Menschen lesen sollen. Man hat bei Python ein bisschen Glück, dass die Sprache gewisse Sachen erzwingt, die das lesen einfacher machen, aber das was da aus den .ui-Dateien erzeugt wird ist kein Code an dem man sich für eigene Programme orientieren sollte. Man kann sich das ja mal generieren um rein zu schauen, aber das ist kein Grund für die Benutzung davon.