wxpython:按下按钮时如何从主程序打开一个新框架
wxpython: How can I open a new frame from the main program when pushing a button
我有一个使用 wxpython 的 GUI。我的主程序有几个选项卡。在其中一个选项卡中,我添加了一个按钮,单击此按钮时,应该会在发生某些代码的地方弹出一个新的 window,一旦用户完成并按下 DONE 按钮,它将 return到主程序并继续主代码。我希望用户能够使用弹出窗口 window 将文件从一个目录复制到另一个目录。一旦他复制了所有必要的文件,计算就会继续。
我的弹出程序独立运行良好,但是我不知道如何从主程序中调用它...我在主程序中导入了 test.py 文件,但是如何我发起?我尝试使用 test.pop_up() 但后来我无法再关闭弹出框,只收到一条错误消息(未定义 frame2)。这是我想从中调用的 test.py 代码主框架,因此它显示为弹出窗口 window。
import wx
import os
import sys
import shutil
class LeftPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
label = "Buttons"
lbl = wx.StaticText(self, label=label)
self.attach_btn = wx.Button(self, -1, "Select",size = (150,25))
self.Bind(wx.EVT_BUTTON, self.OnOpen, self.attach_btn)
self.remove_btn = wx.Button(self, -1, "Remove")
self.Bind(wx.EVT_BUTTON, self.OnRemove, self.remove_btn)
v_sizer = wx.BoxSizer(wx.VERTICAL)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(v_sizer, 0, wx.ALL, 5)
sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.attach_btn,0, wx.ALL |wx.EXPAND , 3)
sizer.Add(self.remove_btn,0, wx.ALL |wx.EXPAND, 3)
self.SetSizer(sizer)
def OnOpen(self, event):
print('do something')
def OnRemove(self,event):
print('do something else')
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
v_sizer = wx.BoxSizer(wx.VERTICAL)
left_panel = LeftPanel(self)
hsizer.Add(left_panel,1,wx.EXPAND)
self.done_btn = wx.Button(self, -1, "DONE")
self.Bind(wx.EVT_BUTTON, self.OnDone, self.done_btn)
v_sizer.Add(hsizer, 1, wx.EXPAND)
v_sizer.Add(self.done_btn,0, wx.ALL |wx.CENTER, 3)
self.SetSizer(v_sizer)
def OnDone(self,event):
self.Destroy()
wx.CallAfter(frame2.Destroy)
class NewFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Costing Selection")
panel = MainPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame2 = NewFrame()
frame2.SetWindowStyle(wx.STAY_ON_TOP)
app.MainLoop()
def pop_up():
app = wx.App(False)
frame2 = NewFrame()
frame2.SetWindowStyle(wx.STAY_ON_TOP)
app.MainLoop()
我不确定我程序的底部。我需要 def pop_up() 吗?我不知道我还能如何调用该函数...
这是一个简单的例子。
这是您的主要调用程序,它调用弹出窗口
import wx
from Test import NewFrame
class TopFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test")
self.panel = wx.Panel(self)
self.call_button = wx.Button(self.panel, label="Call Popup")
self.call_button.Bind(wx.EVT_BUTTON, self.popup)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Show()
def popup(self, event):
pop = NewFrame()
if __name__ == "__main__":
app = wx.App()
frame2 = TopFrame()
app.MainLoop()
这是 Test.py 中的弹出代码:
import wx
import os
import sys
import shutil
class LeftPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
label = "Buttons"
lbl = wx.StaticText(self, label=label)
self.attach_btn = wx.Button(self, -1, "Select",size = (150,25))
self.Bind(wx.EVT_BUTTON, self.OnOpen, self.attach_btn)
self.remove_btn = wx.Button(self, -1, "Remove")
self.Bind(wx.EVT_BUTTON, self.OnRemove, self.remove_btn)
v_sizer = wx.BoxSizer(wx.VERTICAL)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(v_sizer, 0, wx.ALL, 5)
sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.attach_btn,0, wx.ALL |wx.EXPAND , 3)
sizer.Add(self.remove_btn,0, wx.ALL |wx.EXPAND, 3)
self.SetSizer(sizer)
def OnOpen(self, event):
print('do something')
def OnRemove(self,event):
print('do something else')
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
v_sizer = wx.BoxSizer(wx.VERTICAL)
left_panel = LeftPanel(self)
hsizer.Add(left_panel,1,wx.EXPAND)
self.done_btn = wx.Button(self, -1, "DONE")
self.Bind(wx.EVT_BUTTON, self.OnDone, self.done_btn)
v_sizer.Add(hsizer, 1, wx.EXPAND)
v_sizer.Add(self.done_btn,0, wx.ALL |wx.CENTER, 3)
self.SetSizer(v_sizer)
def OnDone(self,event):
self.Close()
self.Parent.Destroy()
class NewFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Costing Selection")
panel = MainPanel(self)
self.SetWindowStyle(wx.STAY_ON_TOP)
self.Show()
唯一真正的区别是 OnDone
函数,由于代码的编写方式,它需要 Close
self 和 Destroy
parent。否则我们会销毁 MainPanel
但将其父级 NewFrame
留在原地。
我有一个使用 wxpython 的 GUI。我的主程序有几个选项卡。在其中一个选项卡中,我添加了一个按钮,单击此按钮时,应该会在发生某些代码的地方弹出一个新的 window,一旦用户完成并按下 DONE 按钮,它将 return到主程序并继续主代码。我希望用户能够使用弹出窗口 window 将文件从一个目录复制到另一个目录。一旦他复制了所有必要的文件,计算就会继续。
我的弹出程序独立运行良好,但是我不知道如何从主程序中调用它...我在主程序中导入了 test.py 文件,但是如何我发起?我尝试使用 test.pop_up() 但后来我无法再关闭弹出框,只收到一条错误消息(未定义 frame2)。这是我想从中调用的 test.py 代码主框架,因此它显示为弹出窗口 window。
import wx
import os
import sys
import shutil
class LeftPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
label = "Buttons"
lbl = wx.StaticText(self, label=label)
self.attach_btn = wx.Button(self, -1, "Select",size = (150,25))
self.Bind(wx.EVT_BUTTON, self.OnOpen, self.attach_btn)
self.remove_btn = wx.Button(self, -1, "Remove")
self.Bind(wx.EVT_BUTTON, self.OnRemove, self.remove_btn)
v_sizer = wx.BoxSizer(wx.VERTICAL)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(v_sizer, 0, wx.ALL, 5)
sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.attach_btn,0, wx.ALL |wx.EXPAND , 3)
sizer.Add(self.remove_btn,0, wx.ALL |wx.EXPAND, 3)
self.SetSizer(sizer)
def OnOpen(self, event):
print('do something')
def OnRemove(self,event):
print('do something else')
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
v_sizer = wx.BoxSizer(wx.VERTICAL)
left_panel = LeftPanel(self)
hsizer.Add(left_panel,1,wx.EXPAND)
self.done_btn = wx.Button(self, -1, "DONE")
self.Bind(wx.EVT_BUTTON, self.OnDone, self.done_btn)
v_sizer.Add(hsizer, 1, wx.EXPAND)
v_sizer.Add(self.done_btn,0, wx.ALL |wx.CENTER, 3)
self.SetSizer(v_sizer)
def OnDone(self,event):
self.Destroy()
wx.CallAfter(frame2.Destroy)
class NewFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Costing Selection")
panel = MainPanel(self)
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame2 = NewFrame()
frame2.SetWindowStyle(wx.STAY_ON_TOP)
app.MainLoop()
def pop_up():
app = wx.App(False)
frame2 = NewFrame()
frame2.SetWindowStyle(wx.STAY_ON_TOP)
app.MainLoop()
我不确定我程序的底部。我需要 def pop_up() 吗?我不知道我还能如何调用该函数...
这是一个简单的例子。
这是您的主要调用程序,它调用弹出窗口
import wx
from Test import NewFrame
class TopFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Test")
self.panel = wx.Panel(self)
self.call_button = wx.Button(self.panel, label="Call Popup")
self.call_button.Bind(wx.EVT_BUTTON, self.popup)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.panel)
self.SetSizer(sizer)
self.Show()
def popup(self, event):
pop = NewFrame()
if __name__ == "__main__":
app = wx.App()
frame2 = TopFrame()
app.MainLoop()
这是 Test.py 中的弹出代码:
import wx
import os
import sys
import shutil
class LeftPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
label = "Buttons"
lbl = wx.StaticText(self, label=label)
self.attach_btn = wx.Button(self, -1, "Select",size = (150,25))
self.Bind(wx.EVT_BUTTON, self.OnOpen, self.attach_btn)
self.remove_btn = wx.Button(self, -1, "Remove")
self.Bind(wx.EVT_BUTTON, self.OnRemove, self.remove_btn)
v_sizer = wx.BoxSizer(wx.VERTICAL)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(v_sizer, 0, wx.ALL, 5)
sizer.Add(lbl, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(self.attach_btn,0, wx.ALL |wx.EXPAND , 3)
sizer.Add(self.remove_btn,0, wx.ALL |wx.EXPAND, 3)
self.SetSizer(sizer)
def OnOpen(self, event):
print('do something')
def OnRemove(self,event):
print('do something else')
class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
hsizer = wx.BoxSizer(wx.HORIZONTAL)
v_sizer = wx.BoxSizer(wx.VERTICAL)
left_panel = LeftPanel(self)
hsizer.Add(left_panel,1,wx.EXPAND)
self.done_btn = wx.Button(self, -1, "DONE")
self.Bind(wx.EVT_BUTTON, self.OnDone, self.done_btn)
v_sizer.Add(hsizer, 1, wx.EXPAND)
v_sizer.Add(self.done_btn,0, wx.ALL |wx.CENTER, 3)
self.SetSizer(v_sizer)
def OnDone(self,event):
self.Close()
self.Parent.Destroy()
class NewFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Costing Selection")
panel = MainPanel(self)
self.SetWindowStyle(wx.STAY_ON_TOP)
self.Show()
唯一真正的区别是 OnDone
函数,由于代码的编写方式,它需要 Close
self 和 Destroy
parent。否则我们会销毁 MainPanel
但将其父级 NewFrame
留在原地。