zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python GUI

Python GUI
2023-09-11 14:18:38 时间

个人感觉,如果是商业项目,还是原生系统支持的方案较好。
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太少了。