On Fri, Jan 30, 2009 at 3:52 PM, Guilherme Polo <ggp...@gmail.com> wrote: > On Fri, Jan 30, 2009 at 11:59 AM, AbsoluteMatt <mattx...@hotmail.com> wrote: >> >> Hi All, >> >> I have been writing a little app in python/tkinter to allow non technical >> users at my office setup/restore manipulate Oracle databases. I am using >> cx_Oracle plugin as well. >> >> The app works fine at the moment, doing everything I want it to. However >> when it comes to importing a db I am just using imp.exe and dpimp.exe >> basically making external system calls to run it. I know this is not ideal >> and I should probably be using popen etc, but I am not to sure on how to get >> it working. I tried a while ago and it broke more than it fixed so I paniced >> and went back to good old command prompt method. >> >> I want to be able to view the output of an oracle import in realtime, > > Tricky! > >> anyone >> that has seen imp/exp knows that when running on command line you can see >> the tables importing as they import line by line. Ideally I would like to >> have a "process" tab on my tkinter app rather than a seperate DOS prompt >> running the command, where you can see this execution. >> >> I cant remember exactly what I tried before, but I think it involved using >> popen and stdout and then printing stdout. However when I did it like this >> it used to print out output in bulk blocks not nicely one line at a time. >> >> So.... Is there anyway to embed a command window inside a tkinter window, > > I don't think so, maybe something like powershell might be able. It > would be easy to do it with xterm, for example, since it has support > for a -into option.
I just noticed there is a win32process module included with pywin32, so it must be possible. Better than that, there is something ready already called pyconsole. It is found it here: http://code.google.com/p/pyconsole/ I got it and tried doing an example with it: import Tkinter import pyconsole class ConsoleProcessWindow(Tkinter.Text): def __init__(self, master=None): Tkinter.Text.__init__(self) self.console_process = pyconsole.ConsoleProcess('cmd.exe', console_update=self.console_update) self.last_line = 0 def test(self): self.console_process.write('dir\n') def console_update(self, x, y, text): self.after_idle(lambda: self.update_text(x, y, text)) def update_text(self, x, y, text): y += 1 for i in xrange(y - self.last_line): self.insert('%d.0' % (self.last_line + i + 1), '\n') self.last_line = y self.insert('%d.%d' % (y, x), text) self.update_idletasks() class App(Tkinter.Frame): def __init__(self): Tkinter.Frame.__init__(self) self.console = ConsoleProcessWindow(self) self.console.pack(side='left', fill='both', expand=True) vscroll = Tkinter.Scrollbar(orient='vertical', command=self.console.yview) self.console['yscrollcommand'] = vscroll.set vscroll.pack(side='right', fill='y') self.after(500, self.console.test) root = Tkinter.Tk() app = App() app.pack(fill='both', expand=True) root.mainloop() And it works! So you just need to send things to this ConsoleProcess like you would do in your typical command prompt. -- -- Guilherme H. Polo Goncalves _______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org http://mail.python.org/mailman/listinfo/tkinter-discuss