听到不少的评论说 python 不适合做带 UI 的程序,可我用了 kivy 之后觉得很强大,桌面的程序界面都能实现。网页程序就更不用说了,有强大的 django 框架,如果做前后端分离还有 django restful 或者 flask 。是不是说 python 不适合做带 UI 的程序的,都没好好用过这些 UI 库?
1
laike9m 2020-08-31 10:21:29 +08:00 1
至少就桌面程序来说 Python 很合适。PyQt 那么成熟,还有 Kivy 、BeeWare ( https://beeware.org/) 这些能写一次代码在各端(包括移动端)执行的框架。当然你非要和 Java/Swift 比移动端那肯定没法比。
网页是另一码事了,毕竟 Django 自带的模板功能还是不如各种 MVVM 框架强大,但对于简单的网页也够了 |
2
KarPy 2020-08-31 10:33:35 +08:00 2
linux 和 mac 端不了解,但大多数的客户端 UI 程序,都是运行在 win 上的,win 上做客户端 UI 程序,py 和 c#比,没有一点点的优势啊,就生态来说,py 确实不适合做客户端 UI 。
语言各有各的优势领域,不能指望 py 干一切啊。 |
3
a719114136 2020-08-31 10:33:55 +08:00 1
因为有其他更好更方便的方案
|
4
love 2020-08-31 10:46:45 +08:00 2
因为现在写界面 html+js 才是王道
|
5
LokiSharp 2020-08-31 10:47:32 +08:00 1
主要是 iOS 、macOS 避不开 Obj-C 、Swift,Windows 避不开 C++、C#,Android 避不开 Java 、Kotlin 。
使用任何非平台第一语言,都没法直接利用平台专属特性,比如硬件加速之类的跨平台框架适配得不怎么样。 |
8
across 2020-08-31 11:32:08 +08:00 1
做 UI 交互做到所见即所才算合格,有个完善的 UI 编辑器才叫好用····
有个 UI 库充其量就是能实现 UI 。 |
9
CallMeReznov 2020-08-31 11:33:19 +08:00 1
winform: 你说的对,你们说的都对。
|
10
sudoy OP @LokiSharp 确实,我用 kivy 的时候还得安装 Microsoft Visual C++ 编译器才行。目前倒是没有用到硬件加速这么底层的东西,所以感觉也还可以
|
11
Leonard 2020-08-31 11:37:29 +08:00 1
你还不如指望 js 干一切
|
12
sudoy OP @across 你这个要求有点高😁 不过 qt designer 不是也能实现吗? qt 除了商业授权死贵死贵以外,别的都挺好
|
15
Trim21 2020-08-31 12:04:55 +08:00 via Android
感觉写个 server 再写套前端都比写这些原生 ui 库舒服…
|
16
imn1 2020-08-31 12:54:26 +08:00
pyqt5 我光做两个功能就写了一个多星期,当然也有我写得慢的原因
1.免重启切换界面语言文字 2.免重启切换颜色、暗亮模式 这些 qt designer 搞不定 人家说的是不适合,不是不能做 |
17
zion03 2020-08-31 13:17:59 +08:00 via Android
Windows 平台 UI 开发还是 WPF 最强大 🐶
|
18
minami 2020-08-31 13:21:43 +08:00
python 打包发布恶心的一笔,pyqt 还有 license 问题
|
19
LFee 2020-08-31 13:24:54 +08:00
py 打包的问题挺多的吧?反正我遇到过,可能是我菜,不会解决?弄了一次之后就不敢打包了
|
20
shintendo 2020-08-31 13:29:16 +08:00
django flask 也能算 UI 库吗
|
21
SWALLOWW 2020-08-31 14:20:09 +08:00
做 wpf 的在此,有活吗
|
22
steptodream 2020-08-31 14:28:18 +08:00
@shintendo 你估计连人家说的啥都没读明白 就直接回复了
|
23
aydd2004 2020-08-31 14:46:41 +08:00
用 python 写 gui 就是找不自在
不管什么平台 |
25
zkliangliang 2020-08-31 15:00:18 +08:00 1
kivy 是不错的, 开发起来挺顺畅的,额....,就是打包嘛...
-----"污中生友, 富婆无限" |
26
SergeGao 2020-08-31 15:02:24 +08:00
django,flask 跟 UI 库有毛线关系...如果要跑在浏览器里的话你不用 html,js 用啥...
|
27
supercaizehua 2020-08-31 15:07:40 +08:00
haha 我也喜欢 python 干一切,但很多时候你还是迫不得已去学习新的语言
|
28
smallpython 2020-08-31 15:46:00 +08:00
python 适合写 GUI, 不过通常来说有平台专用的语言就没人选他了
|
29
Mithril 2020-08-31 15:50:34 +08:00 1
能做一件事和能做好是有本质上的区别的。。。
|
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 同样搞不定。 |
31
iptables 2020-08-31 16:20:19 +08:00
PyQt5 是 GPL 的,PySide2 是 LGPL 的
|
32
CallMeReznov 2020-08-31 16:20:35 +08:00
@g00001 #30 aardio 是吊,不过这类东西感觉都是灰色时代常用反而现在正常开发都用不到的
|
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 卡顿甚至卡死。 |
35
shintendo 2020-08-31 17:18:08 +08:00
@steptodream
“网页程序就更不用说了,有强大的 django 框架,如果做前后端分离还有 django restful 或者 flask 。是不是说 python 不适合做带 UI 的程序的,都没好好用过这些 UI 库” 愿意听听你的理解 |
36
chengxiao 2020-08-31 18:02:38 +08:00
pyQt 写起来还是很舒服的,当然这依赖于 QT 的强大
|
37
chenqh 2020-08-31 18:13:17 +08:00 1
为什么你们写界面都那么厉害,而我只能对着 pyqt 无能狂怒?想写的东西写不出来? 难道都会 C++?
|
38
supermoonie 2020-08-31 18:40:39 +08:00 via iPhone
可以尝试通过 pycef 加载本地页面
|
39
secondwtq 2020-08-31 20:29:10 +08:00
这个问题吧,有点像在茅台论坛里面问”为什么肯德基不好吃?百事可乐喝起来不是挺爽的吗?“
我先把手头这个板烧鸡腿堡吃完再说 ... |
40
darknoll 2020-09-01 10:17:52 +08:00 1
因为 mvvm 的框架写界面更好,winform 那种真的太落后了。
|
41
xuboying 2020-09-01 12:10:51 +08:00
嫌弃 gil 的试试 3.8 的 sharedmemory
|
42
myCupOfTea 2020-09-01 15:52:12 +08:00
...我以为现在都是 electron 干一切ヾ|≧_≦|〃,就是文件大了点
|
43
sudoy OP @shintendo @steptodream 感谢回复,可能是我没有表达清楚,但也没有必要争议。Django 当然不是 UI 库,这点常识大家都知道。做后端渲染的网页程序 django 可以一步到位,做前端渲染(也就是前后端分离)的 django 也有 restful 可以提供 api 。前端那里肯定是前端三件套( html/css/js )这毫无疑问
|
44
sudoy OP @myCupOfTea electron 可以做到很漂亮,但是体验感觉还是没有调用本地 UI 库的好
|
45
charlie21 2020-09-01 20:28:31 +08:00
这是一个话语权的问题,Windows 觉得 Windows 桌面软件的话语权在自己手里所以它推 WPF,你觉得你是 python 熟手你的话语权在自己手里 所以你干啥都用 python 。基本上结果就是如果自己搞可以按自己的知识储备来,如果是 ......
金子就是用来埋没的。反正大家都有眼无珠这么多年也是过来了 |
46
myCupOfTea 2020-09-02 09:43:17 +08:00
@sudoy 但是开发效率差距太大了
|
47
Windyzhou 1 天前 via Android
@sudoy #43 楼主,你 kivy 是怎么安装的,在 win 下吗?据说只能在 linux 下安装,可是我跑 buildozer Android debug 搞了一天都没搞好,据说第一次安装要 1 个小时左右。
|
48
sudoy OP @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() ``` |