ModuleNotFoundError für GUI das auf anderes Skript zurückgreift.

Probleme bei der Installation?
Antworten
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Hallo zusammen,
ich stoße bei meiner Programmierung auf ein Problem. Ein Skript, nennen wir es „test1.py“, nutzt das Modul „pyautogui“. Dieses ist installiert. Das Skript „test1.py“ läuft ohne Probleme – heißt auch, dass das Importieren des Moduls am Anfang des Skripts keine Probleme verursacht.

Nun habe ich eine sehr einfache grafische Benutzeroberfläche programmiert. Nennen wir dieses Skript mal „GUI.py“. Das Skript „GUI.py“ nützt das Skript „test1.py“.
Beim Ausführen des Skripts „GUI.py“ stoße ich jedoch auf ein Problem. Es erscheint eine Fehlermeldung. Die Fehlermeldung lautet: „ModuleNotFoundError: No module named 'pyautogui'“. Als ich zum ersten Mal auf diesen Fehler gestoßen bin, habe ich auch im Skript „GUI.py“ das Modul „pyautogui“ importiert. Trotzdem erscheint der Fehler weiterhin.

Das Skript „GUI.py“ schaut wie folgt aus:

Code: Alles auswählen

import tkinter as tk
import subprocess
# the modules above are needed for this script
# the modules below are needed for the refering scripts
import pyautogui

def run_script1():
    subprocess.call(["python", "test1.py"])

root = tk.Tk()
root.title("GUI")

button1 = tk.Button(root, text="Text 123", command=run_script1)
button1.pack()

root.mainloop()

Der Error erscheint erst beim Klicken auf den Button "Text 123", nicht beim Starten des Skripts "GUI.py".

Kann mir hier jemand weiterhelfen?

Liebe Grüße
Spedex
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Spedex: Das deutet darauf hin das Du vielleicht zwei (oder mehr) Python-Interpreter installiert hast und beide Programme nicht mit dem gleichen Python ausgeführt werden.

Das ist insgesamt aber auch komisch ein Python-Programm so von einem anderen auszuführen, statt da *ein* Programm draus zu machen.

Die 1 bei `run_script1()` und `button1` hat da nichts zu suchen. Man nummeriert keine Namen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Das Beispiel, welches ich hier erwähnt habe, war im reduzierten Umfang. Eigentlich werden mehrere Buttons, basierend auf mehreren Skripts, in das Skript „GUI.py“ implementiert. Daher möchte ich nicht ein ganz großes Skript daraus machen. Das wird dann viel unübersichtlicher.
Ich nutze den „Mu Editor“ als IDE.
Ich bin mir nicht sicher, wie ich denn herausfinden kann, ob ich zwei verschiedene Versionen von Python installiert habe.
Wenn ich in der Eingabeaufforderung python --version eingebe, dann erhalte ich Python 3.11.1 als Rückmeldung.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Was die Übersichtlichkeit betrifft, unterscheiden sich Module nicht von Skripte.
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Ich verstehe nicht ganz, was du mir damit sagen möchtest. Ich möchte nicht alle Skripte in ein Skript zusammenfügen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast etwas von Übersichtlichkeit geschrieben, und dafür sind Module das Mittel der Wahl. Niemand hier hat gesagt, dass Du alles in eine Datei kopieren sollst.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Spedex: Und Module _importiert_ man.
Aus Pyhton andere Python-Programme aufzurufen ist unüblich bis falsch. Hier eher falsch.
Spedex
User
Beiträge: 54
Registriert: Mittwoch 29. Januar 2020, 03:27

Ok also mittlerweile habe ich eine Lösung gefunden.

Das Skript test.py habe ich so geändert, dass der gesamte ursprüngliche Code als Funktion run() definiert wird.
Am Schluss steht dann:

Code: Alles auswählen

if __name__ == "__main__":
    run()
Das Skript "GUI.py" habe ich so modifiziert, dass ich am Anfang das Skript test1.py importiere.
Danach kommt:

Code: Alles auswählen

import tkinter
import test1

def run_script1():
    alarm_all_cars_in_mission_window.run()

root = tkinter.Tk()
button1 = tkinter.Button(root, text="Run Script 1", command=run_script1)
button1.pack()
root.mainloop()
Bitte verzeiht die einfache Nummerierung. Es geht hier nur um Demonstrationszwecke.

Vielen Dank für die Denkanstöße.

Liebe Grüße
Spedex
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, genau so haben wir das gemeint.
Man muß nicht alles an Namen binden, wenn man den Namen nur einmal braucht:

Code: Alles auswählen

import tkinter as tk
import alarm_all_cars_in_mission_window

def main():
    root = tk.Tk()
    tk.Button(root, text="Run Script 1",
        command=alarm_all_cars_in_mission_window.run
    ).pack()
    root.mainloop()

if __name__ == "__main__":
    main()
Antworten