[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