[python] Presmerovanie stdout do okna v Tkinteri
RMiklos na pss.sk
RMiklos na pss.sk
Středa Leden 31 12:18:40 CET 2007
Takze presmerovanie print-ov konzoloveho programu do okna (sys.stdout =
text_window)
bude fungovat i s konzolovym programom ktory pouziva sys.exit() /diky
Leovi/ asi takto:
------------------------ skript -----------------------------
from Tkinter import *
from ScrolledText import ScrolledText
import os, sys
from consolepgm import pgm
class py_message_box:
def __init__(self, parent):
#self.root=Tk()
self.frame = Frame(parent)
self.frame.pack()
self.text = ScrolledText(background='black',foreground='green',
font=("Courier", 9))
self.text.pack()
self.mybutton = Button(self.frame, text="Quit",\
command=self.mybuttonClick)
self.mybutton.pack(side=LEFT)
self.mybutton.bind("<Button-1>", self.mybuttonClick)
def mybuttonClick(self, event):
self.frame.quit()
def write(self, s):
self.text.insert(END, s)
root=Tk()
text_window = py_message_box(root)
###
sys.stdout = text_window
print "...Spustam program"
mypgm=pgm()
try:
mypgm.run()
except SystemExit:
print "podprogram skoncil s chybou"
print "...Koniec"
root.mainloop()
------------------ konec skriptu -----------------------
--------------- skript consolepgm.py -------------------
import sys
class pgm:
def __init__(self):
pass
def cosi(self):
pass
def kdesi(self):
pass
def run(self):
for j in range(9):
if j!=7:
print "running..."
else:
print "j = %d" %j
print "Stop Chyba !!!"
sys.exit()
if __name__ == "__main__":
mypgm=pgm()
mypgm.run()
------------------ konec skriptu -----------------------
RMiklos na pss.sk
Sent by: python-bounces na py.cz
31.01.2007 10:50
Please respond to
Konference PyCZ <python na py.cz>
To
Konference PyCZ <python na py.cz>
cc
Subject
Re: [python] Presmerovanie stdout do okna v Tkinteri
No zatial som to vyskusal takto a funguje to:
------------------------ skript -----------------------------
from Tkinter import *
from ScrolledText import ScrolledText
import os, sys
class py_message_box:
def __init__(self, parent):
#self.root=Tk()
self.frame = Frame(parent)
self.frame.pack()
self.text = ScrolledText(background='black',foreground='green',
font=("Courier", 9))
self.text.pack()
self.mybutton = Button(self.frame, text="Quit",\
command=self.mybuttonClick)
self.mybutton.pack(side=LEFT)
self.mybutton.bind("<Button-1>", self.mybuttonClick)
def mybuttonClick(self, event):
self.frame.quit()
def write(self, s):
self.text.insert(END, s)
root=Tk()
text_window = py_message_box(root)
###
sys.stdout = text_window
print "Toto je pokus o presmerovanie\nprintu do okna"
root.mainloop()
------------------ konec skriptu -----------------------
Takisto to funguje ak stary command-line program naimportujem z modulu a
spustim takto:
------------------------ skript -----------------------------
from Tkinter import *
from ScrolledText import ScrolledText
import os, sys
from consolepgm import pgm
class py_message_box:
def __init__(self, parent):
#self.root=Tk()
self.frame = Frame(parent)
self.frame.pack()
self.text = ScrolledText(background='black',foreground='green',
font=("Courier", 9))
self.text.pack()
self.mybutton = Button(self.frame, text="Quit",\
command=self.mybuttonClick)
self.mybutton.pack(side=LEFT)
self.mybutton.bind("<Button-1>", self.mybuttonClick)
def mybuttonClick(self, event):
self.frame.quit()
def write(self, s):
self.text.insert(END, s)
root=Tk()
text_window = py_message_box(root)
###
sys.stdout = text_window
print "Spustam program"
mypgm=pgm()
mypgm.run()
print "Koniec programu"
root.mainloop()
------------------ konec skriptu -----------------------
kde konzolovy program vypada napr. takto
--------------- skript consolepgm.py -------------------
import sys
class pgm:
def __init__(self):
pass
def cosi(self):
pass
def kdesi(self):
pass
def run(self):
for j in range(9):
if j!=7:
print "running..."
else:
print "j = %d" %j
print "Stop"
#sys.exit()
if __name__ == "__main__":
mypgm=pgm()
mypgm.run()
------------------ konec skriptu -----------------------
Dostal som sa vsak do dalsieho problemu!
Konzolovy program je ukonceny po fatalnej chybe vzdy so
sys.exit()
A ked tam mam sys.exit() ukonci to aj GUI aplikaciu (preto som ho hore
zakomentoval)
Michal Vyskocil <michal.vyskocil na gmail.com>
Sent by: python-bounces na py.cz
30.01.2007 22:58
Please respond to
Konference PyCZ <python na py.cz>
To
Konference PyCZ <python na py.cz>
cc
Subject
Re: [python] Presmerovanie stdout do okna v Tkinteri
Dne úterý 30 leden 2007 17:17 RMiklos na pss.sk napsal(a):
> Nazdar,
> Mam command-line programm, ktory pise rozne chybove hlasky cez print na
> stdout.
> Rad by som ho prerobil do GUI v Tkinteri, ale bez toho aby som musel
> namiesto printov vkladat tie retazce do widgetu ScrolledText,
> t.j. aby som nemusel kazdy prikaz
> print errormsg
> prepisovat na
> self.textokno.insert(END, msg)
> kde
> self.textokno = ScrolledText(..)
>
> Je nejaky sposob, ako presmerovat stdout do textoveho okna?
> (napriklad podobne ako sa da stdout presmerovat do suboru?)
> Kto by mi vedel poradit?
Neco takoveho by slo (a to jenom mozna) v plan9, ale v beznych OS ne
(rozhodne
ne nijak jednoduse). stdout je z pohledu systemu bran jako soubor (majici
vlastni deskriptor a v unixech dokonce vlastni souborovou reprezentaci
v /dev/).
Bohuzel neni print v Pythonu normalni funkce, ale syntakticka konstrukce,
takze nic jako def print() napsat nejde.
Takze moznosti jsou asi tyto
1.) najit a nahradit v textovem editoru
2.) nadefinovat si vlastni funkci def tkprint()
3.) zabalit to do tridy, aby to fungovalo obecneji (pochopitelne mohou byt
promenne a metody staticke, pokud nam staci jeden widget se stdout)
class TkPrint:
def __init__(self, win):
self.win = win
def tkprint(self, msg): #
pozor, metoda se nesmi jmenovat print
self.win.insert(END, msg)
IMHO je print jednou z bolistek Pythonu ...
--
best regards
Michal Vyskocil
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
Mgr. Ing. Roman MIKLÓ©
Prvá stavebná sporiteµňa a.s.
Bajkalská 30, P. O. Box 48
829 48 Bratislava 25
Tel.: +421/ 2 / 582 31 174
Fax: +421/ 2 / 582 31 109
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
Mgr. Ing. Roman MIKLÓ©
Prvá stavebná sporiteµňa a.s.
Bajkalská 30, P. O. Box 48
829 48 Bratislava 25
Tel.: +421/ 2 / 582 31 174
Fax: +421/ 2 / 582 31 109
Daląí informace o konferenci Python