为什么说 Python 不适合做带 UI 的程序? kivy 不是很强大吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sudoy
V2EX    Python

为什么说 Python 不适合做带 UI 的程序? kivy 不是很强大吗?

  •  
  •   sudoy 2020-08-31 10:14:51 +08:00 9574 次点击
    这是一个创建于 1872 天前的主题,其中的信息可能已经有所发展或是发生改变。

    听到不少的评论说 python 不适合做带 UI 的程序,可我用了 kivy 之后觉得很强大,桌面的程序界面都能实现。网页程序就更不用说了,有强大的 django 框架,如果做前后端分离还有 django restful 或者 flask 。是不是说 python 不适合做带 UI 的程序的,都没好好用过这些 UI 库?

    50 条回复    2024-12-24 16:19:47 +08:00
    laike9m
        1
    laike9m  
       2020-08-31 10:21:29 +08:00   1
    至少就桌面程序来说 Python 很合适。PyQt 那么成熟,还有 Kivy 、BeeWare ( https://beeware.org/) 这些能写一次代码在各端(包括移动端)执行的框架。当然你非要和 Java/Swift 比移动端那肯定没法比。

    网页是另一码事了,毕竟 Django 自带的模板功能还是不如各种 MVVM 框架强大,但对于简单的网页也够了
    KarPy
        2
    KarPy  
       2020-08-31 10:33:35 +08:00   2
    linux 和 mac 端不了解,但大多数的客户端 UI 程序,都是运行在 win 上的,win 上做客户端 UI 程序,py 和 c#比,没有一点点的优势啊,就生态来说,py 确实不适合做客户端 UI 。

    语言各有各的优势领域,不能指望 py 干一切啊。
    a719114136
        3
    a719114136  
       2020-08-31 10:33:55 +08:00   1
    因为有其他更好更方便的方案
    love
        4
    love  
       2020-08-31 10:46:45 +08:00   2
    因为现在写界面 html+js 才是王道
    LokiSharp
        5
    LokiSharp  
       2020-08-31 10:47:32 +08:00   1
    主要是 iOS 、macOS 避不开 Obj-C 、Swift,Windows 避不开 C++、C#,Android 避不开 Java 、Kotlin 。
    使用任何非平台第一语言,都没法直接利用平台专属特性,比如硬件加速之类的跨平台框架适配得不怎么样。
    sudoy
        6
    sudoy  
    OP
       2020-08-31 11:28:37 +08:00
    @love 有些领域还是桌面软件体验好,所以桌面软件还是很重要的
    sudoy
        7
    sudoy  
    OP
       2020-08-31 11:30:43 +08:00   1
    @KarPy 我就是指望 py 干一切 :) 因为别的语言学起来好难
    across
        8
    across  
       2020-08-31 11:32:08 +08:00   1
    做 UI 交互做到所见即所才算合格,有个完善的 UI 编辑器才叫好用
    有个 UI 库充其量就是能实现 UI 。
    CallMeReznov
        9
    CallMeReznov  
       2020-08-31 11:33:19 +08:00   1
    winform: 你说的对,你们说的都对。
    sudoy
        10
    sudoy  
    OP
       2020-08-31 11:34:50 +08:00
    @LokiSharp 确实,我用 kivy 的时候还得安装 Microsoft Visual C++ 编译器才行。目前倒是没有用到硬件加速这么底层的东西,所以感觉也还可以
    Leonard
        11
    Leonard  
       2020-08-31 11:37:29 +08:00   1
    你还不如指望 js 干一切
    sudoy
        12
    sudoy  
    OP
       2020-08-31 11:39:13 +08:00
    @across 你这个要求有点高 不过 qt designer 不是也能实现吗? qt 除了商业授权死贵死贵以外,别的都挺好
    sudoy
        13
    sudoy  
    OP
       2020-08-31 11:40:43 +08:00
    @Leonard 我到现在还是觉得 js 学起来比 python 难
    sixway
        14
    sixway  
       2020-08-31 12:01:43 +08:00
    @sudoy #13 python 的线程让人痛不欲生
    Trim21
        15
    Trim21  
       2020-08-31 12:04:55 +08:00 via Android
    感觉写个 server 再写套前端都比写这些原生 ui 库舒服…
    imn1
        16
    imn1  
       2020-08-31 12:54:26 +08:00
    pyqt5 我光做两个功能就写了一个多星期,当然也有我写得慢的原因
    1.免重启切换界面语言文字
    2.免重启切换颜色、暗亮模式
    这些 qt designer 搞不定

    人家说的是不适合,不是不能做
    zion03
        17
    zion03  
       2020-08-31 13:17:59 +08:00 via Android
    Windows 平台 UI 开发还是 WPF 最强大
    minami
        18
    minami  
       2020-08-31 13:21:43 +08:00
    python 打包发布恶心的一笔,pyqt 还有 license 问题
    LFee
        19
    LFee  
       2020-08-31 13:24:54 +08:00
    py 打包的问题挺多的吧?反正我遇到过,可能是我菜,不会解决?弄了一次之后就不敢打包了
    shintendo
        20
    shintendo  
       2020-08-31 13:29:16 +08:00
    django flask 也能算 UI 库吗
    SWALLOWW
        21
    SWALLOWW  
       2020-08-31 14:20:09 +08:00
    做 wpf 的在此,有活吗
    steptodream
        22
    steptodream  
       2020-08-31 14:28:18 +08:00
    @shintendo 你估计连人家说的啥都没读明白 就直接回复了
    aydd2004
        23
    aydd2004  
       2020-08-31 14:46:41 +08:00
    用 python 写 gui 就是找不自在

    不管什么平台
    u823tg
        24
    u823tg  
       2020-08-31 14:57:34 +08:00   1
    @sudoy #13 js 和 python 差不多啊。 别去理那些历史垃圾堆里面的东西从 es6 开始。
    zkliangliang
        25
    zkliangliang  
       2020-08-31 15:00:18 +08:00   1
    kivy 是不错的, 开发起来挺顺畅的,额....,就是打包嘛...
    -----"污中生友, 富婆无限"
    SergeGao
        26
    SergeGao  
       2020-08-31 15:02:24 +08:00
    django,flask 跟 UI 库有毛线关系...如果要跑在浏览器里的话你不用 html,js 用啥...
    supercaizehua
        27
    supercaizehua  
       2020-08-31 15:07:40 +08:00
    haha 我也喜欢 python 干一切,但很多时候你还是迫不得已去学习新的语言
    smallpython
        28
    smallpython  
       2020-08-31 15:46:00 +08:00
    python 适合写 GUI, 不过通常来说有平台专用的语言就没人选他了
    Mithril
        29
    Mithril  
       2020-08-31 15:50:34 +08:00   1
    能做一件事和能做好是有本质上的区别的。。。
    g00001
        30
    g00001  
       2020-08-31 16:09:17 +08:00
    桌面软件 Windows 一家独大,
    https://github.com/aardio/wubi-lex
    https://github.com/iuuniang/win2ray-2
    像这类桌面软件,分分钟出界面,生成的 EXE 几百 KB,不要任何运行库,Python 做不到,C#更不行,JS 同样搞不定。
    iptables
        31
    iptables  
       2020-08-31 16:20:19 +08:00
    PyQt5 是 GPL 的,PySide2 是 LGPL 的
    CallMeReznov
        32
    CallMeReznov  
       2020-08-31 16:20:35 +08:00
    @g00001 #30 aardio 是吊,不过这类东西感觉都是灰色时代常用反而现在正常开都用不到的
    jake361
        33
    jake361  
       2020-08-31 16:29:41 +08:00
    @laike9m Django 又不是 ui 框架... 只是一个模板而已。。
    tlday
        34
    tlday  
       2020-08-31 16:53:22 +08:00   1
    看到标题的第一反应是 GIL 导致高刷新 UI 的掉帧卡顿。

    想了想,应该还有不支持多线程与坑爹的异步 API,基本所有在做 UI 的东西都是支持多线程( UI 主线程)或者对于异步有第一优先级的支持的。这两点支持并不好的 python 应该只能靠其他语言的 adapter 来做 UI,肯定掣肘良多。

    至于你说 django 和 flask 能做 UI,本质上做 UI 的是前端"御三家",前端中的 UI 主线程实际上是由 html/css 间接控制的浏览器渲染引擎,加一个用来支持"动态特性"的 js (独立线程)。django 和 flask 在 UI 里面扮演的角色无非一个“给数据”。没有“渲染引擎”的场合,都是需要自己控制 UI 主线程的,UI 主线程中一般也要求不能做重量级操作,不然也会导致 UI 卡顿甚至卡死。
    shintendo
        35
    shintendo  
       2020-08-31 17:18:08 +08:00
    @steptodream
    “网页程序就更不用说了,有强大的 django 框架,如果做前后端分离还有 django restful 或者 flask 。是不是说 python 不适合做带 UI 的程序的,都没好好用过这些 UI 库”
    愿意听听你的理解
    chengxiao
        36
    chengxiao  
       2020-08-31 18:02:38 +08:00
    pyQt 写起来还是很舒服的,当然这依赖于 QT 的强大
    chenqh
        37
    chenqh  
       2020-08-31 18:13:17 +08:00   1
    为什么你们写界面都那么厉害,而我只能对着 pyqt 无能狂怒?想写的东西写不出来? 难道都会 C++?
    supermoonie
        38
    supermoonie  
       2020-08-31 18:40:39 +08:00 via iPhone
    可以尝试通过 pycef 加载本地页面
    secondwtq
        39
    secondwtq  
       2020-08-31 20:29:10 +08:00
    这个问题吧,有点像在茅台论坛里面问”为什么肯德基不好吃?百事可乐喝起来不是挺爽的吗?“
    我先把手头这个板烧鸡腿堡吃完再说 ...
    darknoll
        40
    darknoll  
       2020-09-01 10:17:52 +08:00   1
    因为 mvvm 的框架写界面更好,winform 那种真的太落后了。
    xuboying
        41
    xuboying  
       2020-09-01 12:10:51 +08:00
    嫌弃 gil 的试试 3.8 的 sharedmemory
    myCupOfTea
        42
    myCupOfTea  
       2020-09-01 15:52:12 +08:00
    ...我以为现在都是 electron 干一切|_|〃,就是文件大了点
    sudoy
        43
    sudoy  
    OP
       2020-09-01 16:07:44 +08:00
    @shintendo @steptodream 感谢回复,可能是我没有表达清楚,但也没有必要争议。Django 当然不是 UI 库,这点常识大家都知道。做后端渲染的网页程序 django 可以一步到位,做前端渲染(也就是前后端分离)的 django 也有 restful 可以提供 api 。前端那里肯定是前端三件套( html/css/js )这毫无疑问
    sudoy
        44
    sudoy  
    OP
       2020-09-01 16:09:52 +08:00
    @myCupOfTea electron 可以做到很漂亮,但是体验感觉还是没有调用本地 UI 库的好
    charlie21
        45
    charlie21  
       2020-09-01 20:28:31 +08:00
    这是一个话语权的问题,Windows 觉得 Windows 桌面软件的话语权在自己手里所以它推 WPF,你觉得你是 python 熟手你的话语权在自己手里 所以你干啥都用 python 。基本上结果就是如果自己搞可以按自己的知识储备来,如果是 ......

    金子就是用来埋没的。反正大家都有眼无珠这么多年也是过来了
    myCupOfTea
        46
    myCupOfTea  
       2020-09-02 09:43:17 +08:00
    @sudoy 但是开发效率差距太大了
    Windyzhou
        47
    Windyzhou  
       296 天前 via Android
    @sudoy #43 楼主,你 kivy 是怎么安装的,在 win 下吗?据说只能在 linux 下安装,可是我跑 buildozer Android debug 搞了一天都没搞好,据说第一次安装要 1 个小时左右。
    sudoy
        48
    sudoy  
    OP
       295 天前
    @Windyzhou 我好久没用 kivy 了,你这么一问,我刚才试了一下,两三分钟就装好了。环境如下:

    Windows 11, 64 位

    用到的命令如下:

    1. 新建一个文件夹

    2. 创建 python 虚拟环境:
    python -m venv kivy_venv

    3. 激活虚拟环境:
    kivy_venv\Scripts\activate

    4. 安装 kivy:

    python -m pip install "kivy[base]"

    5. 创建一个简单的 ui 文件, 命名为 app.py , 文件内容在最底下。

    6. 运行就出来 UI 界面了
    python app.py


    ```
    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.button import Button
    from kivy.uix.textinput import TextInput

    class CalculatorApp(App):
    def build(self):
    # Main layout
    layout = BoxLayout(orientation='vertical', padding=10, spacing=10)

    # Text input for display
    self.display = TextInput(
    multiline=False,
    readOnly=True,
    halign='right',
    font_size=32,
    size_hint_y=0.2
    )
    layout.add_widget(self.display)

    # Create buttons layout
    buttOns= [
    ['7', '8', '9', '/'],
    ['4', '5', '6', '*'],
    ['1', '2', '3', '-'],
    ['.', '0', 'C', '+']
    ]

    # Add button grid
    for row in buttons:
    h_layout = BoxLayout()
    for label in row:
    button = Button(
    text=label,
    pos_hint={'center_x': 0.5, 'center_y': 0.5}
    )
    button.bind(on_press=self.on_button_press)
    h_layout.add_widget(button)
    layout.add_widget(h_layout)

    # Add equals button
    equals_button = Button(
    text='=',
    size_hint_y=0.2,
    background_color=[1, 0, 0, 1] # Red color
    )
    equals_button.bind(on_press=self.on_solution)
    layout.add_widget(equals_button)

    return layout

    def on_button_press(self, instance):
    current = self.display.text
    button_text = instance.text

    if button_text == 'C':
    # Clear the display
    self.display.text = ''
    else:
    # Add the button text to display
    self.display.text = current + button_text

    def on_solution(self, instance):
    try:
    # Evaluate the expression
    self.display.text = str(eval(self.display.text))
    except:
    self.display.text = 'Error'

    if __name__ == '__main__':
    CalculatorApp().run()
    ```
    Windyzhou
        49
    Windyzhou  
       295 天前 via Android
    @sudoy #48 我是要生成 apk ,要用 buildozer 构建,你试过没
    sudoy
        50
    sudoy  
    OP
       295 天前
    @Windyzhou 这个没有试过,安卓开发我没学过,这个 kivy 说是可以跨平台,但是我也只在 Windows 上运行过几个 hello world 项目
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4553 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 04:03 PVG 12:03 LAX 21:03 JFK 00:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86