Как я могу выполнить сценарий дочернего Python, нажав на кнопку родительского сценария? - PullRequest
0 голосов
/ 14 июня 2019

В настоящее время я тренирую ООП для GUI. Я использую библиотеку wxPython для создания своих окон и их настройки.

Сейчас я пытаюсь запустить скрипт на python, нажав кнопку из другого скрипта.

Для этого у меня есть 2 программы, wx_Practicing.py и wx_Practicing_child.py, которые находятся в одной папке.

wx_Practicing.py

import wx
import time
import wx_Practicing_child
import threading
import os
import sys

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 and flag variable for the new frame opened
    self.click = 0
    self.OpenButtonFlag = 0

    # Sizer to definit the position of elements
    sizer_hori = wx.BoxSizer(wx.HORIZONTAL)
    sizer_verti = wx.BoxSizer(wx.VERTICAL)

    # Panel
    test_panel = PanelMainWindow(self)
    test_panel.SetSizer(sizer_verti)

    # Button to close the main frame and end the program
    btn_quit = wx.Button(test_panel, label ="Quit")
    btn_quit.Bind(wx.EVT_BUTTON, self.OnQuit)
    sizer_verti.Add(btn_quit)

    # Button which displays the number of click done on it since the
    # frame is opened
    btn_counter = wx.Button(test_panel, label="Click counter")
    sizer_verti.Add(btn_counter)
    btn_counter.Bind(wx.EVT_LEFT_DOWN, self.OnCount)

    # Button which open the child frame from wx_Practicing_child.py
    btn_new_frame = wx.Button(test_panel, label = "Open new frame")
    sizer_verti.Add(btn_new_frame)
    btn_new_frame.Bind(wx.EVT_LEFT_DOWN, self.OnNewFrame)

    self.Show()

# Method to quit the frame and close it
def OnQuit(self, event):
    self.Close()

#Method to count clicks
def OnCount(self, event):
    self.click +=1
    print(self.click)

# MEthod which open the child frame
def OnNewFrame(self, event):
    if self.OpenButtonFlag == 0 :
        print('aaaaaaaa')
        os.system('wx_Practicing_child.py')
        self.Show()
        print("New frame opened")
        self.OpenButtonFlag = 1
    else :
        print("Frame already launched, close it before opening a new one")

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
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

    # Sizer
    sizer_hori = wx.BoxSizer(wx.HORIZONTAL)
    sizer_verti = wx.BoxSizer(wx.VERTICAL)

    # Panel
    test_panel_child = PanelMainWindow_child(self)
    test_panel_child.SetSizer(sizer_verti)

    # Button to quit the child frame
    btn_quit = wx.Button(test_panel_child, label ="Quit")
    btn_quit.Bind(wx.EVT_BUTTON, self.OnQuit)
    sizer_verti.Add(btn_quit)

    self.Show()

# Method used to close the child frame
def OnQuit(self, event):
    self.OpenButtonFlag = 0
    self.Close()

class PanelMainWindow_child(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

Так что, в принципе, функционирование простое. Я запускаю wx_Practicing.py, чтобы открыть родительское окно, затем нажимаю кнопку «Открыть новый кадр» и появляется дочерний кадр из wx_Practicing_child.py. Если я снова нажму кнопку, она ничего не сделает, пока не закрою предыдущее дочернее окно.

Но когда я пытаюсь это сделать, buttonFlag устанавливается в 1, поэтому он входит в цикл, но дочерний кадр не появляется.

Так что я хотел бы знать, как я могу заставить это работать. У меня сейчас нет выбора.

Спасибо.

1 Ответ

1 голос
/ 14 июня 2019

Добро пожаловать в StackOverflow.

Проблема в том, что вы создаете дочерний фрейм неправильно.Вам нужно только изменить строку:

os.system('wx_Practicing_child.py')

для:

child = wx_Practicing_child.MainWindow_child()
...