第一次接触到wxpython,在网上找到一个简单的界面显示代码,复制到spyder3编辑中进行运行出现错误,(“module 'wx' has no attributte 'App'”),但在python3.6的IDLE编辑器上运行没有错误。具体程序如下:
import wx
app = wx.App()
frame = wx.Frame(None,title="my GUI")
frame.Show(1)
app.MainLoop()
于是在网上找到一些解决方法:
1)wx.py 文件名与插件wx 重名了;【命名py脚本时,不要与python预留字,模块名等相同;删除该库的.pyc文件(因为py脚本每次运行时均会生成.pyc文件;在已经生成.pyc文件的情况下,若代码不更新,运行时依旧会走pyc,所以要删除.pyc文件),重新运行代码;或者找一个可以运行代码的环境,拷贝替换当前机器的.pyc文件即可
解决:
把wx.py 改成 editor.py 执行成功弹出一个文本框,如附件截图:
D:\ProgramFiles64\Anaconda36\Lib\site-packages\IPython\terminal\pt_inputhooks\wx.py文件修改为editor.py,再执行。】
2)有的说是版本问题;
我按方法1修改了之后,还是没有成功,后来我将spyder重启,并且所有设置恢复默认之后,再执行又没有错误,具体原因在哪里我还是没有搞清楚。
下面我们来实现简单界面设计:
最小的wxpython程序,叫它hello world程序吧。功能就是产生一个窗口,就像是我们VC中新建的一个单文档的MFC类似,不过没有菜单什么的,只有一个框架窗口。其实严格来说,wxpython不叫这个为窗口,而是“frame”。实现代码有如下几种:
一>import wx
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "Hello World")
frame.Show()
app.MainLoop()
二>import wx
app = wx.App()
frame = wx.Frame(None, -1, "Hello World")
frame.Show()
app.MainLoop()
三>import wx
class MyApp(wx.App):
def OnInit(self):
frame=wx.Frame(parent=None,title='Hello wxpython')
frame.Show()
return True
app=MyApp()
app.MainLoop()
【下面部分转载博主:http://blog.sina.com.cn/s/blog_4b5039210100eykc.html】
可以看到,frame上面什么都没有。但所谓麻雀虽小,五脏俱全,从这个最小的程序我们就能看出一个wxpython程序都包含哪些东西:
1 导入wxpython库,或者里面的方法( import wx)
2 创建一个应用类的子类(继承于wxpython中的App类,class MyApp(wx.App):)
3 定义应用子类初始化方法(OnInit())
4 创建应用类的实例
5 进入应用类的消息循环 MainLoop
class App(wx.App):
#!/usr/bin/env Python
“”” hello.py is a starting point for a wxpython program”””
import wx
class Frame(wx.Frame):
class App(wx.App):
if __name__=='__main__':
第二个类是继承于wx..App的App类。和第一个程序类似,只不过这里的frame换成了调用Frame,实例化得对象。
#!/usr/bin/env python
""" Hello,wxPython program."""
import wx
class Frame(wx.Frame):
class App(wx.App):
def main():
if __name__=='__main__':