• 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,也就是说发送消息以" "为结束符(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:workspacepython111.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()
    

      

  • 相关阅读:
    19. Remove Nth Node From End of List
    18. 4Sum
    16. 3Sum Closest
    15. 3Sum
    17. Letter Combinations of a Phone Number
    A Network-based End-to-End Trainable Task-oriented Dialogue System
    14. Longest Common Prefix
    36. Valid Sudoku
    29. Divide Two Integers
    32. Longest Valid Parentheses
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/4153804.html
Copyright © 2020-2023  润新知