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 · 8991 次点击
    这是一个创建于 1577 天前的主题,其中的信息可能已经有所发展或是发生改变。

    听到不少的评论说 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  
       1 天前 via Android
    @sudoy #43 楼主,你 kivy 是怎么安装的,在 win 下吗?据说只能在 linux 下安装,可是我跑 buildozer Android debug 搞了一天都没搞好,据说第一次安装要 1 个小时左右。
    sudoy
        48
    sudoy  
    OP
       22 小时 33 分钟前
    @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  
       22 小时 31 分钟前 via Android
    @sudoy #48 我是要生成 apk ,要用 buildozer 构建,你试过没
    sudoy
        50
    sudoy  
    OP
       22 小时 26 分钟前
    @Windyzhou 这个没有试过,安卓开发我没学过,这个 kivy 说是可以跨平台,但是我也只在 Windows 上运行过几个 hello world 项目
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:46 · PVG 14:46 · LAX 22:46 · JFK 01:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.