Datei Ausführbar machen und Ausführen
Hallo ich habe folgendes Problem ich habe mir eine Grafik Programmiert mit einem Button nun zu meinem Problem ich möchte mit dem Button eine andere Datei mit einer Grafik öffnen und nach der Auswahl das Alte Fenster schlissen ich denke ich habe den richtigen befehl dafür gefunden nur das ich die Datei mit der 2. Programmierten Grafik nicht geöffnet bekomme habe der Datei schon die Ausführbaren Rechte vergeben aber bei einem Doppel klick kommt auch das Fenster mit der Auswall Ausführen oder Öffnen aber beim Ausführen Öffnet sich nix?? Vielleicht hat ja jemand einen guten Tip für mich ich bin so langsam am verzweifeln.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tkinter import *
import os
def exit_():
os._exit(1)
fenster = Tk()
fenster.geometry("1000x500")
fenster.title("Nur ein Fenster")
b = Button(fenster, text = "Beenden", command = exit_)
b.pack()
fenster.mainloop()
Zuletzt geändert von Anonymous am Donnerstag 9. März 2017, 08:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@DasIngo: Und wo wird da jetzt etwas anderes ausgeführt?
Das `os._exit()` solltest Du durch `sys.exit()` ersetzen. Namen mit einem führenden Unterstrich gehören nicht zur öffentlichen API.
Das `os._exit()` solltest Du durch `sys.exit()` ersetzen. Namen mit einem führenden Unterstrich gehören nicht zur öffentlichen API.
Code: Alles auswählen
from tkinter import *
import os
import subprocess
#def start():
# os.sys("GrafiktestBeenden.py")
def wifi():
subprocess.call(["/home/pi/GrafiktestBeenden"],shell=True)
fenster = Tk()
fenster.geometry("500x500")
fenster.title("Nur ein Fenster")
b = Button(fenster, text = "Start", command=wifi)
b.pack()
fenster.mainloop()
das sind alles test Dateien zum probieren bevor ich es in die richtige Datei einsetze, mit der Datei will ich die andere Starten
Zuletzt geändert von Anonymous am Donnerstag 9. März 2017, 09:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@DasIngo: Was wird denn auf der Konsole ausgegeben wenn Du das von dort startest und die Schaltfläche drückst?
Code: Alles auswählen
#!/usr/bin/env python
from tkinter import *
from datetime import datetime, timedelta
import time
def wechsleFarbe1():
b1["fg"]="#01DF01"
return
def wechsleFarbe2():
b2["fg"]="#01DF01"
return
def wechsleFarbe3():
b3["fg"]="#01DF01"
return
def wechsleFarbe4():
b4["fg"]="#01DF01"
return
Haubtfenster = Tk()
Haubtfenster.title("Unser GUI Programm")
Haubtfenster.geometry("1200x800")
frame1 = Frame(Haubtfenster) #unsichtbares Fenster im Haubtfenster
lab1 = Label(Haubtfenster, text="Wilkommen am Brutschrank!", width=60, height=4)
lab1["font"]="Arial 20 italic"
lab2 = Label(Haubtfenster, text="Bitte wählen sie das zu brühtende Geflügel aus!", width=60, height=3) #Text in Fenster
lab2["font"]="Courier 12 bold"
lt = time.localtime()
lab3 = Label(Haubtfenster, text="Datum: {0:02d}.{1:02d}.{2:4d}".format(lt[2], lt[1], lt[0]), width=20, height=2) #Text in Fenster
lab3["font"]="Courier 10 bold"
lt = time.localtime()
lab4 = Label(Haubtfenster, text="Uhrzeit: {0:02d}:{1:02d}:{2:2d}".format(lt[3], lt[4], lt[5]), width=20, height=2) #Text in Fenster
lab4["font"]="Courier 10 bold"
b1 = Button(frame1, text="Wachteln", command=wechsleFarbe1, width=10, height=2, fg="#FF0000")
b2 = Button(frame1, text="Hühner", command=wechsleFarbe2, width=10, height=2, fg="#FF0000")
b3 = Button(frame1, text="Enten/Gänse", command=wechsleFarbe3, width=10, height=2, fg="#FF0000")
b4 = Button(frame1, text="Puten", command=wechsleFarbe4, width=10, height=2, fg="#FF0000")
lab1.grid(row=0, column=2) #side=LEFT(Lings),side=RIGHT(rechts),side=BOTTOM(unten),side=TOP(oben)
lab2.grid(row=1, column=2)
lab3.grid(row=2, column=2)
lab4.grid(row=3, column=2)
b1.grid(row=4, column=0)
b2.grid(row=5, column=0)
b3.grid(row=6, column=0)
b4.grid(row=7, column=0)
frame1.grid(row=7, column=2)
Haubtfenster.mainloop()
mit der Datei will ich die End sprechenden Programme auswählen
Zuletzt geändert von Anonymous am Donnerstag 9. März 2017, 09:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@DasIngo: Wenn Du das Programm mit dem `subprocess.call()`-Aufruf von einer Konsole aus startest und auf die Schaltfläche klickst, was wird dann auf der Konsole ausgegeben? Nichts?
Welches von den gezeigten Quelltexten ist denn ``/home/pi/GrafiktestBeenden``? Ist das ausführbar? Also hat dass das „executable bit“ im Dateisystem gesetzt? Und gibt die erste Zeile in der Datei auch das passende Programm zum Ausführen an? In Deinem letzten Quelltext dürfte das beispielsweise nicht der Fall sein. Wenn man das Startet, sollte man einen `ImportError` von Python 2 bekommen, weil das `tkinter` nicht importieren kann.
Allgemeine Anmerkungen: Lass die Sternchenimporte bleiben. Und vor GUI-Programmierung sollte man objektorientiere Programmierung drauf haben, die braucht man nämlich bei der GUI-Programmierung. Das Du das alles auf Modulebene schreibst und die Funktionen einfach so auf Variablen ausserhalb zugreifen, wird schnell unübersichtlich und fehleranfällig.
Durchnummerierte Namen sind ein „code smell“. Man will dann in der Regel bessere Namen wählen, oder gar keine einzelnen Namen sondern die Werte in eine Datenstruktur stecken. Meistens eine Liste. Bei den nummerierten `wechsleFarbe*()`-”Funktionen” möchte man entweder Namen wählen die dem Leser verraten warum die Farbe gewechselt wird, oder wenn man sich den Inhalt der Funktionen anschaut, gar nicht vier verschiedene Funktionen schreiben, die nahezu das gleiche machen. Da schreibt man eine Funktion die das Widget von dem die Farbe geändert werden soll als Argument übergeben bekommt. Und das ``return`` macht keinen Sinn. Am Ende einer Funktion wird auch ohne ein ``return`` zum Aufrufer zurückgekehrt.
Bei `subprocess` sollte man so gut wie niemals ``shell=True`` verwenden. Nur wenn man tatsächlich eine Shell zwischen dem eigenen Programm und dem extern gestarteten benötigt.
Haupt schreibt man nicht mit 'b' und Links nicht mit 'g'.
Welches von den gezeigten Quelltexten ist denn ``/home/pi/GrafiktestBeenden``? Ist das ausführbar? Also hat dass das „executable bit“ im Dateisystem gesetzt? Und gibt die erste Zeile in der Datei auch das passende Programm zum Ausführen an? In Deinem letzten Quelltext dürfte das beispielsweise nicht der Fall sein. Wenn man das Startet, sollte man einen `ImportError` von Python 2 bekommen, weil das `tkinter` nicht importieren kann.
Allgemeine Anmerkungen: Lass die Sternchenimporte bleiben. Und vor GUI-Programmierung sollte man objektorientiere Programmierung drauf haben, die braucht man nämlich bei der GUI-Programmierung. Das Du das alles auf Modulebene schreibst und die Funktionen einfach so auf Variablen ausserhalb zugreifen, wird schnell unübersichtlich und fehleranfällig.
Durchnummerierte Namen sind ein „code smell“. Man will dann in der Regel bessere Namen wählen, oder gar keine einzelnen Namen sondern die Werte in eine Datenstruktur stecken. Meistens eine Liste. Bei den nummerierten `wechsleFarbe*()`-”Funktionen” möchte man entweder Namen wählen die dem Leser verraten warum die Farbe gewechselt wird, oder wenn man sich den Inhalt der Funktionen anschaut, gar nicht vier verschiedene Funktionen schreiben, die nahezu das gleiche machen. Da schreibt man eine Funktion die das Widget von dem die Farbe geändert werden soll als Argument übergeben bekommt. Und das ``return`` macht keinen Sinn. Am Ende einer Funktion wird auch ohne ein ``return`` zum Aufrufer zurückgekehrt.
Bei `subprocess` sollte man so gut wie niemals ``shell=True`` verwenden. Nur wenn man tatsächlich eine Shell zwischen dem eigenen Programm und dem extern gestarteten benötigt.
Haupt schreibt man nicht mit 'b' und Links nicht mit 'g'.
@DasIngo: Natürlich kannst Du keinen Python-Quelltext in einer Shell eingeben. Du sollst von dort das Programm starten das diesen Aufruf enthält. Damit Du siehst was für ein Problem/Fehler in dem Programm ist.
und wie bekomme ich das Programm gestartet also ich habe ja nun gefühlt schon das gesamte Internet durchsucht um das raus zubekommen aber es will einfach nicht klappen das ich das Programm aus einem anderen Programm gestartet bekommen
Wenn man will, dass ein Python-Programm ein weiteres Python-Programm in einem eigenen Interpreter startet, dann ist dies mit subprocess.call([sys.executable, 'pfad/zum/programm.py']) möglich.
Ich denke aber, dass hier eigentlich nach etwas anderem gesucht wird. Eventuell hilft das import-Statement.
Wobei ich das tatsächliche Vorhaben noch nicht wirklich durchschaut habe.
Ich denke aber, dass hier eigentlich nach etwas anderem gesucht wird. Eventuell hilft das import-Statement.
Wobei ich das tatsächliche Vorhaben noch nicht wirklich durchschaut habe.
@DasIngo: Du machst eine Konsole auf, wechselst in das Verzeichnis /home/pi und tippst ./GrafiktestBeenden ein. Das wird wahrscheinlich nicht funktionieren. Bei ./GrafiktestBeenden.py wirst Du hoffentlich mehr Glück haben und eine längere Fehlermeldung bekommen.
das Vorhaben sol sein das ich einen Startbildschirm(Grafikfenster) habe zur Auswahl von 4 verschiedenen Programmen und wenn ich die Auswahl getroffen habe und mit einem Button bestätige soll sich das eigentliche Hauptprogramm öffnen
also mit dem subprocess.call([sys.executable, 'pfad/zum/programm.py']) hat es geklappt erst mal danke dann kann ich mal weiter basteln und mal schauen wo ich wieder hängen bleibe aber erst mal danke an alle für die Hilfe es ist doch echt schwer so als kompletter Neueinsteiger sich da durchzuwurschteln ist doch mehr was man wissen muss als ich im Vorfeld dachte