wxpython: как я могу открыть новый кадр из основной программы при нажатии кнопки - PullRequest
0 голосов
/ 07 мая 2019

У меня есть графический интерфейс с использованием wxpython.Моя основная программа имеет несколько вкладок.в одной из этих вкладок я добавил кнопку, при нажатии этой кнопки должно появиться новое окно, где происходит какой-то код, и как только пользователь завершит работу и нажмет кнопку «Готово», он вернется в основную программу и продолжит выполнение.основной код.Я хочу, чтобы пользователь мог копировать файлы из одного каталога в другой, используя всплывающее окно.Как только он скопирует все необходимые файлы, расчет продолжится.

Моя всплывающая программа работает автономно, однако я не знаю, как ее вызвать из основной программы ... Я импортирую файл 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 ()?Я не знаю, как еще я могу вызвать функцию ...

1 Ответ

2 голосов
/ 07 мая 2019

Вот простой пример.
Это ваша основная программа вызова, которая вызывает всплывающее окно

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 родительский элемент. В противном случае мы уничтожим MainPanel, но оставим его родителя NewFrame на месте.

enter image description here

...