Class wxpython通过单击按钮打开新窗口,将参数传递给新窗口
晚上好/早上好 我目前正在制作一个包含许多按钮的GUI,其中一些(9)按钮打开了一个新窗口。此窗口在设置中的所有9种情况下都是相同的,但当用户继续时,此窗口的更改取决于单击了哪些按钮。因此,我想制作一个按钮处理程序,处理所有9个按钮并生成一个新窗口,但将参数传递给新窗口。这是我的代码:Class wxpython通过单击按钮打开新窗口,将参数传递给新窗口,class,user-interface,button,lambda,window,Class,User Interface,Button,Lambda,Window,晚上好/早上好 我目前正在制作一个包含许多按钮的GUI,其中一些(9)按钮打开了一个新窗口。此窗口在设置中的所有9种情况下都是相同的,但当用户继续时,此窗口的更改取决于单击了哪些按钮。因此,我想制作一个按钮处理程序,处理所有9个按钮并生成一个新窗口,但将参数传递给新窗口。这是我的代码: # Handles the creation of all of the buttons def make_button(text, callback, starty, startx, height, width
# 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)
因此,您可以看到,我使用lambda事件调用将两个参数传递给RailConfig_单击的def,slot和rail。在RailConfig_单击的内部,我创建了一个新窗口,但我想再次将这些变量传递给该新窗口,以便我可以使用这些信息来决定以后要更改什么
我尝试将参数放入NewWindow,如下所示:
self.Rail1ConfigSlot1_window = NewWindow(parent=None, id= -1, slot, rail)
但我得到:
SyntaxError: non-keyword arg after keyword arg
我想建议一种不同的方法来创建按钮和处理按钮点击事件。希望有帮助:
# -*- 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()
你能把你的全部源代码都贴出来吗?在self.Rail1ConfigSlot1\u window=NewWindow(parent=None,id=-1,slot,rail)中,您传递了四个参数,但是NewWindow类只需要两个参数(parent和id),所以您得到了SyntaxEror。有趣的是,我发布了另一个问题,问我为什么创建多个按钮的for循环不起作用。虽然这不是这个问题的答案,但我会尝试一下,看看我是否能让这部分发挥作用。我明天会通知你的,谢谢。