[gelöst] Variable klassenübergreifend nutzen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo zusammen, wie kann man die Variable X1 bzw. self.X1 aus der Klasse LeftNotebook() in die Klasse ErgebnisPanel() übergeben, um damit in der Methode onCalc() zu rechnen??
Der Code ist nicht lauffähig, soll nur die Struktur erklären.

(Forumssuche hat leider nichts Brauchbares zu Tage gefördert :-(

Gruß mathi

Code: Alles auswählen

class LeftNotebook(wx.Notebook): 
    
    def __init__(self, parent): 
        wx.Notebook.__init__(self, parent,style=wx.BORDER_RAISED) 
     .   
     .  
     .   
                
    def onTextCtrl(self, event): 
        """Ueberprueft was der Benutzer eingibt. """
       
        self.X1=self.float_input(self.tcX1.GetValue())
        
        return self.X1 #??
.     
.
.
class ErgebnisPanel(wx.Panel): 
    
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent,style=wx.BORDER_RAISED)
. 
. 
.        
    def onCalc(self,event):

        #werte=LeftNotebook(self,-1)
        #self.X1=werte.onTextCtrl()
        X1=self.X1 # X1 aus onTextCtrl()
       
        self.y=2*X1
        ergebnis1= u'y= %s' % (self.y)
        print ergebnis1
Zuletzt geändert von mathi am Mittwoch 19. November 2008, 15:41, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

mathi hat geschrieben:

Code: Alles auswählen

X1=self.X1 # X1 aus onTextCtrl()
in

Code: Alles auswählen

X1 = (LeftNotebook-Instanz).onTextCtrl()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mathi hat geschrieben:wie kann man die Variable X1 bzw. self.X1 aus der Klasse LeftNotebook() in die Klasse ErgebnisPanel() übergeben, um damit in der Methode onCalc() zu rechnen?
Hallo mathi!

Das eine Panel sollte vom anderen Panel nichts wissen müssen. Das zu erreichen, gibt es mehrere Ansätze. Die eine Variante ist die, dass man das eine Panel einen Event auslösen lässt, den man vom gemeinsamen Container aus "handeln" kann. Die andere einfachere Variante ist die, dass man den Container, in dem beide Panels liegen, als Schnittstelle dienen lässt. Wieder weiß keines von beiden Panels, dass es das andere Panel gibt. Nur der Container, welcher sowiso von der Existenz der beiden Panels weiß, arbeitet mit den Panels.

Z.B. so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

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


class LeftPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("white")
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        vbox.AddStretchSpacer()
        self.txt_ctrl = wx.TextCtrl(self, size = (200, -1))
        vbox.Add(self.txt_ctrl, 0, wx.EXPAND | wx.ALL, 10)
        vbox.AddStretchSpacer()
    
    
class RightPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.SetBackgroundColour("yellow")
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(vbox)
        
        vbox.AddStretchSpacer()
        
        self.label = wx.StaticText(self)
        vbox.Add(self.label, 0, wx.EXPAND | wx.ALL, 10)
        
        vbox.AddStretchSpacer()


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, title = "Example"):
        wx.Frame.__init__(self, parent, -1, title)
        
        base_panel = wx.Panel(self)
        
        hbox_main = wx.BoxSizer(wx.HORIZONTAL)
        base_panel.SetSizer(hbox_main)
        
        self.left_panel = LeftPanel(base_panel)
        hbox_main.Add(self.left_panel, 1, wx.EXPAND | wx.ALL, 3)
        self.left_panel.txt_ctrl.Bind(wx.EVT_TEXT, self.on_left_panel_txt_ctrl_text)
        
        self.right_panel = RightPanel(base_panel)
        hbox_main.Add(self.right_panel, 1, wx.EXPAND | wx.ALL, 3)
        
        # Layout
        base_panel.Fit()
        self.Fit()
        self.SetMinSize(self.GetSize())
    
    
    def on_left_panel_txt_ctrl_text(self, event):
        value = self.left_panel.txt_ctrl.GetValue()
        try:
            value = int(value)
            str_value = str(value ** 2)
            self.right_panel.label.SetLabel(str_value)
        except ValueError:
            self.right_panel.label.SetLabel("")


def main():
    """Testing"""
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Siehe auch hier: http://www.python-forum.de/topic-14587.html


mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Danke für die Antworten, vor allem an Gerold.

edit: ich habe die Frage komplett neu gestellt, weil sich die andere erledigt hatte :-)


@all:
Ich habe die einfachere Variante verwendet und es funktioniert soweit erstmal.

http://www.python-forum.de/topic-16755.html
Antworten