[PySimpleGUI介面學習](四)動態更新窗口控制項上的文字
- 2020 年 3 月 13 日
- 筆記
回顧
上一篇文章在最後實戰了一個小程式,這個小程式的功能是實現兩數相加並將結果顯示在命令窗口,目前看來,這當然只是一個過渡產品,介面編程的要求是要將所有數據在介面上表現出來,這樣不僅僅出於一致性的考慮,更重要的是,這是介面編程的意義所在。
為了方便起見,現將上一篇教程中的程式碼抄錄如下:
import PySimpleGUI as sg layout = [[sg.Text("加法器")], [sg.InputText(), sg.Text("+"), sg.InputText(),sg.Text("=")], [sg.Button("計算"), sg.Button("退出")]] window = sg.Window("加法器").Layout(layout) while True: button, values = window.Read() if button is None or button == "退出": break else: tmp_a = eval(values[0]) tmp_b = eval(values[1]) print("%s與%s和是%s" % (tmp_a, tmp_b, eval(tmp_a)+eval(tmp_b))) window.Close()
進化
為了讓程式計算結果顯示在介面上,需要引入控制項的一個方法Update,該方法的功能是用新的字元串來替代原控制項上的字元串,但是應該在哪裡來顯示這個結果呢?
聰明的讀者應該能很快想到好辦法,這裡只是簡單在=號後面添加一個Text控制項,首先將該控制項上顯示為空,待結果計算出來後,立刻將結果在該控制項上顯示就好了。
可是,新的問題又來了,在用戶沒有點擊到這個控制項時候,程式在運行時如何知道這個控制項呢?
嗯,在PySimpleGUI工具包中,Window這個窗口類提供了一個查找控制項的方法FindElement,但是這個方法需要依照一個關鍵字,所以,我們的辦法就出來了,即給新增的標籤控制項增加一個新的關鍵字就好:
sg.Text("", key="_RESULT_")
上面程式碼中的RESULT就是為FindElement方法提供的關鍵字,在程式運行時通過以下語句來實現查找:
window.FindElement('_RESULT_')
這樣就可以找到了我們需要更新其顯示的標籤控制項。
整體程式碼如下:
import PySimpleGUI as sg layout = [[sg.Text("加法器")], [sg.InputText(), sg.Text("+"), sg.InputText(),sg.Text("="), sg.Text("", key="_RESULT_")], [sg.Button("計算"), sg.Button("退出")]] window = sg.Window("加法器").Layout(layout) while True: button, values = window.Read() if button is None or button == "退出": break else: tmp_a = eval(values[0]) tmp_b = eval(values[1]) tmp_result = tmp_a+tmp_b window.FindElement("_RESULT_").Update(str(tmp_result)) window.Close()
細心的人可以將兩次程式碼仔細對比,自然會發現其中的不一樣之處。
繼續進化
等等,在我們運行上述程式後,會出現一個介面,但是當我們輸入兩個加數,再點擊計算按鈕時,結果是計算出來了,但是兩個加數的輸入框卻被清空了,那麼能不能在運算結束時還將兩個加數輸入框中的數字保留下來呢?
答案當然是可以,而且很簡單,只需要在創建的兩個加數文本框中添加一個do_not_clear的標識即可,默認情況下,該標識是False,即介面只要讀取一次用戶點擊,即將當前文本框清空,倘若不想清空,只需要將該標識設置為True即可:
sg.InputText(do_not_clear=True)
修正後的程式碼如下:
import PySimpleGUI as sg layout = [[sg.Text("加法器")], [sg.InputText(do_not_clear=True), sg.Text("+"), sg.InputText(do_not_clear=True),sg.Text("="), sg.Text("", key="_RESULT_")], [sg.Button("計算"), sg.Button("退出")]] window = sg.Window("加法器").Layout(layout) while True: button, values = window.Read() if button is None or button == "退出": break else: tmp_a = eval(values[0]) tmp_b = eval(values[1]) tmp_result = tmp_a+tmp_b window.FindElement("_RESULT_").Update(str(tmp_result)) window.Close()
運行結果如下:

如何更加完美
程式現在已經按照我們的意思完美運行,但是在計算完一道題目後,如何將這些已經填入的數據和計算的數據清空呢?
這時候就可以使用 '清除' 按鈕了
程式碼如下:
import PySimpleGUI as sg layout = [[sg.Text("加法器")], [sg.InputText(do_not_clear=True, key="_SHU1_"), sg.Text("+"), sg.InputText(do_not_clear=True, key="_SHU2_"),sg.Text("="), sg.Text("", key="_RESULT_")], [sg.Button("計算"),sg.Button("清空"), sg.Button("退出")]] window = sg.Window("加法器").Layout(layout) while True: button, values = window.Read() if button is None or button == "退出": break elif button=="清空": window.FindElement("_SHU1_").Update("") window.FindElement("_SHU2_").Update("") window.FindElement("_RESULT_").Update("") else: tmp_a = eval(values["_SHU1_"]) tmp_b = eval(values["_SHU2_"]) tmp_result = tmp_a+tmp_b window.FindElement("_RESULT_").Update(str(tmp_result)) window.Close()
仔細觀察上述程式碼,你會發現許多不同的地方,尤其是返回值的引用,如果你沒有按照上述程式碼來運行,只是更新一下原來的程式碼的話,會報出一個KeyError,這就是引入了關鍵字key後的一個小變化。
