Python GUI

2021-04-09 07:00:10

Python GUI

圖形介面開發庫

Python 提供了多個圖形開發介面的庫,幾個常用 Python GUI 庫如下

Tkinter: Tkinter 模組(Tk 介面)是 Python 的標準 Tk GUI 工具包的介面 .Tk 和 Tkinter 可以在大多數的 Unix 平臺下使用,同樣可以應用在 Windows 和 Macintosh 系統裡。Tk8.0 的後續版本可以實現本地視窗風格,並良好地執行在絕大多數平臺中。

wxPython:wxPython 是一款開源軟體,是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程式設計師很方便的建立完整的、功能健全的 GUI 使用者介面。

Jython:Jython 程式可以和 Java 無縫整合。除了一些標準模組,Jython 使用 Java 的模組。Jython 幾乎擁有標準的Python 中不依賴於 C 語言的全部模組。比如,Jython 的使用者介面將使用 Swing,AWT或者 SWT。Jython 可以被動態或靜態地編譯成 Java 位元組碼。

Tkinter 程式設計

Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 可以快速的建立 GUI 應用程式。

由於 Tkinter 是內建到 python 的安裝包中、只要安裝好 Python 之後就能 import Tkinter 庫、而且 IDLE 也是用 Tkinter 編寫而成、對於簡單的圖形介面 Tkinter 還是能應付自如。

注意:Python3.x 版本使用的庫名為 tkinter,即首寫字母 T 為小寫。

import tkinter

建立一個GUI程式

1、匯入 Tkinter 模組
2、建立控制元件
3、指定這個控制元件的 master, 即這個控制元件屬於哪一個
4、告訴 GM(geometry manager) 有一個控制元件產生了。
範例(Python3.x)

#!/usr/bin/python3 
import tkinter top = tkinter.Tk() # 進入訊息迴圈 
top.mainloop()範例(Python2.x)
#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
import Tkinter top = Tkinter.Tk() # 進入訊息迴圈 
top.mainloop()

以上程式碼執行結果如下圖:
在這裡插入圖片描述

Tkinter 元件

Tkinter的提供各種控制元件,如按鈕,標籤和文字方塊,一個GUI應用程式中使用。這些控制元件通常被稱為控制元件或者部件。

目前有15種Tkinter的部件。我們提出這些部件以及一個簡短的介紹,在下面的表:

控制元件描述
Button按鈕控制元件;在程式中顯示按鈕。
Canvas畫布控制元件;顯示圖形元素如線條或文字
Checkbutton多選框控制元件;用於在程式中提供多項選擇框
Entry輸入控制元件;用於顯示簡單的文字內容
Frame框架控制元件;在螢幕上顯示一個矩形區域,多用來作為容器
Label標籤控制元件;可以顯示文字和點陣圖
Listbox列表框控制元件;在Listbox視窗小部件是用來顯示一個字串列表給使用者
Menubutton選單按鈕控制元件,用於顯示選單項。
Menu選單控制元件顯示選單欄,下拉式選單和彈出選單
Message訊息控制元件;用來顯示多行文字,與label比較類似
Radiobutton無線電鈕控制元件;顯示一個單選的按鈕狀態
Scale範圍控制元件;顯示一個數值刻度,為輸出限定範圍的數位區間
Scrollbar卷軸控制元件,當內容超過視覺化區域時使用,如列表框。.
Text文字控制元件;用於顯示多行文字
Toplevel容器控制元件;用來提供一個單獨的對話方塊,和Frame比較類似
Spinbox輸入控制元件;與Entry類似,但是可以指定輸入範圍值
PanedWindowPanedWindow是一個視窗佈局管理的外掛,可以包含一個或者多個子控制元件。
LabelFramelabelframe 是一個簡單的容器控制元件。常用與複雜的視窗佈局。
tkMessageBox用於顯示你應用程式的訊息方塊。

標準屬性

標準屬性也就是所有控制元件的共同屬性,如大小,字型和顏色等等。

屬性描述
Dimension控制元件大小;
Color控制元件顏色;
Font控制元件字型;
Anchor錨點;
Relief控制元件樣式;
Bitmap點陣圖;
Cursor遊標;

幾何管理

Tkinter控制元件有特定的幾何狀態管理方法,管理整個控制元件區域組織,以下是Tkinter公開的幾何管理類:包、網格、位置

幾何方法描述
pack()包裝;
grid()網格;
place()位置;

426字串轉 md5 工具(Python3 下執行):

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from tkinter import *
import hashlib
import time

LOG_LINE_NUM = 0

class MY_GUI():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name


    #設定視窗
    def set_init_window(self):
        self.init_window_name.title("文書處理工具_v1.2")           #視窗名
        #self.init_window_name.geometry('320x160+10+10')                         #290 160為視窗大小,+10 +10 定義視窗彈出時的預設展示位置
        self.init_window_name.geometry('1068x681+10+10')
        #self.init_window_name["bg"] = "pink"                                    #視窗背景色,其他背景色見:blog.csdn.net/chl0000/article/details/7657887
        #self.init_window_name.attributes("-alpha",0.9)                          #虛化,值越小虛化程度越高
        #標籤
        self.init_data_label = Label(self.init_window_name, text="待處理資料")
        self.init_data_label.grid(row=0, column=0)
        self.result_data_label = Label(self.init_window_name, text="輸出結果")
        self.result_data_label.grid(row=0, column=12)
        self.log_label = Label(self.init_window_name, text="紀錄檔")
        self.log_label.grid(row=12, column=0)
        #文字方塊
        self.init_data_Text = Text(self.init_window_name, width=67, height=35)  #原始資料錄入框
        self.init_data_Text.grid(row=1, column=0, rowspan=10, columnspan=10)
        self.result_data_Text = Text(self.init_window_name, width=70, height=49)  #處理結果展示
        self.result_data_Text.grid(row=1, column=12, rowspan=15, columnspan=10)
        self.log_data_Text = Text(self.init_window_name, width=66, height=9)  # 紀錄檔框
        self.log_data_Text.grid(row=13, column=0, columnspan=10)
        #按鈕
        self.str_trans_to_md5_button = Button(self.init_window_name, text="字串轉MD5", bg="lightblue", width=10,command=self.str_trans_to_md5)  # 呼叫內部方法  加()為直接呼叫
        self.str_trans_to_md5_button.grid(row=1, column=11)


    #功能函數
    def str_trans_to_md5(self):
        src = self.init_data_Text.get(1.0,END).strip().replace("\n","").encode()
        #print("src =",src)
        if src:
            try:
                myMd5 = hashlib.md5()
                myMd5.update(src)
                myMd5_Digest = myMd5.hexdigest()
                #print(myMd5_Digest)
                #輸出到介面
                self.result_data_Text.delete(1.0,END)
                self.result_data_Text.insert(1.0,myMd5_Digest)
                self.write_log_to_Text("INFO:str_trans_to_md5 success")
            except:
                self.result_data_Text.delete(1.0,END)
                self.result_data_Text.insert(1.0,"字串轉MD5失敗")
        else:
            self.write_log_to_Text("ERROR:str_trans_to_md5 failed")


    #獲取當前時間
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        return current_time


    #紀錄檔動態列印
    def write_log_to_Text(self,logmsg):
        global LOG_LINE_NUM
        current_time = self.get_current_time()
        logmsg_in = str(current_time) +" " + str(logmsg) + "\n"      #換行
        if LOG_LINE_NUM <= 7:
            self.log_data_Text.insert(END, logmsg_in)
            LOG_LINE_NUM = LOG_LINE_NUM + 1
        else:
            self.log_data_Text.delete(1.0,2.0)
            self.log_data_Text.insert(END, logmsg_in)


def gui_start():
    init_window = Tk()              #範例化出一個父視窗
    ZMJ_PORTAL = MY_GUI(init_window)
    # 設定根視窗預設屬性
    ZMJ_PORTAL.set_init_window()

    init_window.mainloop()          #父視窗進入事件迴圈,可以理解為保持視窗執行,否則介面不展示


gui_start()

結束語

各位網際網路上的同事、同仁、同學們,Python GUI到這裡就結束了。碼字不易,讀完了這篇部落格在評論區裡留下你的真心話,甩給作者一個贊再走唄!👍👍👍
在這裡插入圖片描述