Python GUI
个人感觉,如果是商业项目,还是原生系统支持的方案较好。
macOS用swift;成熟的应用多得是,而且官方支持也多。
Windows用dotnet wpf、duilib、qt等等;win下的gui,哎,算了。
Linux上常见的gui也就gtk、qt、wxwidgets,gtk和qt分别被gnome和kde支持,写Linux应用没啥问题,考虑跨平台的话gtk和wxwidgets虽说是支持跨平台,但是win和macos平台上成熟的应用日常很难见到。对比qt与gtk,都支持Python开发,这一点很好,c和c++真的是门槛高。个人更倾向于qt for python,起码支持很多。gtk如果只是用默认的控件的话也没问题,但是涉及到自定义就麻烦了,没有第三方库可以直接用。
wxPython
官网 https://wxpython.org/
wxWidgets官网(原版c++) https://www.wxwidgets.org/
wxpythonWiki https://wiki.wxpython.org/FrontPage 内容比较全面
wxWidgets(原版c++) 论坛 https://forums.wxwidgets.org/index.php?sid=6384839ec4335470979d7ca1161c42e0
Hello World https://wxpython.org/pages/overview/#hello-world
Getting Started https://wiki.wxpython.org/Getting Started
http://thisis.yorven.site/blog/index.php/2017/09/16/wxpython-jiaocheng-er-kaishibianxie/
中文教程 https://wizardforcel.gitbooks.io/wxwidgets-book/content/0.html
macOS环境搭建(版本4.1)
pip安装即可,
然后创建文件:
# First things, first. Import the wxPython package.
import wx
# Next, create an application object.
app = wx.App()
# Then a frame.
frm = wx.Frame(None, title="Hello 这里是feipeng8848")
# Show it.
frm.Show()
# Start the event loop.
app.MainLoop()
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
pnl = wx.Panel(self)
button = wx.Button(pnl, label='Button', pos=(20, 20))
text = wx.CheckBox(pnl, label='CheckBox', pos=(20, 90))
combo = wx.ComboBox(pnl, pos=(120, 22), choices=['Python', 'Ruby'])
slider = wx.Slider(pnl, 5, 6, 1, 10, (120, 90), (110, -1))
pnl.Bind(wx.EVT_ENTER_WINDOW, self.OnWidgetEnter)
button.Bind(wx.EVT_ENTER_WINDOW, self.OnWidgetEnter)
text.Bind(wx.EVT_ENTER_WINDOW, self.OnWidgetEnter)
combo.Bind(wx.EVT_ENTER_WINDOW, self.OnWidgetEnter)
slider.Bind(wx.EVT_ENTER_WINDOW, self.OnWidgetEnter)
self.sb = self.CreateStatusBar()
self.SetSize((250, 230))
self.SetTitle('wx.Statusbar')
self.Centre()
self.Show(True)
def OnWidgetEnter(self, e):
name = e.GetEventObject().GetClassName()
self.sb.SetStatusText(name + ' widget')
e.Skip()
def main():
ex = wx.App()
Example(None)
ex.MainLoop()
if __name__ == '__main__':
main()
windows 环境
首先我尝试了pip安装 (如果下载速度太慢可能需要换源 https://www.cnblogs.com/feipeng8848/p/12809760.html)
安装成功了,但是无法在vscode或者pycharm中导入,提示找不到wx包。
后来在pycharm中
还用上面的代码 debug一下
声明式UI
wxwidgets是支持声明式UI的,在xml中定义UI元素,代码中加载xml文件。http://wxglade.sourceforge.net/
这里是一些设计工具
https://docs.wxwidgets.org/3.0/overview_xrc.html
https://github.com/wxFormBuilder/wxFormBuilder
https://github.com/wxFormBuilder/wxFormBuilder 这个还是更新非常及时的,最新的是代码提交也是最近的:
使用方法 https://wiki.wxpython.org/XRCTutorial
wxFormBulider创建一个UI
复制下面的xml内容到python工程目录下,新建个文件
这里我保存成ui.xrc
使用下面的代码
import wx
from wx import xrc
class MyApp(wx.App):
def OnInit(self):
self.res = xrc.XmlResource('ui.xrc')
self.init_frame()
return True
def init_frame(self):
self.frame = self.res.LoadFrame(None, 'mainFrame')
self.frame.Show()
if __name__ == '__main__':
app = MyApp(False)
app.MainLoop()
去掉标题栏
pygtk/pyobject
首先一点,pygobject目前为止是LGPLv2.1+协议,也就是说我们可以引用pygobject开发软件只要不修改pygobject的源代码就可以把我们的软件闭源并销售。
pyobject官网 https://pygobject.readthedocs.io/en/latest/
pygtk+3 官网 https://python-gtk-3-tutorial.readthedocs.io/en/latest/
https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html#simple-example
与pygtk不同,pygobject封装了GObject、gtk、GStreamer、WebKitGTK、GLib、GIO。而pygtk只封装了gtk,且pgtk只支持到python2。
我们熟悉的gnome-tweak-tool
就是用pygobject写的。好像也就这个比较出名了。
使用glade(UI ide)创建UI声明文件 https://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html
资料 https://zhuanlan.zhihu.com/p/52809594
环境搭建
https://pygobject.readthedocs.io/en/latest/getting_started.html
尝试了官方指导在Windows和macOS上都没有成功,后来查了下gtk在Windows上问题很多。
如果想用gtk,只在Linux上还是可以的,其他系统就不用考虑了。
qt for python
官网 https://www.qt.io/qt-for-python
文档 https://doc.qt.io/qtforpython/tutorials/index.html
多数应用是需要GPL协议的,也就是说需要开放源代码,LGPL太少了。