wx.py.shell.Shell: Ausgabe von Text in das Shell Fenster

Plattformunabhängige GUIs mit wxWidgets.
Antworten
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Hallo!

Kann man dieses an sich sehr praktische Fenster [1] auch für Statusausgaben nutzen? Ich hätte schon die Funktionen versucht, die das Ding so anbietet, aber meine Ausgaben wandern alle in den Input der Shell, also wenn ich was rausschreibe und der User drückt dann in der Shell "Enter", gibt's Fehler.

Weiß da jemand einen besseren Weg, wie ich Statusausgaben mit einer PythonShell verbinden kann?

[1] http://wxpython.wxcommunity.com/docs/ap ... class.html
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

hmueller hat geschrieben:Kann man dieses an sich sehr praktische Fenster auch für Statusausgaben nutzen?
Hi hmueller!

Keine Ahnung! Aber vielleicht genügt es ja schon, wenn du ein ``#`` vor deine Statusausgabe stellst. Das könnte dann evt. als Kommentar betrachtet werden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi.

Mit ``write`` geht das.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
from wx.py.shell import Shell

wx.SetDefaultPyEncoding("iso-8859-1")


class MainFrame(wx.Frame):
    def __init__(self, parent=None, id=-1, title = "MyApp"):
        wx.Frame.__init__(self, parent, id, title)
        self.Centre()
        self.panel = wx.Panel(self)
        
        pyshell = Shell(parent = self.panel)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(pyshell, 1, wx.EXPAND | wx.ALL, 5)
        self.panel.SetSizer(vbox)
        
        pyshell.write("Hello World\n")
        pyshell.write("Hello World2\n")
        pyshell.write("Hello World3")
         
         
def main():
    app = wx.PySimpleApp()
    mf =  MainFrame()
    mf.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

Output:

Code: Alles auswählen

[...]
Hello World
Hello World2
Hello World3
lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

hmueller hat geschrieben:[...]wenn ich was rausschreibe und der User drückt dann in der Shell "Enter", gibt's Fehler.
Ups.

Dann natürlich so wie Gerold vorgeschlagen hat.

Code: Alles auswählen

[...]
pyshell.write("# Hello World\n")
        pyshell.write("# Hello World2\n")
        pyshell.write("# Hello World3")
[...]
EDIT: Aber warum willst du die Shell für Logausgaben benutzen? :?
Bau dir lieber selber was. So ist das nicht besonder Professional.
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Naja, das ist ja das was ich meine:

Code: Alles auswählen

self.shell = py.shell.Shell(self.rightwindow)
        self.shell.write("blu\n")
        self.shell.write("bla\n")
Dann drückt der User Enter in der Shell...

Code: Alles auswählen

>>> blu
bla

  File "<input>", line 1
    blu
      
^
SyntaxError: invalid syntax
>>> 
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

ah, ok, hast den Fehler eh schon bemerkt :)

Selber bauen heisst was?
Ich hätte gern ein Fenster, in dem die Logausgaben erscheinen, und der User aber auch Shell kommandos abgeben kann.

Gibt's da was oder muss ich das auch noch selbst bauen?
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ach so, du willst das Logfenster gleichzeitig als richtige Shell verwenden.
Naja, ich würde die beiden Bereich von einander trennen.

Ob es schon eine fertige Lösung gibt für ein Log-Fenster weiß ich nicht.

Aber ein Widget zu bauen ist nicht so aufwendig. Je nachdem was du willst.
Du könntest z.B. von ``html.HtmlWindow`` (Wobei du hier noch viele Formatierungsmöglichkeiten per HTML hast, icons, etc) oder ``ListCtrl``erben.

Am simpelsten wäre es aber direkt was mit ``TextCtrl`` zu machen, das nach aussen hin nur zum Lesen Aktiviert ist. Dann kann nur dein Programm (und nicht der Benutzer selber) dort seine Meldungen reinschreiben.

Ich hatte mir damals dafür ein Widget, dass von ``html.HtmlWindow`` erbt, geschrieben. Ist aber noch nicht richtig Fertig (Muss noch eine Möglichkeit für eine optionale Umleitung von stderr und/oder stdout implementieren und docstrings schreiben.)

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@hmueller: Wichtiger Hinweis!

wx.lib.shell

ist
########################################\\
# THIS MODULE IS NOW DEPRECATED |
# |
# Please see the most excellent PyCrust |
# package instead. |
########################################/
Es wird also demnächst wegfallen.

Benutze stattdessen ``Shell`` aus folgenden Package: wx.py.shell


lg
hmueller
User
Beiträge: 39
Registriert: Montag 27. November 2006, 16:07
Wohnort: Linz, Oberösterreich

Danke, aber das tu' ich sowieso.

Ich werd' mal mit $Chef sprechen, wie er sich das genau vorstellt, aber ich glaube einfach Log und Shell zu trennen ist das einfachste.
I must not fear. Fear is the mind-killer. Fear is the little death that brings total obliteration.
I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path.
Antworten