Python入門 —— 03GUI界面編程

来源:https://www.cnblogs.com/darksouls/archive/2018/01/02/8169217.html
-Advertisement-
Play Games

GUI(Graphical User Interface) 即圖形用戶介面,又稱圖形用戶介面。是指採用圖形方式顯示的電腦操作用戶界面。GUI 是屏幕產品的視覺體驗和互動操作部分。 你的應用程式是否有一個傳統的圖形用戶界面?對於某些應用程式來說,這個答案是肯定的,如果這個應用程式本質上是圖形化的,且... ...


GUI(Graphical User Interface)


即圖形用戶介面,又稱圖形用戶介面。
是指採用圖形方式顯示的電腦操作用戶界面。GUI 是屏幕產品的視覺體驗和互動操作部分。

“你的應用程式是否有一個傳統的圖形用戶界面?”對於某些應用程式來說,這個答案是肯定的,如果這個應用程式本質上是圖形化的,且在本地機器上做了優化或者是在本地運行,那麼就要考慮構建一個桌面圖形用戶界面。如果是更為通用的程式,那麼最好添加命令行或者Web界面。
  命令行擁有很多優勢,例如速度、遠程訪問、可重用性,可腳本化和控制等等。這對用戶來說往往會比圖形用戶界面更為重要。當然,現在有很多庫可以支持設計很好的命令行程式,如Click,Cement和Cliff。
  同樣的,對於本地運行的程式來說,Web界面也是十分值得考慮的。尤其是當你覺得用戶可能希望應用程式能夠像Django,Flask或Pyramid這樣的項目可以直接遠程托管。甚至你可以使用類似pywebview這樣的庫將Web應用程式包裹在native GUI window。

1. Tkinter

簡單介紹:

Tkinter模塊是Python的標準GUI工具包。是[Tcl / Tk]() 封裝在 python 中的*介面*。是90年代初推出的流行圖形界面。除此之外,Tkinter的擴展集pmw和Tix功能上都要相對它強大,但Tkinter卻是最基本的。我認為,在用python 做gui開發,tkinter是最基本的知識。也許以後的開發中並不常用tkinter,但是一些小型的應用上面,它還是很有用的,而且開發速度也很快。
Tkinter可以使用Python許可證,在Tcl / Tk的BSD許可證之上。

優勢

Tkinter用起來非常簡單,python自帶的 IDLE就是採用它寫的。Tk8.0 的後續版本可以實現本地視窗風格,並良好地運行在絕大多數平臺中。它擁有大量的資源,包括書籍和代碼示例,以及活躍的用戶社區,廣泛的簡單入門示例。

學習

使用Tkinter的步驟:
-導入Tkinter
-創建頂層視窗
-在頂層上創建其他控制項
-控制項與後臺代碼鏈接
-進入主程式迴圈事件

附:一個簡單的文件管理器源代碼


#!/usr/bin/env python

import os
from time import sleep
from Tkinter import *

class DirList(object):
    def __init__(self, initdir=None):
        self.top = Tk()
        self.label = Label(self.top,
            text='Directory Lister v1.2')
        self.label.pack()

        self.cwd=StringVar(self.top)

        self.dirl = Label(self.top, fg='blue',
            font=('Helvetica', 12, 'bold'))
        self.dirl.pack()

        self.dirfm = Frame(self.top)
        self.dirsb = Scrollbar(self.dirfm)
        self.dirsb.pack(side=RIGHT, fill=Y)
        self.dirs = Listbox(self.dirfm, height=15,
            width=50, yscrollcommand=self.dirsb.set)
        self.dirs.bind('<Double-1>', self.setdirandgo)
        self.dirsb.config(command=self.dirs.yview)
        self.dirs.pack(side=LEFT, fill=BOTH)
        self.dirfm.pack()

        self.dirn = Entry(self.top, width=50,
            textvariable=self.cwd)
        self.dirn.bind('<Return>', self.dols)
        self.dirn.pack()

        self.bfm = Frame(self.top)
        self.clr = Button(self.bfm, text='Clear',
            command=self.clrdir,
            activeforeground='white',
            activebackground='blue')
        self.ls = Button(self.bfm,
            text='List Directory',
            command=self.dols,
            activeforeground='white',
            activebackground='green')
        self.quit = Button(self.bfm, text='Quit',
            command=self.top.quit,
            activeforeground='white',
            activebackground='red')
        self.clr.pack(side=LEFT)
        self.ls.pack(side=LEFT)
        self.quit.pack(side=LEFT)
        self.bfm.pack()

        if initdir:
            self.cwd.set(os.curdir)
            self.dols()

    def clrdir(self, ev=None):
        self.cwd.set('')

    def setdirandgo(self, ev=None):
        self.last = self.cwd.get()
        self.dirs.config(selectbackground='red')
        check = self.dirs.get(self.dirs.curselection())
        if not check:
            check = os.curdir
        self.cwd.set(check)
        self.dols()

    def dols(self, ev=None):
        error = ''
        tdir = self.cwd.get()
        if not tdir:
            tdir = os.curdir

        if not os.path.exists(tdir):
            error = tdir + ': no such file'
        elif not os.path.isdir(tdir):
            error = tdir + ': not a directory'

        if error:
            self.cwd.set(error)
            self.top.update()
            sleep(2)
            if not (hasattr(self, 'last') \
                and self.last):
                    self.last = os.curdir
            self.cwd.set(self.last)
            self.dirs.config(
                selectbackground='LightSkyBlue')
            self.top.update()
            return

        self.cwd.set(
            'FETCHING DIRECTORY CONTENTS...')
        self.top.update()
        dirlist = os.listdir(tdir)
        dirlist.sort()
        os.chdir(tdir)
        self.dirl.config(text=os.getcwd())
        self.dirs.delete(0, END)
        self.dirs.insert(END, os.curdir)
        self.dirs.insert(END, os.pardir)
        for eachFile in dirlist:
            self.dirs.insert(END, eachFile)
        self.cwd.set(os.curdir)
        self.dirs.config(
            selectbackground='LightSkyBlue')

def main():
    d = DirList(os.curdir)
    mainloop()

if __name__ == '__main__':
    main()

2. PyQt

簡單介紹:

PyQt實現了Python與Qt庫(是一個完整的C++應用程式開發框架,是目前最強大的界面庫之一)的完美融合,是一個創建GUI應用程式的工具包。使用它開發出的應用程式在其他平臺上會擁有熟悉的外觀和感覺。

優勢:

是一個比較流行的庫,功能強大,開發的界面也是挺不錯的,跨平臺的支持很好,同樣適應於大型應用。

學習

3. WxPython

簡單介紹:

WxPython(python對WxWidgets的移植)的功能上面要強於 Tkinter 。面向對象的編程風格,設計的框架類似於MFC (是目前最強大的界面庫之一)。對於大型GUI應用上面,WxPython還是具有很強的優勢的。boa constructor可以幫助我們快速可視地構建WxWidgets界面。但是需要註意的是,可能需要將WxPython與應用程式捆綁在一起,因為它不會隨Python自動安裝。
WxPython使用其父項目的wxWindows庫許可證。

優勢

它的入門使用也比較容易,比較流行的一個 Tkinter 的替代品,在 各種平臺下都表現挺好。

學習

  1. wxPython中基本控制項學習 ( 轉載自博客園 "風清揚001" )

  2. wxPython學習筆記系列 ( 轉載自博客園 "夜雨寄北丶" )

  3. wxPython的基礎教程

控制項層次結構 wx.BoxSizer

4. PySide

簡單介紹

這個框架最早是由 Nokia 的芒果團隊做完的,在2009年8月,PySide首次發佈。提供和PyQt類似的功能,並相容 API。但與 PyQt 不同處為使用LGPL授權。但是,眾所周知的原因,這個團隊已經消失了。據說,Qt 重新接管了它的開發工作,而且處於活躍狀態。
是另一個 Python 對跨平臺的 GUI 工具集 Qt 的包裝(可認為PySide是跨平臺的應用程式框架Qt的Python綁定版本),捆綁在 Python 當中,最初由 BoostC++ 庫實現,後來遷移到 Shiboken。

優勢

另一個比較流行的一個 Tkinter 的替代品,學習起來也是相對容易,因為是對GUI工作機
 Qt 的包裝,跨平臺性支持比較好。

學習

5. PyGTK

簡單介紹

Gtk是linux下Gnome的核心開發庫,是一系列的 Python 對 GTK+ GUI 庫的包裝,功能上面非常齊全。值得說明的是,在windows平臺下gtk的顯示風格並不是特別本地化。不過他帶的glade的界面設計器還是可以幫你省不少事的。

優勢

又一個比較流行的一個 Tkinter 的替代品,許多 Gnome 下的著名應用程式的 GUI 都是使用 PyGTK 實現的,比如 BitTorrent ,GIMP和 Gedit 都有可選的實現,在 Windows 平臺 似乎表現不太好,這點也無可厚非,畢竟使用的是GTK 的 GUI 庫。

6. Jython

嘗試過用python訪問java類庫嗎,那麼就用jython吧,Jython 程式可以和 Java 無縫集成。
(除了一些標準模塊,Jython 使用 Java 的模塊。Jython 幾乎擁有標準的Python 中不依賴於 C 語言的全部模塊。比如,Jython 的用戶界面將使用 Swing,AWT或者 SWT。Jython 可以被動態或靜態地編譯成 Java 位元組碼)
Jython其實可以認為是另外一個python開發環境,基於java的,但是大多數的CPython調用jython下還是可以的。你可以在jython環境下像使用java一樣來通過python的語法來調用java語言,真的很酷。

7. MFC

Windows Pywin32允許你像VC一樣的形式來使用PYTHON開發win32應用。代碼風格可以類似win32 sdk,也可以類似MFC,由你選擇。如果你仍不放棄vc一樣的代碼過程在python下,那麼這就是一個不錯的選擇。

8. PythonCard

PythonCard其實是對wxPython的再封裝。不過封裝的更加簡單,使用起來覺得比wxPython更直觀,也更簡單化了。

9. Dabo

仍是一個基於wxpython的再封裝庫,沒用過,不太瞭解。它提供資料庫訪問,商業邏輯以及用戶界面。

10. AnyGui

通過底層的api來訪問其它工具集,像tkinter,wxpython和qt.具體也沒怎麼用過。

11. WPY

MFC風格的Gui開發庫,代碼風格也類似於MFC,僅管如此,你依舊可以使用這個庫來開發GUI應用,而不用擔心平臺移植的問題。她同樣是一個跨平臺的庫。

12. IronPython

如果你要想開發.net下麵的應用的話,那麼IronPython就是你的選擇,與jython有點類似,他同樣支持標準的python模塊,但同樣增加了對.net庫的支持。你也可以理解為他是另一個python開發環境。你可以非常方便地使用python語法進行.net應用的開發,這一點聽起來真的挺有意思。

附:如果你是java用戶,那麼你就用jython,除了可以享受python的模塊功能及語法外,你可以找到許多java的影子;
如果你是.net用戶,那麼就用iron python吧。
如果你對Visual C++很熟悉,那麼你可以使用MFC,WPY或是wxPython,當然我更建議wxPython了。
當然,我認為對於tkinter是每一個原來搞C的人都應該瞭解和學習的GUI庫,因為它很輕便,小型應用就可以使用它來搞定,而對於較大型應用可以採用pyGtk,pyQt,WxPython或 PythonCard來搞定,這樣的話,既可以註重知識的銜接性,也可以快速進行軟體的開發了。

參考資料:

[1]Tkinter 的介紹 : http://en.wikipedia.org/wiki/Tkinter
主頁
[2]PyQt 的介紹 : http://en.wikipedia.org/wiki/PyQt
主頁
[3]wxPython 的介紹 : http://en.wikipedia.org/wiki/WxPython
主頁
[4]PySide 的介紹 : http://en.wikipedia.org/wiki/PySide
主頁
[5]PyGTK 的介紹 : http://en.wikipedia.org/wiki/PyGTK
主頁


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 額外功能處理流的意思是在基礎流(InputStream/OutputStream/Reader/Writer)的基礎上提供額外的功能。常見的額外功能可歸納為以下幾種。 Bufferedxxx類和Array相關的功能此處不做介紹。本文將介紹除此之外的其餘功能以及對象序列化時涉及到的序列化介面Seria ...
  • 初識JDBC 一.JDBC概念 jdbc 英文全稱:java database connectivity ,是java訪問資料庫的一套規範,通俗可以理解為,java為連接資料庫提供的一套類和介面 jdbc與資料庫驅動的關係圖: 二.jdbc簡單使用 使用流程:(在使用之前需要將驅動的jar導入進去) ...
  • Java語言是強類型語言,對於每一種數據都定義了明確的具體數據類型,在記憶體總分配了不同大小的記憶體空間, byte(位元組):8個二進位(-128 ~ 127), short:16個二進位(負的2的15次方到正的2的15次方-1), int:32個二進位(負的2的31次方到正的2的31次方-1), fl ...
  • 閑暇之餘,跟同學們探討並研究了一下有關程式設計方面,利用Java面向對象的程式設計方法,設計學生成績管理系統,以管理員身份登錄,實現下列界面中常見的功能。貼部分圖片 實現後,代碼經過編譯後,演示結果如下: ...
  • 學習使用java.awt.*、javax.swing.*、java.awt.event.*包進行簡單的tank大戰游戲編程,學習了JFrame、JPanel等容器和組件的使用,學習使用Graphics的各種方法繪製圖形,以及一些事件監聽和處理方法 ...
  • go語言環境變數設置 ...
  • JVM查找類文件的順序: 在doc下使用set classpath=xxx, 如果沒有配置classpath環境變數,JVM只在當前目錄下查找要運行的類文件。 如果配置了classpath環境,JVM會先在classpath環境變數值的目錄中查找要運行的類文件。 值的結尾處如果加上分號,那麼JVM在 ...
  • JRE(java Runtime Environment java運行環境) 包括java虛擬機(JVM Java Virtual Machine)和Java程式所需的核心類庫等, 如果想要運行一個開發好的Java程式, 電腦中需要安裝JRE就行了。 JDK(Java Development Ki ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...