【问题标题】:wxpython: How can I open a new frame from the main program when pushing a buttonwxpython:按下按钮时如何从主程序打开一个新框架
【发布时间】:2019-09-25 04:40:10
【问题描述】:

我有一个使用 wxpython 的 GUI。我的主程序有几个选项卡。在其中一个选项卡中,我添加了一个按钮,当单击此按钮时,应该会弹出一个新窗口,其中发生了一些代码,一旦用户完成并按下 DONE 按钮,它将返回主程序并继续主要代码。我希望用户能够使用弹出窗口将文件从一个目录复制到另一个目录。一旦他复制了所有必要的文件,计算将继续。

我的弹出程序可以独立运行,但是我不知道如何从主程序中调用它...我在主程序中导入了 test.py 文件,但我该如何启动?我尝试使用 test.pop_up() 但后来我无法再关闭弹出框,而只会收到一条错误消息(未定义 frame2)。这是我想从主框架调用的 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.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() 吗?我不知道我还能怎么调用这个函数......

【问题讨论】:

    标签: popup wxpython call frame


    【解决方案1】:

    这是一个简单的例子。
    这是您的主调用程序,它调用弹出窗口

    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

    【讨论】:

    • 非常感谢 Rolf,这对我帮助很大,我现在能够以我想要的方式完成我的程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2020-09-10
    相关资源
    最近更新 更多