Mit Button andere Python Datei ausführen?

Fragen zu Tkinter.
Antworten
Neldela
User
Beiträge: 8
Registriert: Mittwoch 27. Mai 2020, 13:56

Hallo, ich möchte bei einem Klick auf einen Button automatisch eine neue Python Datei (test2.py) starten die ebenfalls ein Fenster öffnet und danach das bisherige Fenster schließen.
Ich habe es mit dem folgenden versucht, hat aber natürlich nicht funktioniert.

Code: Alles auswählen

from tkinter import *
from tkinter import ttk

root = Tk()



button1 = Button(text="öffnen", command=open'test2.py')
button1.pack()


root.mainloop()
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Warum packst du nicht alles in eine Datei?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Man schreibt keine Programme, die andere Python-Programme ausführen, das packt man alles in einen Aufruf. Hier fehlt auch noch viel Kontext. Bisher macht das Fenster mit einem Knopf keinen Sinn. Das wäre kein eigenständiges Programm, sondern nur eine MessageBox, mit irgendeiner Nachricht, die verhindert, dass das eigentliche Programm (test2) losgeht.

Code: Alles auswählen

import tkinter as tk
from tkinter.messagebox import showinfo

def main():
    root = tk.Tk()
    root.iconify()
    tkinter.messagebox.showinfo("Öffnen", "gleich geht es weiter")
    root.deiconify()
    # hier geht es dann mit dem, was in test2 steht weiter

if __name__ == '__main__':
    main()
Neldela
User
Beiträge: 8
Registriert: Mittwoch 27. Mai 2020, 13:56

Der Code war nur ein Test für das eigentliche Script.
Ich bin derzeit dabei ein Interface für die Raspberry HQ Camera zu bauen.

Das zweite Fenster soll nicht nur eine MessageBox sondern ein eigenständiges Fenster sein (ein anderer Kamera Modus)

Für die Funktionalität der Kamera ist es ausschlaggebend dass nicht beide Programme gleichzeitig laufen.

Gibt es keine Möglichkeit von einem Programm aus ein anderes zu starten und sich dann anschließend zu schließen?
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neldela: Die Möglichkeit gibt es, die ist aber nicht der normale, richtige Weg. Und es ging ja nicht um das zweite Fenster als MessageBox, sondern um das erste. Da wo Sirius3 den Kommentar im Quelltext stehen hat, kann dann ja ein Fenster mit beliebigem anderen Inhalt programmiert werden. Beziehungsweise kann man da ja auch vorher schon das `root`-Objekt mit Inhalt füllen. Das wird dann ja nach der MessageBox wieder angezeigt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich glaube das nicht. Was ist der genaue technische Grund, weshalb nicht beide Programme gleichzeitig laufen koennen? Und wenn das wahr waere, dann ginge es so ja auch nicht - denn du startest test2 bevor dieses Programm beendet ist. Notwendigerweise laufen die also fuer einen Moment gleichzeitig. Und es ist auch nicht garantiert, wie lange das ist.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Nedela,

Sirius3 war schneller.
Wenn ich dich richtig verstanden habe, willst Du ein anderes Modul aufrufen.
Auch wenn's bequem ist; bitte vergiss die Sternchenimporte!

Code: Alles auswählen

#!/usr/bin/env python3 -u
# -*- coding: utf-8 -*-

# Python Version 3.7
#Modul test1.py

from tkinter import Tk as tk
from tkinter import ttk
import test2

def main():
    root = tk()
    button1 = tk.Button(text="öffnen", command = oeffne_test2)
    button1.pack()
    root.mainloop()

def oeffne_test2():
    ausfuehre_test2 = test2#

if __name__ == '__main__':
    main()
Hier das Modul test2.py

Code: Alles auswählen

#!/usr/bin/env python3 -u
# -*- coding: utf-8 -*-

# Python Version 3.7

# Modul test2.py

print("Test 2 geöffnet")
Gruss
Peter
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@peterpy: es wäre ungewöhnlich die Tk-Klasse tk zu nennen, die hat auch gar kein Button-Attribut.
`oeffne_test2` nacht auch nichts sinnvolles, denn ein Modul an eine lokale Variable zu binden, ist schon an sich komisch, dann aber nichts damit zu machen noch mehr. Der Code in test2 wird schon beim Import ausgeführt.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

@Sirius3, ja ich sollte nicht ungetestet absenden.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
import test2

Modul test1
def main():    
    root = tk.Tk()
    button1 = tk.Button(root, text="öffnen", command = oeffne_test2)
    button1.pack()
    root.mainloop()
    
def oeffne_test2():    
    ausfuehre_test2 = test2# Instanziere test2
    ausfuehre_test2.ausfuehre_modul2()

if __name__ == '__main__':
    main()
Modul test2

Code: Alles auswählen

def ausfuehre_modul2():
    print("Test 2 geöffnet")
Neldela
User
Beiträge: 8
Registriert: Mittwoch 27. Mai 2020, 13:56

Ich habe jetzt eine Methode gefunden die für meine Zwecke funktioniert.

Danke für alle Antworten!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Neldela: es ist ja nicht so, dass wir hier helfen möchten. Aber mach nur so wie Du denkst und werd glücklich damit.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Sirius3,
ich finde es gut, wenn jemand eine Lösung findet.
Es wird auch nicht erwartet, die Lösung zu veröffentlichen.
Jedenfalls hat sich Neldela bedankt, das ist doch schon anständig.
Es gibt viele, die lassen nichts mehr von sich hören.
Gruss Peter
Antworten