【问题标题】:Python class inheritance with wx.framePython 类继承与 wx.frame
【发布时间】:2017-11-01 10:10:28
【问题描述】:

我正在使用python2.7 + wxpython来显示一些图表数据。

我有两个类,一个(wx 类)用于管理 wx.frame,另一个(文本解码类)用于文件上下文中的解析器。我可以在 wx 类中使用 self.* 来控制 wx.frame(eg: self.SetMenuBar, self.SetTitle),我可以将这个“self”传递给另一个类来控制同一个 wx.frame 吗?

喜欢跟随简短的代码,

class CanvasFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, size=(550, 350))
        self.SetBackgroundColour(wxc.NamedColour("WHITE"))
        ....
        normal_test_mode_decode(filename, directory)
        ....

class normal_test_mode_decode(CanvasFrame):
    def __init(self, csv_fname, csv_dir):
        ....
        self.SetTitle(os.path.join(csv_dir, csv_fname)) #Error here

class MyApp(wx.App):
    def OnInit(self):
        frame = CanvasFrame(None, "wxPython mathtext demo app")
        ....

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()

如果我直接在另一个类中使用 self.SetTitle,这是错误消息。

Traceback (most recent call last):
  File "D:\normal_test_mode_parser\normal_test_mode_parser.py", line 45, in OnOpen
    self.decode = normal_test_mode_decode(filename, directory)
  File "D:\normal_test_mode_parser\normal_test_mode_parser.py", line 64, in __init__
    self.SetTitle(os.path.join(csv_dir, csv_fname))
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_windows.py", line 455, in SetTitle
    return _windows_.TopLevelWindow_SetTitle(*args, **kwargs)
TypeError: in method 'TopLevelWindow_SetTitle', expected argument 1 of type 'wxTopLevelWindow *'

我想解决这个问题,因为我的计划是 wxpython 的一个类(CanvasFrame)来管理 GUI 功能,另一个类(normal_test_mode_decode)处理数据分析功能。

谢谢!

运行此代码时,选择文件 -> 打开任何文件,然后您会看到错误。

【问题讨论】:

  • 请: 1. 在您的问题中发布代码(而不是链接)。 2. 在您的问题中作为文本发布错误消息等(而不是作为链接)。
  • 比尔,谢谢。我修改了我的问题,但我没有足够的嵌入图片的声誉。
  • 我明白了。您需要做的是了解如何从 paste.ofcode.org 或您的终端屏幕等来源复制和粘贴文本到 SO 问题中。由于您使用的是 Windows,您可以右键单击屏幕左上角标有 c:\python27\python.exe — 在 python 图标上,以获取可让您剪切和粘贴的选项菜单。您可以通过突出显示代码然后使用复制和粘贴来复制源代码,或多或少就像在任何窗口中一样。
  • 谢谢,我已经修改了我的内容。如果有任何问题,请告诉我。
  • 现在的一个问题是没有人可以运行您发布的代码,因为它缺少很多行。我也注意到,尽管您使用的是 Py2.7,但 paste.ofcode.org 上的代码似乎是 Py3。您能否发布演示您需要帮助的错误的最小代码。

标签: python-2.7 inheritance wxpython


【解决方案1】:

我对您的代码做了一些小改动,以简化代码或消除错误。

  • 我用super() 替换了涉及super 的更复杂的表达式,因为您使用的是Py3,这样就不太可能发生错误。
  • super().__init__(parent, id=-1, title='something something', size=(550, 350)) 中我添加了文字标题。这可能不是您最终想要的,但它可以继续进行开发工作。
  • 我将self.content = 附近的行更改为self.content = self.fp.readline().strip().split(','),因为line 未定义。同样,您可能希望对此给予更多关注。

【讨论】:

  • 谢谢,我想在标题上显示路径,但不是。当您在 normal_test_mode_decode(CanvasFrame) 中调用 super().__init__(parent, -1) 而不是在 CanvasFrame 中创建的 wx.frame 时,它​​会重新创建 wx.frame 吗?
  • __init__ 不会重新创建对象,因为在调用 __init__ 时,该对象已经存在。 __init__ 只是在对象内设置或创建属性。做你想做的事,把self.SetTitle(filename)放在self.decode = normal_test_mode_decode(self, filename, directory)之后。 (您可能也想更改“某事某事”。
  • 请勿在您的帖子中使用 paste.ofcode.org,因为链接会在一周后过期。而是直接将代码添加到问题中
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多