不間斷 Python 挑戰 Day 32 - 專題:密碼產生器-使用tkinter

閱讀時間約 20 分鐘
先前的文章中,我們曾經實做過文字介面版本的密碼產生器,這篇文章中,我們將添加新的功能,包括記錄密碼使用場域的名稱、網址、帳號等,並能夠將以上記錄存檔,當然最重要的是將它轉換成友善的圖形介面。

密碼產生器

以下動畫展示了密碼產生器的完成品,操作流程包括:
  1. 點選「幫助」功能表的「關於」項目可跳出對話視窗顯示版本訊息。
  2. 在「名稱」、「網址」、「帳號」欄位輸入待產生密碼的相關資訊,點選「產生密碼」按鈕可生成隨機密碼。
  3. 最下方的下拉式選單可選擇密碼中包含大寫字母、小寫字母、數字以及特殊符號的個數。
  4. 點選「檔案」功能表的「儲存密碼」項目可跳出對話視窗,供使用者確認儲存資料,確認無誤後,將密碼及其相關資訊存入CSV檔案。
  5. 點選「檔案」功能表的「結束」項目可關閉視窗。
密碼產生器

實作流程

首先,我們先建立所有的視窗元件並進行版面配置,接著實作「產生密碼」按鈕的方法,這部分將根據文字版密碼產生器一文的程式碼進行改寫,最後再實作功能表項目的內容,包括「儲存密碼」、「結束」視窗以及「關於」程式的版本資訊。

視窗元件配置

由上方的展示動畫可以看到,除了最上方一排的功能表以外,共配置了五列(row)的視窗元件,最下方一列的欄位(column)數最多為八欄,所以在前三列的部分,標籤(label)佔一個欄位,文字方塊(entry)則佔七個欄位;第四列的標籤佔一個欄位,文字方塊佔五個欄位,並靠左對齊,按鈕(button)佔兩個欄位,並靠右對齊。
最下方列的下拉式選單(Combobox)來自tkinter的ttk模組,使用時必須額外載入此模組。下拉式選單的目的在於讓使用者選擇密碼所包含的字符內容,包括「大寫」字母、「小寫」字母、「數字」以及「符號」,並設定有預設值,每項最多可以選擇八個字符。
以下程式碼提供視窗元件配置的實作範例:
# modules
from tkinter import *
from tkinter import ttk

# window
password_gen_window = Tk()
password_gen_window.title("密碼產生器")
password_gen_window.config(padx=20, pady=20)

# labels
name_label = Label(text="名稱:")
name_label.grid(row=0, column=0)

url_label = Label(text="網址:")
url_label.grid(row=1, column=0)

username_label = Label(text="帳號:")
username_label.grid(row=2, column=0)

password_label = Label(text="密碼:")
password_label.grid(row=3, column=0)

u_letter_label = Label(text="大寫")
u_letter_label.grid(row=4, column=0, pady=4)

l_letter_label = Label(text="小寫")
l_letter_label.grid(row=4, column=2, pady=4)

number_label = Label(text="數字")
number_label.grid(row=4, column=4, pady=4)

symbol_label = Label(text="符號")
symbol_label.grid(row=4, column=6, pady=4)

# entries
name_entry = Entry(width=47)
name_entry.grid(row=0, column=1, columnspan=7)
name_entry.focus()

url_entry = Entry(width=47)
url_entry.grid(row=1, column=1, columnspan=7)

username_entry = Entry(width=47)
username_entry.grid(row=2, column=1, columnspan=7)

password_entry = Entry(width=25)
password_entry.grid(row=3, column=1, columnspan=4)

# button
generate_password_button = Button(text="產生密碼", width=20)
generate_password_button.grid(row=3, column=5, columnspan=3)

# combobox
u_letter_combo = ttk.Combobox(values=[0, 1, 2, 3, 4, 5, 6, 7, 8], width=4)
u_letter_combo.grid(row=4, column=1, pady=4)
u_letter_combo.current(4)

l_letter_combo = ttk.Combobox(values=[0, 1, 2, 3, 4, 5, 6, 7, 8], width=4)
l_letter_combo.grid(row=4, column=3, pady=4)
l_letter_combo.current(4)

number_combo = ttk.Combobox(values=[0, 1, 2, 3, 4, 5, 6, 7, 8], width=4)
number_combo.grid(row=4, column=5, pady=4)
number_combo.current(2)

symbol_combo = ttk.Combobox(values=[0, 1, 2, 3, 4, 5, 6, 7, 8], width=4)
symbol_combo.grid(row=4, column=7, pady=4)
symbol_combo.current(2)

# menus
password_gen_menu = Menu()
password_gen_window.config(menu=password_gen_menu)

file_menu = Menu(tearoff=False)
file_menu.add_command(label="儲存密碼")
file_menu.add_command(label="結束")

about_menu = Menu(tearoff=False)
about_menu.add_command(label="關於")

password_gen_menu.add_cascade(label="檔案", menu=file_menu)
password_gen_menu.add_cascade(label="幫助", menu=about_menu)

# mainloop
password_gen_window.mainloop()
執行結果如下:
密碼產生器主視窗
「檔案」功能表
「幫助」功能表

產生密碼

這部分僅為改寫文字版本的密碼產生器,並包裝成一個函式,架構基本上相同,在亂數選取字符的方式由迴圈改成了串列生成(list comprehension),以及在串列合成字串的方式使用了join()方法,讓程式碼更為簡潔。
from random import choice, shuffle

def generate_password():
  numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
  symbols = ["~", "!", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+"]
  u_letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
         'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  l_letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
         'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

password_numbers = [choice(numbers) for _ in range(int(number_combo.get()))]
password_symbols = [choice(symbols) for _ in range(int(symbol_combo.get()))]
password_u_letters = [choice(u_letters) for _ in range(int(u_letter_combo.get()))]
password_l_letters = [choice(l_letters) for _ in range(int(l_letter_combo.get()))]

password_list = password_numbers + password_symbols + password_u_letters + password_l_letters
shuffle(password_list)
password = "".join(password_list)
password_entry.delete(0, END)
password_entry.insert(0, password)
「產生密碼」按鈕的初始化程式碼必須將產生按鈕事件的函式帶入。
generate_password_button = Button(text="產生密碼", width=12, command=generate_password)
執行後,點選「產生密碼」即可依據下方所選定的字符種類及個數亂數產生密碼。
產生密碼

儲存密碼

當「名稱」、「網址」、「帳號」以及「密碼」等欄位都設定完成後,可將資料儲存到檔案中,以便利後續查找。在儲存之前,可以跳出對話方塊以提示使用者對資料做最後的檢查,包括:
  • 是否有欄位為空
  • 輸入資料是否正確
在tkinter的messagebox模組中提供了八種形式的對話方塊,可依據不同情境使用,以下列舉這八種對話方塊,並在本專案中使用其中三種。
  1. 顯示一般訊息:
    messagebox.showinfo(title=None, message=None, **options)
  2. 顯示警告訊息:
    messagebox.showwarning(title=None, message=None, **options)
  3. 顯示錯誤訊息:
    messagebox.showerror(title=None, message=None, **options)
  4. 顯示詢問訊息:
    messagebox.askquestion(title=None, message=None, **options)
  5. 顯示確定或取消訊息:
    messagebox.askokcancel(title=None, message=None, **options)
  6. 顯示重試或取消訊息:
    messagebox.askretrycancel(title=None, message=None, **options)
  7. 顯示是或否訊息:
    messagebox.askyesno(title=None, message=None, **options)
  8. 顯示是或否或取消訊息:
    messagebox.askyesnocancel(title=None, message=None, **options)
其中的參數用法如下:
title:對話方塊的名稱
message:對話方塊內的文字
options:可設定以下參數
  default:選擇預設按鈕,有YES(是)、NO(否)、CANCEL(取消)、OK(確定)、
       RETRY(重試)可以設定
  icon:選擇方塊內顯示的圖示,有INFO、ERROR、 QUESTION、
     WARNING可以設定
  parent:當對話方塊關閉後,焦點視窗返回的父視窗
回到專案,在確認「是否有欄位為空」的部分,程式可透過檢查每個欄位內的字串長度來判定是否有欄位忘了輸入,若有任一欄位內的字串長度為0,可使用messagebox.showwarning()跳出警告訊息,並回到主視窗介面;若確認通過,可用messagebox.askokcancel()跳出確認或取消的對話方塊,並在對話方塊上顯示「名稱」、「網址」、「帳號」、「密碼」等訊息,以提示使用者確認「輸入資料是否正確」,點選「確定」後將資料存入CSV檔案中,並將所有欄位清除,若有需要修改可點選「取消」回到主視窗介面。
from tkinter import messagebox
from csv import writer

def save_password():
  name = name_entry.get()
  url = url_entry.get()
  username = username_entry.get()
  password = password_entry.get()

  if len(name) == 0 or len(url) == 0 or len(username) == 0 or len(password) == 0:
    messagebox.showwarning(title="警告", message="請確認是否有空白欄位!")
  else:
    is_ok = messagebox.askokcancel(title="密碼確認",
                     message=f"您所輸入的資訊:\n名稱:{name}\n網址:{url}\n帳號:{username}\n密碼:{password}")
    if is_ok:
      password_data_list = []
      with open("password_data.csv", mode="a", newline="") as password_file:
        password_data_list.append([name, url, username, password])
        password_data = writer(password_file)
        password_data.writerows(password_data_list)

        name_entry.delete(0, END)
        url_entry.delete(0, END)
        username_entry.delete(0, END)
        password_entry.delete(0, END)
「檔案」功能表的「儲存密碼」項目必須將儲存密碼的函式帶入。
file_menu.add_command(label="儲存密碼", command=save_password)
將程式加入專案並執行密碼儲存後,可看到專案資料夾底下多了一個password_data.csv檔案,裡面儲存了剛剛輸入的內容。
儲存密碼
產生password_data.csv
password_data.csv檔案內容
以EXCEL開啟password_data.csv

關於與結束視窗

「幫助」功能表的「關於」項目使用messagebox.showinfo()顯示版本資訊。
def about():
  messagebox.showinfo(title="關於", message="密碼產生器 V1.0")
同樣將事件的函式帶入該項目中。
about_menu.add_command(label="關於", command=about)
「結束」項目使用視窗元件的destroy()方法,在這裡是將整個視窗關閉,也等同於按視窗右上角的關閉圖示。
file_menu.add_command(label="結束", command=password_gen_window.destroy)
將程式加入專案中後即可執行「關於」與「結束」兩個項目,至此便將本文開頭展示的密碼產生器實作完成。
「關於」與「結束」功能

總結

這篇文章遙遙呼應了前面所實作的文字版密碼產生器,隨著python學習的知識愈來愈多,除了原程式碼的優化以外,也能將文字版本的程式轉換為圖形介面,並將程式輸入或輸出的結果儲存下來,讓程式的使用體驗更貼近於一般使用者。

程式範例

為什麼會看到廣告
43會員
36Content count
留言0
查看全部
發表第一個留言支持創作者!
Wei-Jie Weng的沙龍 的其他內容
繼上一篇文章介紹了多種tkinter的視窗元件後,這篇我們再來討論三種視窗元件的配置方法以及優缺點,以適當移動各個元件到視窗中指定的位置,讓整個視窗版面的配置看起來更合理且美觀。
之前的文章中介紹過了Turtle Graphics,它是架構於tkinter模組之上以實現基本圖形介面的繪圖模組,這篇文章就來說明tkinter模組常用元件(widget)的基本用法,以及如何用它來設計出一個具有圖形使用者介面(Graphical User Interface, GUI)的程式。
在上一篇的文章中,我們提到關於開啟CSV文件的方式,從單純的當作純文字文件開啟,到引入Python內建的csv模組對CSV類型的檔案做基本的讀寫操作,在這篇文章中,我們將再進一步使用Pandas這套強大的工具,來簡化CSV文件處理的流程。
CSV全名為Comma-Separated Values,中文稱為逗號分隔值,也可稱為字元分隔值,因為分隔字元也可以不是逗號。它以純文字的形式儲存表格資料,同一列的資料以逗號或其它符號分隔成不同欄位,每一列的資料間以換行符號分隔。網路上很多資料的格式都是以CSV檔案呈現,例如交通部中央氣象局的觀測資
到目前為止,我們都還是在附檔名為.py的Python檔案執行程式碼,當程式需要與外部的檔案互動,例如讀取文字、表格、或是影像來做分析,或是把程式執行的結果儲存下來,就需要能夠存取外部的檔案。例如,在上一節中,當貪食蛇遊戲結束之後,隨著程式停止執行,該次的分數也就被丟棄,若能將分數記錄下來,下次遊戲開
接續前一篇文章,說明貪食蛇遊戲架構的後半部份,來完成整個遊戲的程式設計。
繼上一篇文章介紹了多種tkinter的視窗元件後,這篇我們再來討論三種視窗元件的配置方法以及優缺點,以適當移動各個元件到視窗中指定的位置,讓整個視窗版面的配置看起來更合理且美觀。
之前的文章中介紹過了Turtle Graphics,它是架構於tkinter模組之上以實現基本圖形介面的繪圖模組,這篇文章就來說明tkinter模組常用元件(widget)的基本用法,以及如何用它來設計出一個具有圖形使用者介面(Graphical User Interface, GUI)的程式。
在上一篇的文章中,我們提到關於開啟CSV文件的方式,從單純的當作純文字文件開啟,到引入Python內建的csv模組對CSV類型的檔案做基本的讀寫操作,在這篇文章中,我們將再進一步使用Pandas這套強大的工具,來簡化CSV文件處理的流程。
CSV全名為Comma-Separated Values,中文稱為逗號分隔值,也可稱為字元分隔值,因為分隔字元也可以不是逗號。它以純文字的形式儲存表格資料,同一列的資料以逗號或其它符號分隔成不同欄位,每一列的資料間以換行符號分隔。網路上很多資料的格式都是以CSV檔案呈現,例如交通部中央氣象局的觀測資
到目前為止,我們都還是在附檔名為.py的Python檔案執行程式碼,當程式需要與外部的檔案互動,例如讀取文字、表格、或是影像來做分析,或是把程式執行的結果儲存下來,就需要能夠存取外部的檔案。例如,在上一節中,當貪食蛇遊戲結束之後,隨著程式停止執行,該次的分數也就被丟棄,若能將分數記錄下來,下次遊戲開
接續前一篇文章,說明貪食蛇遊戲架構的後半部份,來完成整個遊戲的程式設計。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:惡作劇之吻、慶餘年、Good Casting、溫柔時光、鋼之鍊金術師這五個戲劇作品的主題曲。
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:惡作劇之吻、慶餘年、Good Casting、溫柔時光、鋼之鍊金術師這五個戲劇作品的主題曲。
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!