2016-03-03 11 views
7

Sto avendo tutte le librerie scritte in TCL. Voglio creare una GUI in Python che avrà pochi pulsanti e altre opzioni. All'inizio la shell TCL si aprirà. Quando farò clic sui pulsanti, i rispettivi comandi verranno eseguiti sulla shell TCL.Come eseguire comandi sulla stessa shell TCL usando Python

È possibile attivare i comandi sulla stessa shell di TCL senza chiudere la shell TCL.

Ho cercato su google e ho trovato il modulo Tkniter in Python ma aprirò la shell TCL ogni volta che devo eseguire il comando.

+0

Mi sembra che tu stia sbagliando se stai facendo un nuovo interprete ogni volta che vuoi eseguire un comando. Questo sta massimizzando la quantità di spese generali, il che è ridicolo. –

+1

@DonalFellows Ho letto come sta chiedendo come utilizzare un singolo processo di interprete TCL. Per esempio. esplicitamente non avviare ogni volta un nuovo processo. –

+0

No Non voglio fare ogni volta un nuovo interprete. Voglio eseguire comandi sulla stessa vecchia shell TCL – Nitesh

risposta

2

Si può certamente usare Tkinter per eseguire una serie di comandi nella stessa Tcl interprete:

Python 2.7.9 (default, Feb 28 2016, 05:52:45) [C] on sunos5 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Tkinter 
>>> root = Tkinter.Tk() 
>>> root.tk.eval('set msg "hello world"') 
'hello world' 
>>> root.tk.eval('string length $msg') 
'11' 
>>> root.tk.eval('foreach x {1 2 4} {puts "$msg $x"}') 
hello world 1 
hello world 2 
hello world 4 
'' 
>>> 

- qui il msg variabile è impostata in un comando e il suo valore viene utilizzato nei comandi successivi, che non avrebbe lavoro se stessimo creando un nuovo interprete per ogni comando. Se non vuoi che venga creata la finestra Tk, esegui semplicemente root.tk.eval('wm withdraw .') per nasconderla.

Se questo non risponde alla tua domanda è meglio che spieghi che cosa è che avete bisogno :-)

+1

Fatto divertente: è possibile utilizzare tkinter senza creare la finestra di root. La classe 'Tk' accetta un argomento di parole chiave chiamato' useTk'. Se lo imposti su 'False' otterrai un interprete tcl senza tk. –

1

Questo problema può essere risolto utilizzando Pexpect

Pexpect è un modulo Python per la deposizione delle uova applicazioni bambino e controllando automaticamente. Pexpect può essere utilizzato per automatizzare le applicazioni interattive come ssh, ftp, passwd, telnet, ecc. Può essere utilizzato per automatizzare gli script di installazione per la duplicazione di installazioni di pacchetti software su server diversi. È possibile utilizzare per il test automatico del software. Pexpect è nello spirito di Don Aspettatevi le Libes, ma Pexpect è puro Python. Altri moduli Expect-like per Python richiedono TCL e Expect o richiedono l'estensione C per essere compilati. Pexpect non utilizza estensioni C, Expect o TCL. Dovrebbe funzionare su qualsiasi piattaforma che supporti il modulo pty standard di Python. L'interfaccia Pexpect si concentra sulla facilità d'uso, quindi che semplici compiti sono facili.

esempio di utilizzo presa direttamente dal sito Pexpect

child = pexpect.spawn('scp foo [email protected]:.') 
child.expect ('Password:') 
child.sendline (mypassword) 

è possibile generare il terminale come un processo figlio e quindi utilizzare questo bambino per inviare comandi quando GUI genera un evento.

+1

L'interrogante dice che ha già delle librerie scritte in Tcl che deve chiamare da Python. La funzionalità in stile Expect è irrilevante qui. –

+0

Sì, è vero, ma penso che possa essere ottenuto associando gli eventi generati facendo clic su un pulsante sulla GUI di Python con le dichiarazioni expect. – Sharad

+0

Si prega di espandere su di esso se c'è qualcosa che mi manca qui – Sharad

0

Ho creato questo semplice programma tcl pgm.tcl

puts "Hello world" 

posso lanciarlo in un console

tclsh pgm.tcl 

Ecco come può essere lanciato in pitone

from subprocess import Popen, PIPE 
p1 = Popen(['tclsh', 'pgm.tcl'], stdout=PIPE) 
p1out, p1err = p1.communicate() 
if p1out is not None: print (p1out) 
if p1err is not None: print (p1err) 

Questa risposta è dipendente dal sistema operativo (linux), ma dovresti essere in grado di adattarlo ad altri sistemi operativi.

Problemi correlati