TKinter Gui Wie starte ich ein Python Programm über TKINTER

L I V E Stammtisch ab 20:30 Uhr im Chat
  • TKinter Gui Wie starte ich ein Python Programm über TKINTER? Schau mal ob du hier fündig wirst!

  • ...Wenn du weiterhin solche Sprüche ablässt wird dir keiner helfen...

    Offensichtlich erwartest du das dir jemand hier eine Anleitung rein textet, aber auf Hinweise/Fragen möchtest Du nicht eingehen und Eigeninitiative möchtest du anscheint genau so wenig aufbringen. Dein subprocess Problem wird über den Link in Beitrag#20 geklärt, aber anstatt das auszuprobieren oder gezieltere Fragen zu stellen falls du immer noch Probleme haben solltest, lässt du erneut solch bescheuerten Spruch ab?!?

    Du bist hier nicht in einem Supportforum einer kostenpflichtigen Ware. Wir müssen dir nicht helfen. Wir müssen dir auch nicht wiederholt erklären wieso dein Vorhaben problematisch sein kann wenn du nach dem ersten versuch solch einen Spruch ablässt... Frag dich mal wieso hier sonst keiner der vielen Python Freunde antwortet und dir hilft, während Zeitgleich andere Python Themen behandelt werden... Ich glaub nicht das es am Thema liegt, sondern eher an der Art und Weise wie der Verfasser auftritt.

    Obwohl ich gestern wirklich noch gewillt war dir das detailliert zu beschreiben ist mir jetzt endgültig die Lust vergangen...nun bin ich hier endgültig raus...

  • Hallo,

    @Schullty: Dein Problem ist, dass du entweder Antworten hier im Thread nicht liest oder beratungsresistent bis oder keinen Bock hast, durch ein bisschen Eigeninitiative selber zur Lösung zu kommen. Oder alles zusammen.

    meigrafd hat dir alles gesagt, was du wissen musst. Inkl., dass `os.system(...)` falsch ist - so startet man in 99,9% der Fälle kein Python-Skript aus einem Python Skript heraus. Und in einer GUI schon gar nicht.

    Gruß, noisefloor

  • Oh sorry

    eigentlich wollte ich Hilfe zu meinem Problem und mich nicht streiten. Ihr setzt hier ein Wissen voraus das leider nicht jeder hat und deswegen auch hier ist.

    Es wäre schön wenn einem das ganze richtig erklärt wird und nicht sein Frust an einem abgelassen wird.

    Ich hab es nicht verstanden und suche immer noch immer an einer Lösung. Sorry ist das so schlimm.

    Ich hoffe es gibt einen geduldigen hier der einem Anfänger das ganze verständlich erklärt. Das wäre echt klasse.

    Vielen vielen dank

  • Hallo zusammen

    Ich muss mich hier auch nochmal einhacken. Ich bin auch ein Anfänger im programmieren, und habe das selbe Problem wie Schnully.


    proc = subprocess.Popen(['python', './script.py']) ist das die Variable um mein Python Script zu starten??

    Und proc ist dann die Variable die ich dann in meine Button Funktion einbinden kann??

    Habe ich das richtig verstanden??

  • subprocess führt einen Konsolen Befehl aus. Der Befehl erwartet eine Python-Liste, deshalb die [ ] usw.. Der Befehl der dabei ausgeführt wird wäre also "python ./script.py".
    Das ./ sorgt dafür dass das script.py im selben Verzeichnis liegen muss wie das auszuführende Script selbst. Alternativ kann man auch den absoluten Pfad angeben.
    "proc" ist ein Objekt was vom subprocess.Popen erzeugt wird. Über dieses Objekt kann man auf den Prozess (process) Einfluss nehmen und zB die Ausgabe behandeln oder prüfen ob der Befehl erfolgreich war oder auch den Prozess beenden etc. Das hat also nichts mit einem Tkinter Button zu tun.

    Wie ich bereits in Beitrag#12 eigentlich ausführlich erwähnt habe, würde ein weiterer Befehl der über das TKinter-Script ausgeführt wird das Script blockieren, es reagiert dann also auf keinen weiteren Klick o.ä. solange bis der subprocess Befehl sich selbst beendet.
    Aber anscheint ist das zu viel für euch, zu viel Infos auf ein mal - also texte ich hier jetzt keinen 100 Zeiler mehr sondern gehe es Stück für Stück durch, erwarte aber auch Eigeninitiative eurerseits, in dem ihr verdeutlicht das ihr es zumindest versucht, aber nicht nur drauf wartet das ihrs fix und fertig auf einem Silbertablett vor die Füße gelegt kriegt

  • Hallo locke

    vielen Dank. Hast du da jetzt eine neue Variante gefunden.

    Also ich hab das os impotiert, import os

    Dann wollte ich durch den Button "Programm start" mein Python sript Blinken ausführen lassen. Das Scribt liegt in /home/pi/forum/blinken.py

    Ich hab es dann versucht mit os.system ("/home/pi/forum/blinken.py") auch mit sudo und python gänsefüße weggelassen es geht nicht.

    Ich denke es fehlt hier ein parameter oder befehl das script direkt auszuführen. Ich weiß es nicht.

    Vielleicht gibt es ja auch eine ganz andere Lösung nur welche. Ich versteh es nicht und versuche es schon seit über einer Woche. Aber was da geschrieben wird ist sehr schwer zu verstehen. Zumindest fehlt mir hier die erfahrung.

    Viele Grüße

  • Locke32

    Das sieht schon halbwegs ok aus. Es ist allerdings keine "Variable", sondern eine Anweisung. Deren Ergebnis wird in einer Variable gespeichert - das subprocess.Popen-Objekt.

    Und ein Grund, warum es ggf. fehlschlaegt: du benutzt einen relativen Pfad. "./script.py". Das funktioniert nur, wenn du dich im richtigen Verzeichnis befindest. Robuster (fuer zB spaeter den bestimmt gewuenschten Autostart) ist es, einen kompletten Pfad anzugeben, also zB "/home/pi/scripts/script.py" (wenn es da liegt).

    Alternativ kann man sich diesen Pfad auch zusammenbauen, wenn beide Skripte nebeneinander liegen:

    Code
    pfad = os.path.join(
        os.path.dirname(__file__), # nur der Verzeichnisteil von diesem skript
       "script.py"
    )

    Schnully: os.system nicht benutzten, besser das subprocess-Modul. Nur dann kannst du naemlich das blinken-Skript auch wieder beenden.

    Und ein Skript so auszufuehren wie du es versuchst (os.system oder subprocess ist dabei irrelevant) funktioniert nur, wenn es ein shebang enthaelt (#!/usr/bin/python am Anfang), und ausfuehrbar ist.

    Sicherer ist ["sudo", "python", "skriptpfad"] als Argument an subprocess.call oder subprocess.Popen zu benutzen.

  • Ist die Datei ausführbar und besitzt einen Shebang?
    Wie führst du das Script denn manuell über Konsole aus?

    Entweder das Script besitzt Ausführrechte und einen Shebang - oder es wird direkt dem Interpreter übergeben.

    Laut deinem blinkeng.py besitzt es keinen Shebang, und dem Interpreter übergibst du es auch nicht - also ist das die Erklärung wieso es bei Dir nicht funktioniert

  • #!/usr/bin/python3
    from tkinter import *
    import subprocess


    def Fenster():
    f = Tk()
    f.title("Fenster von Thommy!!!")
    f.geometry("300x300")
    def bk1():
    print ("an")
           subprocess.call( ["sudo","python","/home/pi/forum/blinken.py"])
    b1 = Button(f,text = "Programm start",command = bk1)
    b1.place(x=0,y=10)
    def bk2():
    print ("aus")
    b2 = Button(f,text = "Programm ende",command = bk2)
    b2.place(x=0,y=110)
       
    f.mainloop()
    Fenster()

    @deets

    Meine Gui sieht jetzt so aus. Wenn ich den Button drücke erscheint die Meldung TypeError: funktion objekt is not subscritaple

    Einmal editiert, zuletzt von Schnully (16. Mai 2016 um 20:35)

  • Du scheinst nicht verstanden zu haben was ein Shebang ist und wo dieser zu stehen hat? Lies bitte noch mal den Link in Beitrag#30 .. Diese roten Wörter sind verlinkt.

    Und bitte poste Code in den dafür vorgesehenen CODE Blöcken: [ code] bla [/ code]
    OHNE Leerzeichen!


    PS:
    f.mainloop()
    Fenster()
    Das "f" Objekt gibt es erst nachdem Fenster() ausgeführt wurde, aber "mainloop()" blockiert das Script - also bitte noch mal Beitrag#12 aufmerksam lesen.

    Ich empfehle dir wirklich dringend ein Tutorial über tkinter zu lesen: https://www.google.de/search?q=pytho…_1de&lr=lang_de

    Versetzt euch mal in Unsere Lage. Ihr seid nicht die ersten die hier Hilfe erbitten. Ich gehöre zu jenen die sehr viel Geduld aufbringen anderen zu helfen (siehe meine Bewertungen), aber es ist wirklich mühsam wenn Ihr keine Eigeninitiative zeigt und euch nicht selbst versucht via Google o.ä. schlau zu lesen. Man brauch doch nur nach "python tkinter" oder "python subprocess" zu suchen und findet dann etliches...
    Ich hab Shebang verlinkt, scheint aber nicht gelesen worden zu sein?
    Der Shebang gibt an mit welchem Programm der Code verarbeitet werden soll - woher soll das System sonst wissen wofür der Code ist? Das Programm was den Code verarbeitet nennt man auch Interpreter. Führt man "python script.py" aus wird die Datei script.py direkt dem Interpreter übergeben. Würde man aber ein bash Script an den python Interpreter übergeben würde es haufenweise Fehler hageln da python nicht mit bash-Code umgehen kann. Das selbe gilt für zB PHP-Scripts das kann nur vom PHP Interpreter verarbeitet werden usw....

    Also ist der Shebang - wie über Wikipedia nachzulesen - nicht ein Pfad wo das Script liegt, sondern die Angabe des Interpreters, mit absolutem Pfad. Das hat deets auch in Beitrag#29 gezeigt.

  • Also nochmal; Grundaufbau eines Python Scripts:
    1. Zeile Shebang
    Nachfolgende Zeilen: import's
    Danach kommen üblicherweise Variablen, dann Funktionen oder Klassen und danach deren Aufrufe...

    Wie bereits in Beitrag#12 beschrieben, blockiert "mainloop" das Script. Man kann danach also nichts ausführen.

    Also versucht erst mal dieses Schema umzusetzen, entscheidet euch ob ihr ein Shebang mit Ausführrechten nutzen, oder das Script direkt dem Interpreter übergeben wollt - es ist nur eins von beidem nötig.

    Dann nehmen wir ein Grundgerüst ein für Euer Anliegen passendes Tkinter Scripts - ich setze aber bewusst noch kein subprocess ein, da Ihr noch immer nicht ausreichend Infos genannt hab was in den auszuführenden Scripts passieren soll oder ich erst sehen will wie ihr selbstständig versucht mit subprocess klar zu kommen... Es gibt immer mehrere Möglichkeiten, das hier zurecht zu texten dauert aber auch ewig, was zumindest Schnully bisher nicht gewürdigt hat, also weiger ich mich jetzt....

    [code=php]
    #!/usr/bin/python3
    # coding: utf-8
    import time
    import subprocess
    import tkinter

    def Ausfuehren():
    print("Programm wird ausgefuehrt ...")
    time.sleep(10)
    status_label.configure(text="gestartet", fg="green")

    def Beenden():
    print("Programm wird beendet ...")
    time.sleep(10)
    status_label.configure(text="beendet", fg="red")

    # TKinter Main Window
    window = tkinter.Tk()
    window.geometry("200x300")

    status_label = tkinter.Label(master=window)
    status_label.configure(text="Beendet", fg="red")
    status_label.grid(row=0, column=1)

    start_button = tkinter.Button(master=window, bg="#229", fg="white", text="Programm starten", command=Ausfuehren)
    stop_button = tkinter.Button(master=window, bg="#229", fg="white", text="Programm stoppen", command=Beenden)
    exit_button = tkinter.Button(master=window, bg="#229", fg="white", text="X", command=window.destroy)

    start_button.grid(row=1, column=1)
    stop_button.grid(row=2, column=1)
    exit_button.grid(row=3, column=2)

    window.grid_columnconfigure(1, weight=1)
    window.grid_rowconfigure(1, weight=1)

    window.mainloop()
    [/php]übersichtlicher http://codepad.org/r8bV0ERa

    Sobald ihr auf einen der Buttons klickt werdet ihr merken das die GUI blockiert wird, die Schaltfläche der Buttons nicht wieder zurück ploppen und auch kein Klick auf einen anderen Button eine Reaktion zeigt... Und genau das ist das Problem was ich in Beitrag#12 beschrieben habe.

  • georg: der TE hat kein Problem, einen Callback zu definieren - bk1 und bk2 sind Callbacks, und korrekt verwandt. Sie sind in sich selbst nicht funktionstuechtig (zumindest bk1), aber das ist unabhaengig von dem was du da vorstellst.

  • Hallo

    ich hab oben unter #31 den schebang und die subprocess Zeile korrigiert. Siehe rote Zeile

    Ich bekomme jetzt keinen Fehler mehr, aber das Progrämchen blinken wird nicht ausgefürt.

    Der Button bk2 ist derzeit noch inaktiv. Dieser soll später dazu benutzt werden das Programm oder script zu beenden. Dazu aber später ja und ich streng mich an es selbt zu versuchen.

    @deets!! bin ich auf dem richtigen Weg oder muss ich von neuem Anfangen.

    Hey vielen Dank an euch und eure Geduld.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!