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