2016-04-08 3 views
0

Guten Abend/Morgen Griff,Make eine Funktion mehrere Tastenklicks in wxpython

Ich habe ein bisschen über diese verwandten Thema wurde Entsendung und Sie können sogar einen Beitrag von mir finden, die diesem ähnlich ist, obwohl ich habe, Problem konzeptionell die Antwort auf ein anderes Problem auf diesen Umstand anwenden.

Ich habe ein Programm, das das gleiche Layout 4 mal im Fenster wiederholt. Aus diesem Grund habe ich festgestellt, dass ich jeden Knopf 4 mal deklariere, was nervig ist. Also, ich habe gepostet und konnte dieses Problem beheben. Das Problem ist jetzt, dass ich nicht weiß, wie das zu tun ist, wenn ein Knopfklick ein neues Fenster öffnet. Hier

ist der Code:

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 

self.Rail1ConfigSlot1 = make_button("Configure", self.Rail1ConfigSlot1_clicked, 10, 1, 1, 1) 
self.Rail2ConfigSlot1 = make_button("Configure", self.Rail2ConfigSlot1_clicked, 10, 2, 1, 1) 
self.Rail3ConfigSlot1 = make_button("Configure", self.Rail3ConfigSlot1_clicked, 10, 3, 1, 1) 
self.Rail1ConfigSlot2 = make_button("Configure", self.Rail1ConfigSlot2_clicked, 10, 6, 1, 1) 
self.Rail2ConfigSlot2 = make_button("Configure", self.Rail2ConfigSlot2_clicked, 10, 7, 1, 1) 
self.Rail3ConfigSlot2 = make_button("Configure", self.Rail3ConfigSlot2_clicked, 10, 8, 1, 1) 
self.Rail1ConfigSlot3 = make_button("Configure", self.Rail1ConfigSlot3_clicked, 10, 11, 1, 1) 
self.Rail2ConfigSlot3 = make_button("Configure", self.Rail2ConfigSlot3_clicked, 10, 12, 1, 1) 
self.Rail3ConfigSlot3 = make_button("Configure", self.Rail3ConfigSlot3_clicked, 10, 13, 1, 1) 
self.Rail1ConfigSlot4 = make_button("Configure", self.Rail1ConfigSlot4_clicked, 10, 16, 1, 1) 
self.Rail2ConfigSlot4 = make_button("Configure", self.Rail2ConfigSlot4_clicked, 10, 17, 1, 1) 
self.Rail3ConfigSlot4 = make_button("Configure", self.Rail3ConfigSlot4_clicked, 10, 18, 1, 1) 


def Rail1ConfigSlot1_clicked(self, event): 
self.Rail1ConfigSlot1_window = NewWindow(parent=None, id= -1) 
self.Rail1ConfigSlot1_window.Show() 

def Rail2ConfigSlot1_clicked(self, event): 
self.Rail2ConfigSlot1_window = NewWindow(parent=None, id= -1) 
self.Rail2ConfigSlot1_window.Show() 

def Rail3ConfigSlot1_clicked(self, event): 
self.Rail3ConfigSlot1_window = NewWindow(parent=None, id= -1) 
self.Rail3ConfigSlot1_window.Show() 

def Rail1ConfigSlot2_clicked(self, event): 
self.Rail1ConfigSlot2_window = NewWindow(parent=None, id= -1) 
self.Rail1ConfigSlot2_window.Show() 

def Rail2ConfigSlot2_clicked(self, event): 
self.Rail2ConfigSlot2_window = NewWindow(parent=None, id= -1) 
self.Rail2ConfigSlot2_window.Show() 

def Rail3ConfigSlot2_clicked(self, event): 
self.Rail3ConfigSlot2_window = NewWindow(parent=None, id= -1) 
self.Rail3ConfigSlot2_window.Show() 

def Rail1ConfigSlot3_clicked(self, event): 
self.Rail1ConfigSlot3_window = NewWindow(parent=None, id= -1) 
self.Rail1ConfigSlot3_window.Show() 

def Rail2ConfigSlot3_clicked(self, event): 
self.Rail2ConfigSlot3_window = NewWindow(parent=None, id= -1) 
self.Rail2ConfigSlot3_window.Show() 

def Rail3ConfigSlot3_clicked(self, event): 
self.Rail3ConfigSlot3_window = NewWindow(parent=None, id= -1) 
self.Rail3ConfigSlot3_window.Show() 

def Rail1ConfigSlot4_clicked(self, event): 
self.Rail1ConfigSlot4_window = NewWindow(parent=None, id= -1) 
self.Rail1ConfigSlot4_window.Show() 

def Rail2ConfigSlot4_clicked(self, event): 
self.Rail2ConfigSlot4_window = NewWindow(parent=None, id= -1) 
self.Rail2ConfigSlot4_window.Show() 

def Rail3ConfigSlot4_clicked(self, event): 
self.Rail3ConfigSlot4_window = NewWindow(parent=None, id= -1) 
self.Rail3ConfigSlot4_window.Show() 

class NewWindow(wx.Frame): 
    def __init__(self,parent,id): 
     wx.Frame.__init__(self, parent, id, 'New Window', size=(400,300)) 
     wx.Frame.CenterOnScreen(self) 
     #self.new.Show(False) 

Also, wie kann ich eine Definition zu machen, die universal ist, alle diese 12 nahezu identisch Tasten zu handhaben, doch haben die Fenster zueinander individuell und unabhängig sein?

Antwort

1

Ich verstehe nicht, warum Sie verschiedene Event-Handler für jede dieser Schaltflächen benötigen. Sie alle öffnen schließlich eine neue Instanz von NewWindow. Wenn Sie alle Tasten auf den gleichen Ereignishandler binden, dann können Sie eine Schleife verwenden, um die Tasten zu erstellen:

for num in range(1, 13): 
    make_button("Configure", self.onConfigure, num, 9, 1, 1) 

def onConfigure(self, event): 
    new_window = NewWindow(parent=None, id=-1) 
    new_window.Show() 
+0

Ich entschuldige mich, aber die Positionierung der Tasten wurden tatsächlich falsch bezeichnet. Ich habe es bearbeitet, jetzt funktioniert deine Schleife nicht wirklich. Deshalb war ich mehr daran interessiert, eine Funktion zu tun und verschiedene Parameter in das neue Fenster zu übergeben, das irgendwann erstellt wird –

+0

Ich dachte, ich könnte noch geschachtelte For-Schleifen verwenden, um es so zu tun, wie Sie dann präsentiert –

+0

Sie sind Ich übergebe bereits die Position der Tasten an die 'make_button' Funktion, also bin ich mir nicht sicher, warum dieser Code nicht funktionieren würde. –

0

Meine Lösung von @ Mike Driscoll abgeleitet wurde, der mir die Idee für die for-Schleife gab. Das einzige Problem mit der von ihm erstellten for-Schleife war, dass ich versehentlich die falschen Positionen eingegeben hatte und seine Werte nicht wirklich mit den Tastenpositionen meines Codes übereinstimmten. So habe ich es gemacht, um die Knöpfe richtig zu positionieren.

for num in range(1, 4): 
    make_button("Configure", self.RailConfig_clicked, 10, num, 1 ,1) 
    make_button("Configure", self.RailConfig_clicked, 10, num+5, 1, 1) 
    make_button("Configure", self.RailConfig_clicked, 10, num+10, 1, 1) 
    make_button("Configure", self.RailConfig_clicked, 10, num+15, 1, 1) 

def RailConfig_clicked(self, event): 
    self.Rail1ConfigSlot1_window = NewWindow(parent=None, id= -1) 
    self.Rail1ConfigSlot1_window.Show() 
+0

Aus irgendeinem Grund kann ich mit der Methode "lamda event: self.Rail1Config_clicked (event, parameter)" Parameter nicht an Rail1Config_clicked übergeben. Dies stellt ein großes Problem dar, da jetzt alle Schaltflächen mit demselben neuen Fenster verknüpft sind. aber ich bin nicht in der Lage, Parameter zu übergeben, um die Fenster zu variieren. –