Я сейчас изучаю библиотеку wxPython самостоятельно. У меня появилась идея создать графический интерфейс с одним основным фреймом, который может открыть дочерний.
Я знаю, что могу сделать это, скомпилировав оба кадра в один и тот же код, но для моего проекта мне нужно разделить их.
Мне удалось управлять открытием дочернего фрейма и его закрытием, но, к сожалению, это создает новую проблему в моем родительском фрейме.
Вот мои коды:
wx_Practicing.py
import wx
import time
import wx_Practicing_child
import threading
import os
import sys
"""Class which defines my main frame."""
class MainWindow(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test", wx.DefaultPosition,
(1000,850), wx.DEFAULT_FRAME_STYLE, wx.FrameNameStr)
# Click counter
self.click = 0
# Init of the opening variable which is set to 1 when a child frame is opened
self.OpenButtonFlag = 0
# Init of the frame child invoked by the parent frame
self.child = wx_Practicing_child.MainWindow_child()
self.child.label = "child"
# Sizers
sizer_hori = wx.BoxSizer(wx.HORIZONTAL)
sizer_verti = wx.BoxSizer(wx.VERTICAL)
# Init of the panel
test_panel = PanelMainWindow(self)
test_panel.SetSizer(sizer_verti)
# Buttons declaration
# Button to quit the main frame
btn_quit = wx.Button(test_panel, label ="Quit")
btn_quit.Bind(wx.EVT_BUTTON, self.OnQuit)
sizer_verti.Add(btn_quit)
# Button counting number of time you trigger it
btn_counter = wx.Button(test_panel, label="Click counter")
sizer_verti.Add(btn_counter)
btn_counter.Bind(wx.EVT_LEFT_DOWN, self.OnCount)
# Button opening the child frame
btn_new_frame = wx.Button(test_panel, label = "Open new frame",
pos=(100,100))
btn_new_frame.Bind(wx.EVT_LEFT_DOWN, self.OnNewFrame)
self.Bind(wx.EVT_CLOSE, self.OnClose)
# Frame displaying
self.Show()
def OnClose(self, event):
self.Destroy(True)
# Method used to close the parent frame
def OnQuit(self, event):
self.Destroy()
print("closed")
# Method used to count number of click
def OnCount(self, event):
self.click +=1
print(self.click)
# Method calling wx_Practicing_child.py to open a child frame
def OnNewFrame(self, event):
if self.child.OpenButtonFlag == 0 :
self.child = wx_Practicing_child.MainWindow_child()
self.child.label = "child"
print("Flag before",self.child.OpenButtonFlag)
self.child.Show()
print("new Frame opened")
self.child.OpenButtonFlag = 1
else :
print("Frame already launched, close the previous one and retry")
print("Flag after", self.child.OpenButtonFlag)
"""Class of the panel"""
class PanelMainWindow(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
test = wx.App(False)
frame = MainWindow()
test.MainLoop()
и wx_Practicing_child.py
import wx
import time
"""Classe définissant une frame (i.e la zone globale parente). Elle permet
de faire exister le panel et ses attributs."""
class MainWindow_child(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Test", wx.DefaultPosition,
(1000,850), wx.DEFAULT_FRAME_STYLE, wx.FrameNameStr)
self.OpenButtonFlag = 0
self.label = "Child"
# Sizers
sizer_hori = wx.BoxSizer(wx.HORIZONTAL)
sizer_verti = wx.BoxSizer(wx.VERTICAL)
# Init of the panel
test_panel_child = PanelMainWindow_child(self)
test_panel_child.SetSizer(sizer_verti)
# Buttons declaration
# Button to quit the frame
btn_quit = wx.Button(test_panel_child, label ="Quit")
btn_quit.Bind(wx.EVT_LEFT_DOWN, self.OnQuit)
sizer_verti.Add(btn_quit)
# Method used to quit the frame
def OnQuit(self, event):
self.OpenButtonFlag = 0
self.Destroy()
print("child print", self.OpenButtonFlag)
"""Class which defines a panel for the child frame"""
class PanelMainWindow_child(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
Так что моя главная проблема в том, что когда я нажимаю кнопку «Выход» или поле «x» в родительском фрейме (wx_practicing.py), фрейм закрывается, но программа не закрывается. После нескольких попыток я заметил, что это вызвано объявлением self.child в MainWindow.
Однако мне нужно это объявление, чтобы MainWindow открывал MainWindow_child.
Я пытался добавить self.child.Close () в мой метод Onquit () в моем классе MainWindow, но это не удалось.
После некоторых исследований я понял, что, возможно, могу использовать обработчик CloseEvent, но я не совсем понял его назначение и принципы его работы.
Надеюсь, я был достаточно ясен.
ПРИМЕЧАНИЕ. Обе программы находятся в одной папке.