c# winform UI + python底层的一点尝试
鉴于python做winform之类的UI比较弱。于是想结合C#的winform 和 python的底层开发(windows平台)。
尝试做了一个RSS阅读器。在这里:http://download.csdn.net/detail/lion_awake/8240713。
主要从一些网站抓取rss,然后解析rss,并在界面上显示。
结构
这是一个c/s架构。
server端,用python编写,负责抓取rss并解析。
client端,从server端拿到数据然后显示。
client端和server端通过socket进行通讯。
掉进去过的坑
1. c# 正则表达式匹配中文的问题。
json_str = "\\u4e00"
Regex = new Regex("[\\u4e00-\\u9fa5']+")//不起作用
Regex = new Regex("[\\\\u4e00-\\\\u9fa5']+")//ok
c# \\转换为\的问题,前一篇帖子已经提过。
2. c# socket发送数据问题:
帖子这里:http://bbs.csdn.net/topics/390949473
总结了下,问题的根源在于,服务器端用python-twisted中的LineReceiver这个Protocol,也就是说发送消息以"\r\n"为结束符(windows上)
感受
或许是对c#的语法不熟,相同的东西,用python实现可能只需要1~3h,用C#折腾了两天。主要是出了问题,google不好找答案,其次,很多东西底层调试不进去,最后问问c#同行,基本没有几个能够答个所以然。
或许为了他的界面而是用C#,但需要权衡下,你是否能够驾驭各种兼容问题以及时间成本。
虽然python有很多优秀的底层,以及web的ui都不错,但对于desktop ui来说,有所欠缺,特别是游戏。这块短板的弥补,暂时木有神马好的方案。优先级排行:成熟的开源方案 > 成熟的闭源方案> 不咋成熟的开源方案 > 不咋成熟的闭源方案。
其次还要考虑技能的熟练程度。也许结合这个以后的优先级可能是:成熟的开源方案 > 不咋成熟的开源方案 > 成熟的闭源方案> 不咋成熟的闭源方案。
出路:
python的gui不是太少,恰恰相反,太多!
自带的有Tkinter(for 2.x python)。
===============================================================
此外:
QT--商业性质的,比较漂亮,lisence resrited.
GTK -- 对于linux上面的UI开发推荐。
WX -- 对于Windows上的UI开发推荐。http://wxpython.org/Phoenix/docs/html/main.html
TK -- 很丑,跨平台,性能不错(http://wiki.tcl.tk/4145)
===============================================================
以下代码为Tkinter入门级demo。 此外,有一个不错的demo网站:http://thinkingtkinter.sourceforge.net/
# -*- coding: CP936 -*-
from Tkinter import * root = Tk()
root.geometry("800x600+300+300")
def Noop():
print "not implemented action" #===menu===============
menu = Menu(root)
root.config(menu=menu) fileMenu = Menu(menu)
editMenu = Menu(menu)
menu.add_cascade(label="File", menu = fileMenu)
menu.add_cascade(label="Edit", menu = editMenu) #--"File" menu--
fileMenu.add_command(label="New Project...", command = Noop)
fileMenu.add_command(label="New...", command=Noop)
fileMenu.add_separator()
fileMenu.add_command(label="Exit", command =Noop)
#--"Edit" menu--
editMenu.add_command(label="Redo", command=Noop) #===Toolbar==============
toolbar = Frame(root)
insertBtn = Button(toolbar, text="Insert Image",command = Noop)
insertBtn.pack(side=LEFT,padx=2)
printBtn = Button(toolbar, text="Print",command = Noop)
printBtn.pack(side=LEFT,padx=2)
toolbar.pack(side=TOP, fill=X) #===Status Bar ==========
status= Label(root, text="prepare to do something...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill = X) #===Message Box =========
import tkMessageBox as msg
#msg.showinfo("window title","an apple a day keeps the doctor away")
answer = msg.askquestion("question1", "Do you like juice?")
print answer #===Canvas ==============
canvas = Canvas(root,width=200, height =100)
canvas.pack()
blackline = canvas.create_line(0,0,200,50)
redline = canvas.create_line(0,100,200,50,fill='red')
greenbox = canvas.create_rectangle(25,25,100,50,fill='green') canvas.delete(redline) #===icon&images==========
photo = PhotoImage(file=r'E:\workspace\python\111.gif')#GIF and PGM/PPM files
label = Label(root, image= photo)
label.pack() root.mainloop()
调整布局使用grid函数,demo如下:
root=Tk()
#===grid layout =========
frame = Frame(root)
frame.pack()
Label(frame, text="name").grid(row=0, sticky=W)
Label(frame, text="password").grid(row=1, sticky=W)
Entry(frame).grid(row=0,column=1)
Entry(frame).grid(row=1,column=1)
Checkbutton(frame,text="remember me").grid(columnspan=2)
root.mainloop()
c# winform UI + python底层的一点尝试的更多相关文章
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- 提高PAAS安全性的一点尝试
云服务已经成为现代人生活的一部分.手机中的照片会自己主动同步到云中:你的邮件内容保存在云中.办公软件执行在云中:你的健康数据会实时上传到云中.你每天的生活轨迹消耗的卡路里也会上传到云中:云服务也会逐渐 ...
- 20191031:Python底层机制
20191031:Python底层机制 python底层从3个方面来说,分别是: 引用计数机制 垃圾回收机制 内存池机制 引用计数机制 使用引用计数来追踪内存中的对象,所有对象都有引用计数,并且这个引 ...
- WinForm 皮肤,自定义控件WinForm.UI
WinForm.UI https://github.com/YuanJianTing/WinForm.UI WinForm 皮肤,自定义控件 使用方式: BaseForm: public partia ...
- 关于Python学习的一点说明
关于Python学习的一点说明 我是用什么地方的资料来学习python的呢? 答案当然是鼎鼎大名的GitHub了. 5万多星推荐,100天让你从入门到精通,你值得拥有,点我进入查看
- 孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类尝试第一天
孤荷凌寒自学python第四十六天开始建构自己用起来更顺手一点的Python模块与类,尝试第一天 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 按上一天的规划,这是根据过去我自学其它编程语 ...
- 2017年开发者生态报告:Python最多人想尝试的编程语言(转载)
在过去的十年里,Python 语言获得了最大的增长幅度,已经成为最受欢迎的程序设计语言之一.JetBrains 近日发布了 2017 开发者生态报告,该报告包含开发人员对 11 种编程语言以及数据库和 ...
- python编码问题一点通
一.了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的, ...
- python底层原理
有同学问到了一个问题,python中存储变量是通过内存地址来存储,那么python又是如何去判断内存中的地址是什么数据类型的呢.经过查找,找到这篇文章: 原博客地址:http://www.cnblog ...
随机推荐
- C++strng流(入门级)
/************************************************************************* * * FILENAME: stringTest. ...
- 数据库备份与恢复(Mysql)
Mysql备份种类可以分为两种:完全备份和增量备份 完全备份:对某一个时间点上的所有数据或应用进行的一个完全复制. 增量备份:指在一次全备份上或上一次增量备份后,以后每次的备份只需备份与前次相比增加或 ...
- 个人js
1.网页右侧地图浮动楼层,超过100px就显示 $(window).scroll(function(){ ){ //距顶部多少像素时,出现返回顶部按钮 $("#floor").fa ...
- 浅谈JavaScript中的Ajax
引言 作为一名WEB开发者,我想Ajax技术是一定需要掌握的.你也许平时没有使用JavaScript真正的写过Ajax.但是你一定使用过JQuery里面的相关函数来进行异步调用.今天我们就来介绍下原生 ...
- 一次插入多条记录 [mysql]
调用多次INSERT语句不就可以插入多条记录了吗?但使用这种方法要增加服务器的负荷,因为,执行每一次SQL服务器都要同样对SQL进行分析.优化等操作.幸好MySQL提供了另一种解决方案,就是使用一条I ...
- mysql SELECT FOR UPDATE语句使用示例
以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LO ...
- Apple Pay
Apple Pay运行环境:iPhone6以上设备,操作系统最低iOS9.0以上,部分信息设置需要iOS9.2以上.目前还不支持企业证书添加. 环境搭建好后可以在模拟器上面运行,xcode7.2.1+ ...
- 删除多个Safari书签
Safari 的书签多了,删除起来很麻烦,可以先选中所有书签,然后再按"Command+Delete",就可以全部删除了.
- #ifdef的用法【转】
#ifdef的用法 #ifdef的用法灵活使用#ifdef指示符,我们可以区隔一些与特定头文件.程序库和其他文件版本有关的代码.代码举例:新建define.cpp文件 #include &qu ...
- Java字节流:InputStream OutputStream
字节输入流:InputStream 类声明: public abstract class InputStream implements Closeable 位于java.io包下,是一个抽象类. 官方 ...