TKinter Gui Wie starte ich ein Python Programm über TKINTER

  • Das der Befehl p.kill() nichts gebracht hat stimmt nicht. Er ist ueberhaupt nicht zur Ausfuehrung gekommen, weil das p schon gar nicht da ist. Und da bringt es erstaunlich wenig, einfach sinnlos weiter Argumente zu uebergeben. Wir sind hier nicht bei rate-mal-mit-Rosenthal.

    Wo koennte denn das global hingehoeren, wenn du dir anschaust, wo es bei mir steht? Und vielleicht liest du dir auch einfach mal im Python-Tutorial etwas zu global durch, damit du verstehst, wozu es da ist.
    Automatisch zusammengefügt:
    georg das ist ganz grober Unfug. Du benutzt eine sleep-Anweisung in einem GUI - das geht in die Hose, weil die GUI dann einfriert. Ausserdem blinkt es dann nur genau ein mal - weil danach der Callback verlassen wird. bk2 ist also wertlos, und stop = 1 mal erst Recht - lokal irgendeine Variable zuzuweisen macht nicht magisch eine LED aus.

    Womit du Recht hast ist, dass man das Problem eigentlich nicht ueber subprocess loesen wuerde. Nur das hat der TE halt schon.

  • TKinter Gui Wie starte ich ein Python Programm über TKINTER? Schau mal ob du hier fündig wirst!

  • Hallo deets und an alle Spezialisten

    bitte verzeiht einem Anfänger wie mir.

    Ich weiß nicht wie es geht. Sorry

    Und bitte glaube mir ich möchte es lernen. Nur hab ich nicht das Wissen wie du oder manche hier. Wenn ihr Programmierer euch das Wissen selbst beigebracht habt dann Hut ab. Aber wenn Ihr es auf einer Schule oder Uni beigebracht bekommen habt, so habt doch bitte Verständnis mit uns Anfängern. Wenn keine zeit für uns da ist oder wir für euch zu bequem sind dann sollte das hier auf der Webseite kommuniziert werden.

    Rosenthal ist lange tod und ich möchte auch nicht Rätselraten. :)

    Ich bin nicht sauer mit euch nur mit mir weil ich nicht weiter komme.

    Ich frag mich warum ist es oft so schwierig in einem Unix Forum. Warum könnt Ihr nicht auf Anfänger etwas eingehen.

  • Du machst es Dir selber schwer, weil du nicht das machst was man schreibt, oder nicht selber nach einer Beschreibung googelst... Du kannst zB ganz einfach nach "python subprocess kill" googlen und findest dann sowas: https://docs.python.org/3/library/subp…cess.Popen.kill und da drüber steht sogar ein Anwendungsbeispiel was zufälliger weise so aussieht wie es deets in Beitrag#51 beschrieben hat: proc.kill() ... siehst du da irgendwas in den Klammern? Nein? Wieso fügst du dann aber was ein?
    Und das nächste ist das du nicht verstehst was "global" in einer Funktion bewirkt - du fragst aber auch nicht danach ...

    Solche Sprüche wie in deinem letzten Satz solltest du dir auch verkneifen - das ist jetzt schon der 5. Spruch solch einer Art

    Hier versuchen mehrere Personen dir zu helfen - du beachtest aber nicht was man schreibt... Es würde zudem Dir gut tun nicht so viel blind copy&paste zu machen, wie zB das angeblich von Dir komplett überarbeitete Script in Beitrag#53 stammt niemalsnie vollständig von dir - meinst du dadurch lernst du was da passiert?

    Also: Fang erst mal damit an dich an dem Code aus Beitrag#51 zu orientieren und beachte alles was da geschrieben steht - es hat durch aus seinen Sinn wieso da eine Zeile mit "global" vor kommt. Nicht ignorieren! Versuch Deinen Code ungefähr genau so aussehen zu lassen!
    Warum? Definiert man innerhalb einer Funktion eine Variable, die aber auch ausserhalb einer Funktion abrufbar sein soll, muss diese entweder a) übergeben werden oder b) global gesetzt werden.

  • Wir gehen viel ein. Aber ich weigere mich, Programmierdienstleister fuer ueberambitionierte Projekte zu sein. Wenn du dir die Grundlagen nicht erarbeiten willst, kannst du es sein lassen. Dann blinken halt deine LEDs nicht.

    Ich habe mir programmieren selbst beigebracht, aus einer Reihe von Buechern, die auch noch schwierig zu bekommen waren. Heutzutage gibt es nahezu unbegrenzte Resourcen, um das zu tun. Und die Programmiersprachen sind auch noch einfacher, und geben klarere Fehlermeldungen. So einfach wie heute war es nie. Es liegt also immer an jedem selbst.

  • An alle die sich mit Anfängern begnügen :stumm:

    vielleicht gibt es ja jemand noch der mir bei meinem Problem helfen kann.

    def schalteEin(self,event):
    print('ein') # DEBUG
              p = subprocess.Popen(["sudo","python","/home/pi/forum/blinkeng.py"])
    print (p)

    def schalteAus(self,event):
    print('aus') # DEBUG
              p.kill(["sudo","python","/home/pi/forum/blinkeng.py"])

    Ich bekomme das Script super gestatet aber mit kill nicht mehr beendet.

    Mein komplettes Programm habe ich zuvor als Anlage abgelegt. #53

    Ich komme leider nicht weiter

    LG

    Einmal editiert, zuletzt von Schnully (18. Mai 2016 um 00:30)

  • Deshalb machen wir ein "Amen"
    (habe mir die Mühe wegen _deeets und denen seiner sleep - Quatsch gemacht ... )

    versuche mit:

    [code=php]#!/usr/bin/python3
    import time
    import RPi.GPIO as GPIO
    from Tkinter import *

    #Pin Nummer wie auf dem Raspberry Board verwenden
    GPIO.setmode(GPIO.BOARD)

    # Pin 11 (GPIO 17) als Output
    GPIO.setup(11, GPIO.OUT)
    GPIO.setup(7, GPIO.OUT)
    GPIO.setwarnings(False)


    def Fenster():
    f = Tk()
    f.title("Fenster von Thommy!!!")
    f.geometry("300x300")
    def bk1():
    print ("an-1")
    #GPIO.output(7, 1)
    #LED aus
    #GPIO.output(11, GPIO.LOW)
    # eine Sekunde warten
    time.sleep(1)
    #LED an
    #GPIO.output(11, GPIO.HIGH)
    print ("aus-0")
    # eine Sekunde warten
    time.sleep(1)
            
    b1 = Button(f,text = "Programm start",command = bk1)
    b1.place(x=0,y=10)
    def bk2():
    print ("aus")
    # GPIO.output(7, 0)
    b2 = Button(f,text = "Programm ende",command = bk2)
    b2.place(x=0,y=110)
        
    f.mainl[/php]


    Gruß
    Georg

    Ps.
    Sorry deeets, ro... & co ... aber Persönliches soll bei Seite bleiben.
    Ich möchte NUR mit meinen Tips weiterhelfen.

  • Georg das ist lieb

    nur ich wöchte ein Script über eine Gui starten und Beenden. Die Gui heißt Windows10.py Das Script welches die GPIOs beeinhaltet heißt blinkeng.py

    An und aus bekomm ich auch durch drücken der beiden Buttons. Nur das externe Script blinkeng.py wird nicht beendet

    beide stehen im Verzeichnis /home/pi/forum/blinkeng.py

    Durch den Befehl
    def schalteEin(self,event):
    print('ein') # DEBUG
    p = subprocess.Popen(["sudo","python","/home/pi/forum/blinkeng.py"])
    print (p)
    bekomme ich das Script auch zum laufen und meine LED blinkt.

    Nur bekomme ich den subprocess nich beendet. Deets hat mich auf den richtigen Weg gebracht mit kill.Für das ich ihm auch sehr dankbar bin. Nur ich bekomm es nicht hin das Script zu beenden.

    Es hängt vermutlich an der Variabel p. Diese ist nicht global. Hmm

    Jetzt weiß ich aber nicht an welcher Stelle ich p global setzen soll.

    Soweit so gut.

    Ich entschuldige mich für mein noch unwissen in Python und dem Rasbperry
    Automatisch zusammengefügt:

    PS

    Georg

    hast du auch eine externe phytondatei mit eingebunden.

    Meine Datei beeinhaltet eine Whileschleife endlosschleife die lich an und aus macht mip GPIO etc.

    Einmal editiert, zuletzt von Schnully (18. Mai 2016 um 01:13)

  • Schnully: Wieso beachtest du nicht was wir geschrieben haben? Dein Code aus Beitrag#65 ist identisch mit dem aus Beitrag#53 aber zwischenzeitlich haben wir dir versucht zu erklären dass das so nicht funktionieren wird.

    Bitte betrachte noch mal die Funktion von deets in Beitrag#51 und achte ganz genau darauf Was und Wo global gesetzt wurde.

    Georgs Code dient nur als Muster - oder siehst du da irgend eine subprocess Zeile?

    Und Schnully: Ich bin nicht böse, ich finds nur langsam seltsam wie du dich hier verhälst.. Es macht den Anschein als ob du das mit Absicht machst: egal was man schreibt zu ignorieren... Oder wieso hast du Beitrag#65 verfasst nachdem ich in Beitrag#63 beschrieben habe wieso "global" wichtig ist oder das in den Klammern von proc.kill() nichts zu stehen hat? Das ignorierst du und postest den gleichen falschen Code wie er schon eine Seite zuvor stand....

    //EDIT: Um dir den Vergleich zu vereinfachen:

    Code
    blink_process = None
    def bk1():
        global blink_process  
        if blink_process is None:
              blink_process = subprocess.Popen(...)
              button.configure(text="stop blinking")
         else:
              blink_process.kill()
              blink_process = None
              button.configure(text="start blinking")

    Was fehlt in deiner "schalteEin" Funktion und wie müsste deine p.kill Anweisung eigentlich aussehen? -> In den Beiträgen der letzten 2 Seiten findest du Hinweise/Hilfestellungen zu diesem "Problem". Da bisher Wiederholungen dazu von dir ignoriert wurden mache ich mir diese Mühe jetzt nicht mehr, die Informationen der letzten Beiträge hier zusammen zu fassen.

    Postest du nach diesem Beitrag hier erneut deinen Code aus Beitrag#53 oder #65, müssen wir davon ausgehen das du nicht gewillt bist zur Umsetzung Deines Projekts auch etwas für zu tun

  • Zitat

    nur ich wöchte ein Script über eine Gui starten und Beenden. Die Gui heißt Windows10.py Das Script welches die GPIOs beeinhaltet heißt blinkeng.py


    Py to Py
    Ok.
    Dann mache es.
    Alles wurde Dir schon erläutert.

    ---
    Aus Python -> Python Script starten???

    Bitte - bei alem Respekt!

    Sollte ich "Müll- reden" :blush: - bitte mich (?) "auf die Nuss" hauen. :huh:

    Einmal editiert, zuletzt von georg-Lu_1963-1 (18. Mai 2016 um 01:58)

  • georg: ich habe nicht gesagt, dass dein Programm nicht kleine Knoepfe malen kann, sondern dass es das Problem das hier geloest werden soll - ein-und-ausschalten einer blinkenden LED - nicht loest.

    Und das habe ich en Detail auch schon alles hier mal erzaehlt:

    Schnully
    31. März 2016 um 21:37

    Uebrigens, wie ich jetzt gerade sehe, fuer den User Schnully.

    Wenn dir der Hinweis, dass dein Programm nicht so funktionert wie gewuenscht, schon eine persoenliche Beleidigung ist - dann wird's schwierig, mit dir sachlich zu kommunizieren.

  • Hallo miteinander

    hier mein Windows11a.py script das ich soweit es ging deets Ratschlag angepasst habe.

    def schalteEin(self,event):
    global blink_process
    if blink_process is None:
    blink_process = subprocess.Popen(["sudo","python","/home/pi/forum/blinkeng.py"])
    button.configure(text="stop blinken")
    else:
    blink_process.kill()
    blink_process = None
    button.configure(text="stop blinken")


    blink_process = None musste ich an oberte Stelle einfügen da sonst Python Probleme mit der Funktion def schalteEin(self,event): Ach ja und die Funktion (bk1) musste ich durch self,event ersetzen da sonst keine Buttons erstellt wurde oder funkionierte.

    button.configure(text="stop blinken") und button.configure(text="stop blinken") konnte man eigendlich weglassen.

    Also wie hehabt die Datei blinkeng.py wird ausgeführt, doch durch erneutem Klick kommt dieser Fehler. Das Scribt wird nicht beendet.

    Traceback (most recent call last):
    File "/usr/lib/python3.4/tkinter/__init__.py", line 1536, in __call__

    return self.func(*args)

    File "/home/pi/forum/Windows11b.py", line 30, in schalteEin

    blink_process.kill()

    File "/usr/lib/python3.4/subprocess.py", line 1691, in kill

    self.send_signal(signal.SIGKILL)

    File "/usr/lib/python3.4/subprocess.py", line 1681, in send_signal

    os.kill(self.pid, sig)

    PermissionError: [Errno 1] Operation not permitted

    Kann damit jemand was anfangen.

    :danke_ATDE:

  • Du scheinst dich nicht wirklich bemüht zu haben zu verstehen was button.configure bewirkt, oder?
    Die Zeilen hatten ihren Grund den deets auch beschrieben hat: Nur ein einziger Button der je nach Zustand seinen Text ändert.
    Man initialisiert also die GUI und konfiguriert den Button erst mit text "Start". Klickt man dann das erste mal auf den Button trifft "if blink_process is None:" zu, der Process wird gestartet und der Text des Buttons auf "Stop" geändert. Klickt man dann auf den Button trifft "if blink_process is None:" nicht mehr zu, der Process wird beendet und der Text des Buttons wieder auf "Start" geändert.
    Du hast diese Zeilen aber zum einen einfach drin gelassen und zum anderen den Text einfach in beiden Zeilen gleich gesetzt - das ergibt so in der Form überhaupt gar kein Sinn...

    Desweiteren hast du ein Script eines anderen kopiert dessen Sinn du ebenfalls nicht verstanden hast aber genau das wird dir hier nun zum Verhängnis. Bitte verstehe was "class" für ein Konstrukt ist und wie dessen Aufbau auszusehen hat, insbesondere was es mit __init__ auf sich hat und prüfe ob dort nicht vielleicht "blink_process = None" rein gehört.

    Desweiteren gibt es kein protocol vom Typ "Thommy"


    Es bringt dir wie gesagt absolut gar nichts blind irgend einen Code von irgend jemand fremdes zu verwenden wenn du diesen aber nicht verstehst. Bitte kehre zurück zu deinem (hoffentlich) eigenem Code aus Beitrag#50 und passe diesen an die bis hier her gelernten Dinge an!

  • Das war ein Versehen - ich habe vergessen, dass du sudo benutzt.

    Aber langsam kommen wir weiter. Folgender Code sollte klappen:

    Code
    subprocess.call(["sudo", "kill", str(p.pid)]) # anstelle p.kill()
  • Hallo zusammen

    ja und Hallo deets vielen vielen dank :thumbs1: :bravo2:

    es funkioniert jetzt. Ja es funkioniert mit einem Button oder auch mit 2

    meigrafd das war die lösung subprocess.call(["sudo","kill", str(blink_process.pid)]) von deets

    deets ich bin dir echt zu Dank verplichtet. Klasse.

    Einen Schönheitsfehler hat das ganze noch, den ich auf meine weiße versucht hab zu lösen. Ich denk aber das ist schlecht Programmiert.
    Wenn ich durch den Button das Script starte und nicht durch erneutes drücken beende sondernd durch X die Gui beende läuft das Script weiter und nur durch reeboot wir es gestoppt.

    Durch die Ergänzung in rot geht es zwar aber ist bestimmt nicht gut.

    Ich habe am Schluss noch folgendes ergänzt und es funkioniert nur sauber ist das nicht gelöst oder ??????????

    view = View()


    GPIO.cleanup()
    print (blink_process)


    if blink_process is None:
    exit

    else:
    subprocess.call(["sudo","kill", str(blink_process.pid)])

    Zum anschauen nochmal die Gui als Anlage. windows11c.py

    Wer noch Verbesserungsforschläge hat. Gerne :thumbs1: :)

    Nochmal vielen vielen Dank :danke_ATDE:

  • Da du meinen Erklärungen keinen Dank würdigst verkneif ich mir jetzt eine äußerst einfache Lösung zu deinem letzten Problem ... aber wer weiß, vielleicht kommst du auch ausnahmsweise selbst drauf wenn du nur mal die Dokumentation zu tkinter und protocol ließt.

  • @ Meigrafd deine Erklärungen waren nicht zielführend sondern verwirrend. Zumindestens für Anfänger. Ich nehme dein letztes Statement mit einem lächeln zur Kenntnis und bin glücklich eine Lösung durch andere gefunden zu haben.

    Vielen DANK an Alle hier.

    :danke_ATDE: :bravo2: :danke_ATDE:

Jetzt mitmachen!

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