Comment intégrer un terminal dans une application Tkinter?
Je veux intégrer un terminal principal de ma fenêtre Tkinter. Je voudrais avoir une sous-fenêtre où un terminal (Bash terminal) irait. Je tiens également à être en mesure de laisser mon programme interagir avec le terminal, au moins, je voudrais lire le répertoire de travail courant et/ou le définir.
Je ne sais pas si c'est vraiment impossible. J'ai été en mesure de le faire dans le passé avec Perl/Tk, alors peut-être il peut être repris ici.
Le code que j'ai utilisé était alors quelque chose comme:
$frame3=$mw->Frame(-borderwidth=>2, -relief=>'groove', # -label=>'stuff for thought',
-labelBackground=>CADRAWWINCOLOR,-background=>CADRAWWINCOLOR);
$cv=$frame3->Canvas(-height=>$cvheight,-width=>$cvwidth,-background=>CADRAWWINCOLOR,
-bg => CADRAWWINCOLOR,
-relief => 'sunken')->pack(-expand => 1, -fill => 'both');
# this Frame is needed for including the xterm in Tk::Canvas
my $xtermContainer = $cv->Frame(-container => 1);
my $xtid = $xtermContainer->id();
# converting the id from HEX to decimal as xterm requires a decimal Id
my ($xtId) = sprintf hex $xtid;
my $dcontitem = $cv->createWindow($xtermWidth/2,$xtermHeight/2,
-window => $xtermContainer,
-width => $xtermWidth,
-height => $xtermHeight,
-state => 'normal');
system("xterm -into $xtId -fn $fontname -geometry $geometry +sb -bg black -fg white -e ./xtermjob.pl $AAfname 5 &");
où $mw
était la principale fenêtre Tk.
Bien sûr, je suis complètement d'accord avec Bryan: si je n'ai jamais programmé avec une bibliothèque d'interface graphique avant, mon programme (plutôt grand, une sorte de wiki) fonctionne très bien, avec un étonnamment faible quantité de code consacré à l'interface graphique elle-même.
J'ai essayé de traduire ce code Perl, mais je suis d'achoppement sur la ID problème.
Le seul endroit où j'ai trouvé une référence à un moyen d'extraire l'ID from Tkinter est dans Effbotmais quand je l'utilise, je reçois 'AttributeError: Frame instance has no attribute 'window_id'
donc il doit y avoir quelque chose de mal:
termf = Frame(root)
termf.pack(side=BOTTOM, fill=X)
id=termf.window_id()
os.system("xterm -into %d -fn -misc-fixed-medium-r-normal--8-80-75-75-c-50-iso10646-1 -geometry 150x150+0+0 +sb -bg black -fg white -e /root/.bashrc &" % id);
source d'informationauteur alessandro
Vous devez vous connecter pour publier un commentaire.
Je suis heureux de dire qu'il est en fait possible de le faire, et vous pouvez le faire avec seulement quelques lignes de code (je ne sais pas si c'est si facile avec d'autres boîtes à outils):
Le problème était d'utiliser la fonction incorrecte pour wid.
Alessandro déjà signalé cinq heures avant ce qu'il considère comme un modèle adéquat. Pour ceux qui viennent à travers ce point au cours de futures recherches, je vais enregistrer un peu plus d'arrière-plan des faits que je connais:
Il a eu de la chance que Bryan était là pour attirer l'attention sur les différences entre window_id() et winfo_id(), et pour contrer les erreurs d'autres, ont écrit sur les différentes boîtes à outils.
C'est intéressant pour moi comment stackoverflow se compare à plus de chaînes spécialisées. Dans ce cas, le Tkinter liste de diffusion http://mail.python.org/pipermail/tkinter-discuss/2011-September/002968.html rapidement et répondu correctement à la question.
Tkinter, serait une amélioration sur au moins une partie de la lune-rocket software.
Il n'y a pas de courant, de manière stable à faire avec Tkinter. Maintenant, vous avez deux options:
Éloigner de Tkinter, à PyGTK, PyQt ou PySide ou WxPython ou à l'un des cinq bajillion autres GUI libs
Code un terminal de vous-même (difficile et ennuyeux)
Tkinter n'est vraiment pas faites pour quelque chose de grand, surtout jouet de programmes et de petites applications comme makefile générateurs.