aus importierten Modul ein Widget erstellen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

Hallo Leute
bin neu hier und auch neu in Python (vorher Delphi). Habe in der Suche geschaut aber nix passendes gefunden.

Habe folgendes Probelem:
Ich möchte mein Progi in mehrere Module aufsplitten wie z.b:

VersMax.py

Code: Alles auswählen

import wx
from MainFrame import MainFrame

class TVersMax(wx.App):
    def OnInit(self):
        wx.InitAllImageHandlers()
        mainframe = MainFrame(None, -1, "")
        self.SetTopWindow(mainframe)
        mainframe.Show()
        return 1

# end of class TVersMax

if __name__ == "__main__":
    VersMax = TVersMax(0)
    VersMax.MainLoop()
MainFrame.py

Code: Alles auswählen

import wx
import TreeFrame

class MainFrame(wx.Frame):
    
    def __init__(self, *args, **kwds):
        # begin MainFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        
        self.__set_properties()
        self.__do_layout()
        #End MainFrame.__init__
 

    def __set_properties(self):
        # begin MainFrame.__set_properties
        self.SetTitle("VersMax-Beta")
        _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(wx.Bitmap("/home/max/Downloads/Tango/24x24/apps/ksysguard.png", wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.SetSize((1155, 640))
         # end MainFrame.__set_properties
         
    def __do_layout(self):
        # begin MainFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer_1)
        self.Layout()
        self.Center()
        # end MainFrame.__do_layout
[/code]

TreeFrame.py

Code: Alles auswählen

import wx

class TreeFrame(wx.TreeCtrl):
    def __init__(self, *args, **kwds):
        # begin : TreeFrame.__init__
        self.tree_ctrl_1 = wx.TreeCtrl(self, -1, style=wx.TR_HAS_BUTTONS|wx.TR_DEFAULT_STYLE|wx.SUNKEN_BORDER)

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree_ctrl_1)     #Event generated

    def __set_properties(self):
        # begin  TreeFrame.__set_properties
        self.SetTitle("frame_1")
        # end 

    def __do_layout(self):
        # begin TreeFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.tree_ctrl_1, 1, wx.LEFT|wx.TOP, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

    def OnSelChanged(self, event): # : TreeFrame.<event_handler>
        print "Event handler `OnSelChanged' not implemented!"
        event.Skip()

# end of class TreeFrame
Nun möchte ich folgendes machen: Im MainFrame soll TreeFrame links eingebettet werden. Irgendwie check ich das überhaupt nicht das es angezeigt wird (Fehlerhafter Code wurde entfernt damit es überhaupt wieder läuft)

Den TreeView wollte ich nur zur Probe erstellen den eigendlich soll in der endgültigen Version bei jedem Klick auf das Treeview rechts eine andere Eingabemaske erscheinen.

Weiters hätte ich noch ne Frage welche Bücher ihr für WxPython, Python, Python - Firebird so empfehlen könnt.

Thx
Markus
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Also erstmal sind diese private methods unschön, die würde ich weglassen und ganz einfach normale verwenden.

Zum eigentlichen Problem:

Du erbst ja von TreeCtrl und erstellst damit deine "eigene" TreeCtrl Klasse. Dementsprechend musst du das auch initialisieren (da du ja __init__ überschrieben hast) und nicht wieder eine neue Instanz erstellen.

Code: Alles auswählen

class TreeFrame(wx.TreeCtrl):
    def __init__(self, *args, **kwds):
        # begin : TreeFrame.__init__
        wx.TreeCtrl.__init__(self, -1, style=wx.TR_HAS_BUTTONS|wx.TR_DEFAULT_STYLE|wx.SUNKEN_BORDER)
Hiervon erstellst du dir dann einfach eine neue Instanz und fügst es in deinen Sizer ein:

Code: Alles auswählen

my_tree_ctrl = TreeFrame()
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(my_tree_ctrl, -1)
self.SetSizer(sizer)
Vorausgesetzt self ist vom Typ wx.Frame.

Das beste Buch ist wahrscheinlich wxPython in Action.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

SchneiderWeisse hat geschrieben:Also erstmal sind diese private methods unschön, die würde ich weglassen und ganz einfach normale verwenden.
Vor allem sind sie nicht ``private``.
Mehr dazu hier: http://docs.python.org/3.1/tutorial/cla ... -variables
und natuerlich auch in http://www.python.org/dev/peps/pep-0008/
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Nichtsdestotrotz heißen sie so... ;)
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

So habe es nun so versucht:

Code: Alles auswählen

import wx
from TreeFrame import TreeFrame

class MainFrame(wx.Frame):
    
    def __init__(self, *args, **kwds):
        # begin MainFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        
        self.set_properties()
        self.do_layout()
        #End MainFrame.__init__
 

    def set_properties(self):
        # begin MainFrame.__set_properties
        self.SetTitle("VersMax-Beta")
        _icon = wx.EmptyIcon()
        _icon.CopyFromBitmap(wx.Bitmap("/home/max/Downloads/Tango/24x24/apps/ksysguard.png", wx.BITMAP_TYPE_ANY))
        self.SetIcon(_icon)
        self.SetSize((1155, 640))
         # end MainFrame.__set_properties
         
    def do_layout(self):
        # begin MainFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        tree = TreeFrame()
        sizer_1.Add(tree,-1)
        self.SetSizer(sizer_1)
        self.Layout()
        self.Center()
        # end MainFrame.__do_layout
Bekomme aber folgende Fehlermeldung:

TypeError: in method 'new_TreeCtrl', expected argument 1 of type 'wxWindow *'
Ich geh mal davon aus, da self ein Frame ist und TreeFrame ein TreeCtrl ist diese Fehlermeldung entsteht.

Wie ich aus der class TreeCtrl sehe will diese ein Window haben oder lieg ich hier komplett falsch :?:

Code: Alles auswählen

class TreeCtrl(_core.Control):
    """Proxy of C++ TreeCtrl class"""
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
    __repr__ = _swig_repr
    def __init__(self, *args, **kwargs): 
        """
        __init__(self, Window parent, int id=-1, Point pos=DefaultPosition, 
            Size size=DefaultSize, long style=TR_DEFAULT_STYLE, 
            Validator validator=DefaultValidator, 
            String name=TreeCtrlNameStr) -> TreeCtrl
        """
        _controls_.TreeCtrl_swiginit(self,_controls_.new_TreeCtrl(*args, **kwargs))
        self._setOORInfo(self);TreeCtrl._setCallbackInfo(self, self, TreeCtrl)
Danke schon mal im vorraus für eure Hilfe bei meinen Newby Fragen :wink:
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich nehem an es erwartet ein "parent"-Element:

Code: Alles auswählen

class TreeFrame(wx.TreeCtrl): 
    def __init__(self, parent, *args, **kwds): 
        # begin : TreeFrame.__init__ 
        wx.TreeCtrl.__init__(self, parent, -1, style=wx.TR_HAS_BUTTONS|wx.TR_DEFAULT_STYLE|wx.SUNKEN_BORDER)

Code: Alles auswählen

tree_ctrl = TreeCtrl(self) # self ist ein Panel oder Frame oder was auch immer
schau am besten in die eigentlich umfangreiche wxPython Referenz.
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

Habs gelöst kann geschlossen werden - Thx @ all

Code: Alles auswählen

import wx
from TreeFrame import MainTree

class MainFrame(wx.Frame):
    def __init__(self,parent,id,title):
        # begin MainFrame.__init__
        wx.Frame.__init__(self,parent,id,title)
        self._icon = wx.EmptyIcon()
        self._icon.CopyFromBitmap(wx.Bitmap("face-glasses.png", wx.BITMAP_TYPE_ANY))
        self.SetIcon(self._icon)
        self.SetSize((1155, 640))
        
        mainpanel = wx.Panel(self,-1)
        secondpanel = wx.Panel(self, -1)
        mainpanel.SetBackgroundColour('Red')
        secondpanel.SetBackgroundColour('Blue')
        
        Tree = MainTree(mainpanel,-1)
   
        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(mainpanel,1, wx.EXPAND)
        sizer_1.Add(secondpanel,6, wx.EXPAND)
        self.SetSizer(sizer_1)
        self.Layout
        #End MainFrame.__init__   

import wx

class MainTree(wx.TreeCtrl):
    def __init__(self,parent,id):
        wx.TreeCtrl.__init__(self,parent,id)

        self.tree = wx.TreeCtrl(self, 1, wx.DefaultPosition, (-1,-1), wx.TR_HIDE_ROOT|wx.TR_HAS_BUTTONS)
        self.tree.size = (550, 350)
        root = self.tree.AddRoot('VersMax')
        kd = self.tree.AppendItem(root, 'Kunden')
        vertrag = self.tree.AppendItem(root, 'Vertraege')
        schaden = self.tree.AppendItem(root, 'Schaeden')
        self.tree.AppendItem(kd, 'Anlegen')
        self.tree.AppendItem(kd, 'Suchen')

        self.tree.AppendItem(vertrag, 'Suchen')
        self.tree.AppendItem(vertrag, 'Anlegen')
        self.tree.AppendItem(schaden, 'Suchen')
        self.tree.AppendItem(schaden, 'Anlegen')

        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=1)
        
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(self.tree, 1, wx.EXPAND)
        self.SetSizer(self.vbox)
        

    def OnSelChanged(self, event): # : TreeFrame.<event_handler>
        print "Event handler `OnSelChanged' not implemented!"
        event.Skip()
Antworten