2016-04-11 11 views
0

Guten Abend/Morgen,wxpython öffnen neue Fenster mit Schaltfläche klicken, übergeben Parameter zu neuen Fenster

Ich bin derzeit eine GUI mit vielen Tasten machen, und einige (9) der Tasten ein neues Fenster öffnen. Dieses Fenster ist in allen 9 Fällen in Setup identisch, aber was dieses Fenster ändert, wenn der Benutzer fortfährt, hängt davon ab, auf welche der Schaltflächen geklickt wurde. Ich möchte also einen Button-Handler erstellen, der alle 9 Buttons behandelt und ein neues Fenster erstellt, aber Parameter an das neue Fenster übergibt. So, hier ist mein Code:

# Handles the creation of all of the buttons 
def make_button(text, callback, starty, startx, height, width): 
    button = wx.Button(self, -1, text) 
    sizer.Add(button, (starty, startx), (height, width), wx.EXPAND) 
    button.Bind(wx.EVT_BUTTON, callback) 
    return button 

make_button("Configure", lambda event: self.RailConfig_clicked(event, 1, 1), 10, 1, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 1, 2), 10, 2, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 1, 3), 10, 3, 1 ,1) 

make_button("Configure", lambda event: self.RailConfig_clicked(event, 2, 1), 10, 6, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 2, 2), 10, 7, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 2, 3), 10, 8, 1 ,1) 

make_button("Configure", lambda event: self.RailConfig_clicked(event, 3, 1), 10, 11, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 3, 2), 10, 12, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 3, 3), 10, 13, 1 ,1) 

make_button("Configure", lambda event: self.RailConfig_clicked(event, 4, 1), 10, 16, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 4, 2), 10, 17, 1 ,1) 
make_button("Configure", lambda event: self.RailConfig_clicked(event, 4, 3), 10, 18, 1 ,1) 

def RailConfig_clicked(self, event, slot, rail): 
    self.Rail1ConfigSlot1_window = NewWindow(parent=None, id= -1) 
    self.Rail1ConfigSlot1_window.Show() 
    print slot 
    print rail 

class NewWindow(wx.Frame): 
    def __init__(self,parent,id): 
     wx.Frame.__init__(self, parent, id, 'New Window') 
     wx.Frame.CenterOnScreen(self) 
     self.initialize() 

    def initialize(self): 
     sizer = wx.GridBagSizer() 

     self.VoltageLabel = wx.StaticText(self, -1, 'Margin High Voltage', wx.DefaultPosition, wx.DefaultSize) 
     sizer.Add(self.VoltageLabel, (0,0), (1,1)) 

     self.VoltageLabel2 = wx.StaticText(self, -1, 'Margin Low Voltage', wx.DefaultPosition, wx.DefaultSize) 
     sizer.Add(self.VoltageLabel2, (3,0), (1,1)) 

     self.VoltageLabel3 = wx.StaticText(self, -1, 'Current Voltage Low Value', wx.DefaultPosition, wx.DefaultSize) 
     sizer.Add(self.VoltageLabel3, (0,2), (1,1)) 

     self.VoltageLabel4 = wx.StaticText(self, -1, 'Current Voltage High Value', wx.DefaultPosition, wx.DefaultSize) 
     sizer.Add(self.VoltageLabel4, (3,2), (1,1)) 

     self.SetSizerAndFit(sizer) 
     self.SetSizeHints(-1,-1) 
     self.SetAutoLayout(True) 
     self.Show(True) 
     for col in range(0,5): 
       sizer.AddGrowableCol(col) 

     self.editlow = wx.TextCtrl(self, -1, "", wx.DefaultPosition, wx.DefaultSize) 
     sizer.Add(self.editlow, (1,0), (1,1), wx.EXPAND) 

     self.submitlow = wx.Button(self, label="Submit") 
     sizer.Add(self.submitlow, (5, 5), (1, 1), wx.EXPAND) 

So können Sie sehen, dass ich passieren zwei Parameter an die RailConfig_clicked def, Schlitz und Schiene, durch die Lambda-Ereignis-Aufruf. In RailConfig_clicked erstelle ich ein neues Fenster, aber ich möchte diese Variablen noch einmal an das neue Fenster übergeben, damit ich anhand der Informationen entscheiden kann, was ich später ändern möchte.

Ich habe versucht, wie so die Parameter in NewWindow setzen:

self.Rail1ConfigSlot1_window = NewWindow(parent=None, id= -1, slot, rail) 

aber ich bekomme:

SyntaxError: non-keyword arg after keyword arg 
+0

Können Sie bitte Ihren gesamten Quellcode veröffentlichen? In 'self.Rail1ConfigSlot1_window = NewWindow (parent = None, ID = -1, slot, rail)' haben Sie vier Parameter übergeben, aber die NewWindow-Klasse benötigt nur zwei Parameter (parent und id), also haben Sie den SyntaxEror erhalten. – Quinn

Antwort

0

Ich möchte einen anderen Ansatz vorschlagen Schaltflächen zu erstellen und zu handhaben Knopf- Klicken Sie auf Ereignisse. Hoffe es hilft:

# -*- coding: utf-8 -*- 

########################################################################### 
import wx 
import math 
########################################################################### 
## Class MyFrame1 
## Different button triggers different message 
########################################################################### 

class MyFrame1 (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = "Button group demo", pos = wx.DefaultPosition, size = wx.Size(300,200), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 

     self.m_panel1 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) 
     gSizer1 = wx.GridSizer(3, 3, 0, 0) 
     # Loop to add (9) buttons 
     Btn = lambda x: wx.Button(self.m_panel1, wx.ID_ANY, u"Configure", wx.DefaultPosition, wx.DefaultSize, 0, name = u"row:%d col:%d" % (math.ceil((x -1)/3) + 1, (x - 1)%3 + 1)) 
     for i in range(1, 10): 
      btn = Btn(i) 
      gSizer1.Add(btn, 0, wx.ALIGN_CENTER|wx.ALL, 5) 
      btn.Bind(wx.EVT_BUTTON, self.OnButtonClicked)   

     self.m_panel1.SetSizer(gSizer1) 
     self.m_panel1.Layout() 
     gSizer1.Fit(self) 
     self.Centre(wx.BOTH) 
     self.Show() 

    # Button click event handler 
    def OnButtonClicked(self, event): 
     name = event.GetEventObject().GetName() 
     # Here you can make a new window, and pass in parameters 
     wx.MessageBox('In %s' % (name), 'Button Clicked') 
     event.Skip() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame1(None) 
    app.MainLoop() 
+0

Komisch, ich habe eine weitere Frage gestellt, in der ich gefragt habe, warum meine for-Schleife zum Erstellen mehrerer Tasten nicht funktionierte. Obwohl es nicht die Antwort auf diese Frage ist, werde ich das versuchen, um zu sehen, ob ich diesen Teil arbeiten kann. Ich werde dich morgen aktualisieren, danke. –