2016-04-21 10 views
0

Ich habe eine Klasse, die mein Hauptfenster sein. Es heißt main_windows. Im Hauptfenster, wenn ich auf den Button klicken button_1, wird das Programm öffnen Sie eine andere GUI, die dem Benutzer ermöglichen, die Werte einzugeben, erforderlich, um den Additionsprozess zu tun. Das Modul der GUI heißt sub_windows und befindet sich in einer anderen Datei.das Unterfenster im Hauptfenster aufrufen

Ich habe eine Klasse erstellt Model genannt, so dass es meine Klasse sein wird für alle Instanzen bei der Berechnung benötigen. Wie kann ich das Modul sub_windows aufrufen, welches eine GUI ist und gleichzeitig die Klasse Model an das Modul senden?

unten ist der Code:

Modul main_windows:

#!/usr/bin/env python 
# -*- coding: CP1252 -*- 
# 
# generated by wxGlade 0.6.8 (standalone edition) on Thu Apr 21 09:14:23 2016 
# 

import wx 

# begin wxGlade: dependencies 
import gettext 
# end wxGlade 

# begin wxGlade: extracode 
# end wxGlade 
class Model(): 
    def __init__ (self) 
     self.a = None 
     self.b = None 

class MyParentFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # begin wxGlade: MyParentFrame.__init__ 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 
     self.label_1 = wx.StaticText(self, wx.ID_ANY, _("Main_Windows")) 
     self.button_1 = wx.Button(self, wx.ID_ANY, _("Enter Value")) 
     self.button_2 = wx.Button(self, wx.ID_ANY, _("Add\n")) 
     self.label_4 = wx.StaticText(self, wx.ID_ANY, _("Results"), style=wx.ALIGN_CENTRE) 
     self.button_3 = wx.Button(self, wx.ID_ANY, _("button_3")) 

     self.__set_properties() 
     self.__do_layout() 

     self.Bind(wx.EVT_BUTTON, self.to_sub_windows, self.button_1) 
     self.Bind(wx.EVT_BUTTON, self.addition, self.button_2) 



    # end wxGlade 

def __set_properties(self): 
    # begin wxGlade: MyParentFrame.__set_properties 
    self.SetTitle(_("frame_1")) 
    self.label_1.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "MS Shell Dlg 2")) 
    self.label_4.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "MS Shell Dlg 2")) 
    # end wxGlade 

def __do_layout(self): 
    # begin wxGlade: MyParentFrame.__do_layout 
    sizer_1 = wx.BoxSizer(wx.VERTICAL) 
    grid_sizer_1 = wx.GridSizer(5, 5, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.label_4, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.button_3, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    sizer_1.Add(grid_sizer_1, 1, wx.EXPAND, 0) 
    self.SetSizer(sizer_1) 
    sizer_1.Fit(self) 
    self.Layout() 

    def to_sub_windows(self) 

     #What shoud I put here to call the sub_windows? 
     __________ 

    # end wxGlade 

    def addition(self, Model) 

     self.c = Model.a.GetValue() + Model.b.GetValue() 



    # end wxGlade 

    # end of class MyParentFrame 
if __name__ == "__main__": 
    gettext.install("app") # replace with the appropriate catalog name 

    app = wx.PySimpleApp(0) 
    wx.InitAllImageHandlers() 
    frame_1 = MyParentFrame(None, wx.ID_ANY, "") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    app.MainLoop() 

Modul sub_windows:

import wx 

# begin wxGlade: dependencies 
import gettext 
# end wxGlade 

# begin wxGlade: extracode 
# end wxGlade 


class SubFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # begin wxGlade: SubFrame.__init__ 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 
     self.label_1 = wx.StaticText(self, wx.ID_ANY, _("Sub Window"), style=wx.ALIGN_CENTRE) 
     self.label_2 = wx.StaticText(self, wx.ID_ANY, _("A"), style=wx.ALIGN_CENTRE) 
     self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, "") 
     self.label_3 = wx.StaticText(self, wx.ID_ANY, _("B"), style=wx.ALIGN_CENTRE) 
     self.text_ctrl_2 = wx.TextCtrl(self, wx.ID_ANY, "") 
     self.button_1 = wx.Button(self, wx.ID_ANY, _("OK")) 

     self.__set_properties() 
     self.__do_layout() 

     self.Bind(wx.EVT_BUTTON, self.submit, self.button_1) 
     # end wxGlade 

def __set_properties(self): 
    # begin wxGlade: SubFrame.__set_properties 
    self.SetTitle(_("frame_1")) 
    self.label_1.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "MS Shell Dlg 2")) 
    self.label_2.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "MS Shell Dlg 2")) 
    self.label_3.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "MS Shell Dlg 2")) 
    # end wxGlade 

def __do_layout(self): 
    # begin wxGlade: SubFrame.__do_layout 
    sizer_1 = wx.BoxSizer(wx.VERTICAL) 
    grid_sizer_1 = wx.GridSizer(5, 5, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.text_ctrl_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.text_ctrl_2, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add(self.button_1, 0, 0, 0) 
    # grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    grid_sizer_1.Add((20, 20), 0, 0, 0) 
    sizer_1.Add(grid_sizer_1, 1, wx.EXPAND, 0) 
    self.SetSizer(sizer_1) 
    sizer_1.Fit(self) 
    self.Layout() 
    # end wxGlade 

    def submit(self, event): # wxGlade: SubFrame.<event_handler> 

      What should I put here to send the value a, b from this module to the module main_windows 
      print "Event handler 'submit' not implemented!" 
      event.Skip() 

    # end of class SubFrame 
if __name__ == "__main__": 
    gettext.install("app") # replace with the appropriate catalog name 

    app = wx.PySimpleApp(0) 
    wx.InitAllImageHandlers() 
    frame_1 = SubFrame(None, wx.ID_ANY, "") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    app.MainLoop() 

Antwort

1

Wenn Sie möchten, können Sie Ihre Unterfenster ein wx.Dialog machen. Dann in Ihren Event-Handler, die Sie verwenden, um die Unterfenster zu öffnen, können Sie den Dialog modal öffnen, so dass es blockiert das Hauptfenster. Dadurch kann der Benutzer seine Daten eingeben und auf die Schaltfläche "Senden" oder was auch immer drücken.

Wenn die Submit-Taste gedrückt wird, die Steuerung wird an den Ereignishandler in Ihrem Hauptfenster wechseln. Dort können Sie die Werte ziehen die Benutzer eingegeben:

def open_sub_window(self, event): 
    dlg = subwindow(*args) 
    dlg.ShowModal() 
    # get the values 
    value_one = dlg.text_ctrl_1.GetValue() 

Alternativ können Sie auch PubSub können Daten zwischen den Klassen zu senden. Ich persönlich bevorzuge diese Methode, da sie etwas flexibler ist. Sie können lesen, wie es funktioniert in den folgenden Links:

Verwandte Themen