[PySimpleGUI界面學習](四)動態更新窗口控件上的文字

回顧

上一篇文章在最後實戰了一個小程序,這個小程序的功能是實現兩數相加並將結果顯示在命令窗口,目前看來,這當然只是一個過渡產品,界面編程的要求是要將所有數據在界面上表現出來,這樣不僅僅出於一致性的考慮,更重要的是,這是界面編程的意義所在。

為了方便起見,現將上一篇教程中的代碼抄錄如下:

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後的一個小變化。