如何从单独的文件中引用 wxWidget?

问题描述 投票:0回答:1

在一个 Python 文件中,我有一个名为 'MyFrame' 的 wx.Frame 类,它只有一个名为 'label_1' 的 wx.StaticText 标签。 该文件包含一个运行第二个文件的子进程(无关)。

在第二个 Python 文件中,我有一个导入 'MyFrame' 的类,并包含一个名为 'ChangeLabel()' 的函数,它应该 change 'label_1' 以显示不同的文本。

但是,当我运行程序时,出现以下错误:

AttributeError: type object 'MyFrame' has no attribute 'label_1'

我相信这个问题与我如何导入 MyFrame 类有关。

下面是两个 python 文件的代码。

主文件:

import wx
import subprocess
import sys

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.SetTitle("frame")

        self.panel_1 = wx.Panel(self, wx.ID_ANY)

        sizer_1 = wx.BoxSizer(wx.VERTICAL)

        label_1 = wx.StaticText(self.panel_1, wx.ID_ANY, "This is my label")
        sizer_1.Add(label_1, 0, 0, 0)

        self.panel_1.SetSizer(sizer_1)
        
        ##Subprocess that runs "second.py"
        result = subprocess.run([sys.executable, "SecondFile.py", "arg"])

        self.Layout()
        # end wxGlade
# end of class MyFrame

class MyTestApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

# end of class MyTestApp

if __name__ == "__main__":
    test_app = MyTestApp(0)
    test_app.MainLoop()

第二个文件:

from MainFile import MyFrame

class SecondFile():
    def __init__(self, arg):
        self.arg = arg
    def ChangeLabel():
        ## Supposed to manipulate MyFrame's label
        MyFrame.label_1.SetLabel("New Label Text")

    ChangeLabel()
python inheritance wxpython wxwidgets wxglade
1个回答
0
投票

根据我的评论,我制作了这个解决方案。正如我们所说,我们不知道您要做什么,但这可行(您需要做一些工作才能使其成为一个明智的应用程序)

module_1.py

import wx
import subprocess
import sys

class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(None, *args, **kwargs)
        self.Title = 'Wx App'

        self.panel = MainPanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel)
        self.SetSizer(sizer)
        self.Center()
        self.Show()

        result = subprocess.run([sys.executable, "module_2.py", "arg"])
        self.check_label()

    def check_label(self):
        with open('label_text.txt', 'r') as f_label:
            label_text = f_label.read()
        self.panel.label_1.SetLabel(label_text)



class MainPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.label_1 = wx.StaticText(self, label='This is my label')
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.label_1)
        self.SetSizer(sizer)


if __name__ == '__main__':
    wx_app = wx.App()
    MainFrame()
    wx_app.MainLoop()

module_2.py

def ChangeLabel():
    with open('label_text.txt', 'w') as f_label:
        f_label.write('New Label Text')

ChangeLabel()
© www.soinside.com 2019 - 2024. All rights reserved.