Как правильно связать кнопку, чтобы открыть другой файл py? - PullRequest
0 голосов
/ 26 мая 2019

У меня есть большие сомнения, потому что мой сценарий не работает так, как должно быть.Итак, у меня есть простой основной файл с кнопкой, которая открывает пустую сетку (коды ниже).Проблема с этим кодом заключается в том, что он запускает reportWindow при первом запуске, но если я закрываю отчет и пытаюсь открыть его снова, я получаю сообщение об ошибке: NameError: имя 'TestFrame' не определено

IМы также удалили if __name__ == '__main__' из последних строк reportWindow.py, потому что скрипт не работал с ним.Я попробовал if __name__ == 'main', так как он импортирован из main.py, но он тоже не сработал.

Пожалуйста, кто-нибудь может показать мне, как это должно быть сделано правильно?

Спасибо

main.py

import wx

class Test(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        button = wx.Button(panel, label = "Exit", pos=(80, 80), size = (120,30))
        self.Bind(wx.EVT_BUTTON, self.closebutton, button)

    def closebutton(self,event):
        from reportWindow import SimpleGrid
        SimpleGrid(TestFrame, -1)

if __name__ == '__main__':
    app = wx.App()  
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

reportWindow.py

import wx
import wx.grid as gridlib

class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)

        #[...Some code...]


class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, 0, "Title", size=(1400,800))
        self.grid = SimpleGrid(self, log)

        #[...Some code...]


#if __name__ == '__main__':
import sys
from wx.lib.mixins.inspection import InspectableApp
app = InspectableApp(False)
frame = TestFrame(None, sys.stdout)
frame.Show(True)
#import wx.lib.inspection
#wx.lib.inspection.InspectionTool().Show()
app.MainLoop()

1 Ответ

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

У вашего кода есть несколько проблем.

1) NameError происходит, потому что вы не импортируете TestFrame из reportWindow.

2) Без if __name__ == "__main__" в reportWindow.py ваша программа создаст еще один wx.App и запустит еще один MainLoop, который заблокирует первый цикл от получения событий и т. Д. Вы должны создать только 1 App/MainLoop.Он также создаст TestFrame при первом импорте reportWindow.

3) Похоже, вы хотите, чтобы SimpleGrid был потомком TestFrame, но затем вы пытаетесь создать его самостоятельно в closebutton.

4) При создании SimpleGrid вместо экземпляра класса TestFrame передается класс TestFrame.

Вот модифицированный код

# main.py
import wx, sys


class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        button = wx.Button(panel, label="Exit", pos=(80, 80), size=(120, 30))
        self.Bind(wx.EVT_BUTTON, self.closebutton, button)

    def closebutton(self, event):
        from reportWindow import TestFrame

        frame = TestFrame(self, sys.stdout)
        frame.Show()


if __name__ == '__main__':
    app = wx.App()
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

# reportWindow.py
import wx
import wx.grid as gridlib


class SimpleGrid(gridlib.Grid):  ##, mixins.GridAutoEditMixin):
    def __init__(self, parent, log):
        gridlib.Grid.__init__(self, parent, -1)

        # [...Some code...]


class TestFrame(wx.Frame):
    def __init__(self, parent, log):
        wx.Frame.__init__(self, parent, 0, "Title", size=(1400, 800))
        self.grid = SimpleGrid(self, log)

        # [...Some code...]


if __name__ == '__main__':
    import sys
    from wx.lib.mixins.inspection import InspectableApp

    app = InspectableApp(False)
    frame = TestFrame(None, sys.stdout)
    frame.Show(True)
    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...