istike2
Goto Top

TKINTER, definierte Funktion wird nicht erkannt

Hallo,

ich habe hier in Python eine Funktion "openbrowser" definiert.
Als kleine Testaufgabe soll es eine PowerShell-Script ausführen, die dann Firefox öffnet.

Um Firefox zu öffnen ist der Weg denkbar übertrieben kompliziert. Ich teste damit lediglich wie Python GUI mit Powershell zusammenarbeiten kann.


Hier ist also die Funktion:

import subprocess  # IMPORT FOR SUB PROCESS . RUN METHOD

POWERSHELL_PATH = "C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe"  # POWERSHELL EXE PATH  
ps_script_path = "C:\\Users\\mr3968\\PycharmProjects\\SystemScriptWithGUI\\Powershell_Scripts\\browser.ps1"  # YOUR POWERSHELL FILE PATH  

class Utility:  # SHARED CLASS TO USE IN OUR PROJECT

    @staticmethod    # STATIC METHOD DEFINITION
    def openbrowser(script_path, *params):  # SCRIPT PATH = POWERSHELL SCRIPT PATH,  PARAM = POWERSHELL SCRIPT PARAMETERS ( IF ANY )

        commandline_options = [POWERSHELL_PATH, '-ExecutionPolicy', 'Unrestricted', ps_script_path]  # ADD POWERSHELL EXE AND EXECUTION POLICY TO COMMAND VARIABLE  
        for param in params:  # LOOP FOR EACH PARAMETER FROM ARRAY
            commandline_options.append("'" + param + "'")  # APPEND YOUR FOR POWERSHELL SCRIPT  

        process_result = subprocess.run(commandline_options, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True)  # CALL PROCESS

        print(process_result.returncode)  # PRINT RETURN CODE OF PROCESS  0 = SUCCESS, NON-ZERO = FAIL
        print(process_result.stdout)      # PRINT STANDARD OUTPUT FROM POWERSHELL
        print(process_result.stderr)      # PRINT STANDARD ERROR FROM POWERSHELL ( IF ANY OTHERWISE ITS NULL|NONE )

        if process_result.returncode == 0:  # COMPARING RESULT
            Message = "Success !"  
        else:
            Message = "Error Occurred !"  

        return Message  # RETURN MESSAGE

#ich lege hier einen neuen Reiter bzw. ein neues Button an

powershell_frame = ttk.Frame(notebook)
notebook.add(powershell_frame, text='Browser öffnen', underline=0)  
powershell_frame.columnconfigure(2, weight=1)
powershell_frame.rowconfigure(1, weight=1)

# button um die Funktion "openbrowser" aufzurufen. 

open_browser_btn = ttk.Button(
    powershell_frame,
    text='Öffne den browser'  
)
open_browser_btn.grid(sticky=tk.E, ipadx=5, ipady=5)

open_browser_btn.configure(command=lambda: Utility.openbrowser(POWERSHELL_PATH)) 

(EDIT: open_browser_btn.configure(command=lambda: Utility.openbrowser(POWERSHELL_PATH)) war nachträglich als Korrektur eingefügt. Ohne dies wurde die Script immer ausgeführt nicht nur beim Klick aufs Button.)

Ich bekomme bei Ausführung die folgende Fehlermeldung:

 File "C:\Users\mr3968\PycharmProjects\SystemScriptWithGUI\Istvan_TestApp\PowershellGUI.py", line 209, in <module>  
    open_browser_btn.configure(command=openbrowser)
NameError: name 'openbrowser' is not defined  

Ich verstehe nicht, warum "openbrowser" undefiniert gilt. Ich habe die Funktion ja eindeutig im Code.

Woran kann es liegen? Hätte ich hier zuerst mit der definierten "Klasse" arbeiten müssen?

I.

Content-ID: 1592961619

Url: https://administrator.de/contentid/1592961619

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

l3xx3r
l3xx3r 06.12.2021 um 15:13:26 Uhr
Goto Top
Hi,

das müsste doch dann Utility.openbrowser(args1, args2) sein?
Bin nicht so in python drin, sorry wenn ich falsch lieg.

Grüße
istike2
istike2 06.12.2021 um 15:27:40 Uhr
Goto Top
Vielen Dank! Sieht schon besser aus.
Ich bekomme immer noch eine Meldung wegen der fehlenden Path.
Ich habe diese Info in der Funktion selbst als Variable hinterlegt.
Ich weiß also nicht wirklich was ich hier noch eingeben soll.
Fürs Öffnen des Browser werden hier keine Parameter benötigt, würde ich die Klammer also leer lassen.

In diesem Fall bekommen ich aber die folgende Fehlermeldung:

 open_browser_btn.configure(command=Utility.openbrowser())
TypeError: openbrowser() missing 1 required positional argument: 'script_path'  
l3xx3r
Lösung l3xx3r 06.12.2021 um 15:32:04 Uhr
Goto Top
Deine Funktion erwartet ja auch einen Parameter, den musst du beim Aufrufen schon mit übergeben, sonst geht nichts. Also in dem Fall dann dein POWERSHELL_PATH als Argument in dem Funktionsaufruf.

Grüße
istike2
istike2 06.12.2021 aktualisiert um 15:45:24 Uhr
Goto Top
Vielen Dank!

Es hat so funktioniert.

Die GUI funktioniert jetzt wieder ohne Probleme und der Browser wird geöffnet ... face-smile

[system.Diagnostics.Process]::Start("chrome","https://heise.de")  

Gr. i.