[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