在Python中类型为Thread的类中创建其他类的对象时出错

时间:2014-03-04 09:21:01

标签: python multithreading python-2.7 user-interface wxpython

等级:初学者

我在Windows 7 32位上使用python v2.7和wxPython v3.0。

我的应用:我有3节课。一个班级为gui(wx.Frame),其他班级为TestThread(Thread),第三班级为labels()

问题:我正在尝试在gui(wx.Frame)类中创建TestThread(Thread)类的对象,但是我收到的错误如下所示:

Traceback (most recent call last):
  File "C:\test\post.py", line 11, in <module>
    class TestThread(Thread):
  File "C:\test\post.py", line 12, in TestThread
    guiObj = gui()
NameError: name 'gui' is not defined

但是,如果我尝试从此createPanels() gui(wx.Frame)类调用TestThread(Thread)类的wx.CallAfter(gui().createPanels()),则会出现以下错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\test\post.py", line 24, in run
    wx.CallAfter(gui().createPanels())
TypeError: __init__() takes exactly 4 arguments (1 given)

我认为原因与__init__()的{​​{1}}有关 我不明白原因。

更新:我尝试在gui(wx.Frame)类中创建labels()类的对象,我得到的错误与上面第一种情况中显示的相同。这个TestThread(Thread)课有什么特别之处吗?

下面提供了完整的代码,可以downloaded here以避免出现身份问题:

TestThread(Thread)

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

第一期:

Python首次运行文件时执行

guiObj = gui(),这会导致两个问题:

  • Python在执行时不知道gui
  • TestThread的所有实例都具有相同的gui实例

要解决这两个问题,您必须将guiObj = gui()放在TestThread

的构造函数中

如果您只想修复第一个,请在声明gui之前声明TestThread

第二期:

使用gui()是错误的,因为gui的构造函数有三个参数(实际上是四个,但第一个是隐式的。你必须用三个参数调用它,就像你在最后一样做该计划:gui(parent=None, id=-1, title="Test")