python顯示小數點后幾位數_python窗口編程-3:數位處理(整數)

我們在上一次課程中(python窗口編程-2:風格與布局 ),制作了完整的計算器窗口界面,只是那個窗口沒有真正的功能,是點擊任何按鈕都會關閉。這一次,我們加入一些事件處理的功能,讓它成為一個正常工作的窗口程序,并具備與普通的計算器一樣的輸入數字的操作能力。

a36f127545327f69b99812c8c6037c68.png

事件處理的無限循環

為了避免點擊按鈕會關閉窗口,我們引入無限循環的事件處理:

while True:                                     event, values = window.read()     if event==sg.WIN_CLOSED:        breakwindow.close()

使用這個代碼,替換上次課程最后的兩行代碼。我們會看到,現在只有點擊窗口右上角的“X”才能關閉窗口,點擊其它的按鈕雖然沒有反應,但不會導致窗口的關閉了。

sg.WIN_CLOSED代表關閉窗口的按鈕值,實際是None,但這樣表達增強了代碼的健壯性。如果有一天PySimpleGUI的新升級版決定修改關閉窗口的按鈕值,我們的代碼無須做任何修改(理應如此)。

凡是有無限循環的地方,都必須有退出循環的機制,否則程序無法終止。那將是一個很不友善的用戶體驗。這里的break語句,作用就是退出循環。

break不但用于while循環,也可以用于for循環。當遍歷搜索一個數據時,找到數據并且無須繼續搜索時,就可以用break退出循環。

數字鍵的處理

當按鈕為數字的時候,我們這樣表示

event in [str(i) for i in range(0,10)]:

這里又用到了列表生成式,我們在編程基礎的課程中講過(python語言基礎-10:編程是一種藝術 ),含義是當事件為‘0’到‘9’幾個數字的時候。

需求分析

很多軟件產品的開發,并沒有細致的需求描述,而是提供了一個參考原型。即:這個功能參考XXX進行開發。比如我們的計算器,按下按鈕的反應究竟應該是怎樣,來自對真實計算器的模擬。我們第一步的需求,只實現正常的數字輸入功能。

7d877a39d1aa0ba96f6a6c8e59fc6bd8.gif

計算器的操作,對很多朋友來說是很熟悉也很自然的。最好的操作界面設計,就應該是自然的,讓用戶無須培訓,就能自然使用。我們用語言來描述一下。

  1. 計算器的輸出框,永遠不會是空白,它的默認狀態就是一個0后面跟一個小數點。
  2. 輸入數字,就開始增加整數的位數,但首位不會是0。
  3. 輸入小數點,顯示不會立刻改變,但后面再輸入數字,就變成了小數的位,末尾可以是0。

本節課程,只實現前兩個功能(的一部分)。

整數數位邏輯

為了實現功能2,讓我們看一下基本的整數位邏輯。新輸入的數字會改變原有數字的含義。新的數字占據個位,原來的個位變成十位,原來十位變成百位,依此類推。這個操作,在編程中,用一個簡單的模式來表現:

Value= Value* 10+ NewDigit

程序語言,真的是一種語言,一句代碼,就能把這個操作邏輯描述得清清楚楚。能夠看懂并理解程序語言,這就是掌握編程的開始。

內部值與顯示值的分離

我們注意到,計算器的顯示,是數字后面跟著一個小數點。正常的數字轉字符串不是這樣的效果,我們必須人為地在后面添加一個小數點。

ShowStr= str(Value)+'.'

在這種操作邏輯下,將內部計算用的值與顯示的效果分開是好的。它的好處體現在控制了復雜性的規模。編程活動不創造有形的物質,它的價值就在于控制復雜性。

更加明確的說,好的編程者的能力就體現在開發代碼的全過程中始終把復雜性規模維持在自己能夠控制的范圍之內,并以此實現整體看起來相當復雜的功能邏輯

(這里對比一下,交易的價值就在于控制風險。優秀的交易者,能夠把交易風險限制在自己能夠控制的范圍之內,并以此為基礎承擔一般人整體看起來相當大的風險,從而獲得風險利益。)

控制復雜性規模的一個方法,就是將可以分開的功能盡量分開。我們可以集中注意力思考如何通過按鈕事件對內部值的改變時,可以不考慮顯示的問題。而在處理顯示的時候,只需集中注意力考慮它的靜態狀態,不用考慮它的變化。

(這與打仗的原理是一樣的,在局部集中優勢兵力對敵。)

最后貼一下局部實現的代碼

value= 0while True:                                     event, values = window.read()     if event==sg.WIN_CLOSED:        break    if event == 'C':        value= 0    elif event == '±':        value= -value    elif event in [str(i) for i in range(0,10)]:        value= value* 10+ int(event)    info= str(value)+'.'    info=info[-12:]    window['show'].update(info)window.close()

這里還有幾個小的處理邏輯

  • C按鈕的處理,直接將內部值設置為0
  • ±按鈕的處理,內部值正負切換
  • 為了美觀起見,數字的顯示只保留最后的12位
  • 改變文本框的顯示,用update函數,它提供了窗口界面的輸出功能。
  • 文本框的定位,用了它的名字(key),這里的key與前面課程中講的key,功能含義完全不同,別弄混了。同名不同含義的問題,在自然語言和編程語言中都大量存在,這經常是引起各種混淆和爭論的起因。我們從一開始就應當給予足夠的重視。

課程小結

本節課程,介紹了如何開發一個真正的窗口應用,在窗口中響應輸入,顯示輸出,完全脫離控制臺的黑窗口。并講了數位處理的基本邏輯,這在數學編程中是很常用的。

簡單介紹了通過功能分離來控制編程復雜性的方法,控制復雜性將是貫穿編程的學習和實踐的全過程,后面還會經常講到。

朋友們可以自行嘗試一下如何實現小數,下一次課程中再解說。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272082.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux文件目錄基礎筆記

1、進入目錄名稱:cdcd命令主要是方便用戶切換到不同目錄的指令。比如:cd #只執行cd命令默認進入root的根目錄cd /home #進入home目錄,如果home目錄有testdir目錄的話,可以執行 cd testdir 進入testdir目錄。2、創建目錄命令&#…

eclipse安卓工程的構建、配置連接模擬器、安卓工程結構介紹

安卓工程構建及第一個安卓程序運行: 首先新建安卓工程: 然后填寫APP信息,下面的包名一般都是公司域名的倒寫,包名中不能有中文,否則會報錯。 然后配置一些安卓app的選項 有關app啟動的圖標(就像QQ的企鵝一…

android eclipse 導入idea項目

將以下代碼復制到.project中 <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>IDEATest</name> <comment/> <projects/> <buildSpec> <buildCommand> <name>com.android.ide.…

Linux中su和sudo的用法整理

一、為什么會有su和sudo命令&#xff1f;主要是因為在實際工作當中需要在Linux不同用戶之間進行切換。root用戶權限最高很多時候需要root用戶才能執行一些關鍵命令。所以需要臨時切換為root用戶。工作完成后&#xff0c;考慮到系統的安全性避免誤操作需要切換為普通用戶。su和s…

codeforces 650B - Image Preview

題意&#xff1a;給你n個照片&#xff0c;從第一個照片開始看&#xff0c;如果一張照片是w&#xff0c;那么要花費b時間去反轉他&#xff0c;否則不用反轉&#xff0c;看一張從來沒看過的照片要1時間&#xff0c; 從一張滑動到另一張要a時間。如果一張照片看過&#xff0c;則不…

asp js單步調試_如何使用Chrome的控制臺高效的調試Javascript代碼?

引言在我們的日常開發中我們常常會遇到JavaScript的調試問題&#xff0c;而我們解決問題的傳統解決方案就是使用大量的console.log或者console對象的其他方法&#xff0c;這會給我們帶來很多不便&#xff0c;特別是遇到復雜問題的時候&#xff0c;可能會出現大量的console.log&…

安卓App的啟動過程、安卓布局分類及布局和頁面的關系

Android App 啟動流程: 當你想要啟動一個app時&#xff0c;首先得點擊該app桌面圖標。那點擊圖標時到底發生了什么呢&#xff1f;先看個理論知識 .Launcher: launcher其實就是一個app&#xff0c;從功能上說&#xff0c;是對手機上其他app的一個管理和啟動&#xff0c;從代碼…

Linux文件默認權限和umask筆記

關于Linux文件默認權限的問題&#xff0c;可以實際先嘗試一下如下命令&#xff1a;root用戶登錄[rootlocalhost test]# touch file1[rootlocalhost test]# ls-l file1-rw-r--r-- 1 root root 0 May 5 08:28 file1 #輸出結果 對應的數字權限 644[rootlocalhost test]# touch fi…

Android相對布局(RelativeLayout)常用屬性、練習使用按鍵、文本框等控件、線性布局(LinearLayout)屬性

RelativeLayout中子控件常用屬性&#xff1a; 子控件默認是從父控件的左上角開始排列的 相對于父控件 android:layout_alignParentTop"true" 和父控件的頂部對齊android:layout_alignParentBottom"true" 和父控件的底部對齊android:layout_alignPar…

Seata AT模式

基本思路 先決條件 支持本地ACID事務的關系數據庫。通過JDBC訪問數據庫的Java應用程序。 整體機制 從兩個階段提交協議的演變&#xff1a; 階段1&#xff1a;在同一本地事務中提交業務數據和回滾日志&#xff0c;然后釋放本地鎖和連接資源。階段2&#xff1a; 對于提交情況…

自媒體各大平臺收益對比_哪些自媒體平臺沒有新手期,適合小白擼收益?

2-26把我設置為星標&#xff0c;不錯過每一次的干貨&#xff5e;各大自媒體平臺的新手期總是讓小白們望而卻步&#xff0c;特別是百家號審核非常嚴格&#xff0c;如果沒思路、沒人指導&#xff0c;過新手有難度。不過&#xff0c;還是有很多平臺對新手寶寶很友好&#xff0c;沒…

Linux關于文件的權限筆記

1、調整文件的權限命令&#xff1a;chmodLinux的每個文件都定義了文件的擁有者&#xff1a;u(user)、擁有組&#xff1a;g&#xff08;group&#xff09;、其他人&#xff1a;o&#xff08;others&#xff09;權限&#xff0c;對應的權限用rwx的組合來定義。使用chmod命令&…

presentViewController和pushViewController

iPhone開發中從一個視圖跳到另一個視圖有三種方法&#xff1a;1、self.view addSubView:view 、self.window addSubView,需要注意的是&#xff0c;這個方法只是把頁面加在當前頁面。此時在用self.navigationControler.pushViewController和 pushViewController 是不行的。要想使…

啟動rrt什么意思_python學習第144課--創建虛擬機、設置虛擬機參數以及啟動虛擬機...

【每天幾分鐘&#xff0c;從零入門python編程的世界&#xff01;】上節我們介紹了下載虛擬機以及centOS的相關事項&#xff0c;現在我們創建虛擬機。●創建虛擬機安裝好virtualbox之后&#xff0c;我們點擊Oracle VM VirtualBox打開管理器&#xff0c;界面如下圖&#xff1a;你…

Android按鍵響應的幾種方式、安卓頁面的跳轉、頁面跳轉傳參、頁面自動跳轉、Activity(頁面)的生命周期

按鍵響應的第一種方式&#xff1a; 在XML文件里面設置按鍵的onClick綁定函數。就像下面的代碼&#xff0c;給Button設置onClick屬性&#xff0c;在按鍵被按下的時候&#xff0c;會調用java文件里面的onClickbtton1這個函數&#xff0c;因為現已將它和這個按鈕進行了綁定。利用…

pycharm體驗

查看python版本 退出 exit()

Linux文本檢索命令grep筆記

grep是在linux系統中基于行文本非常實用檢索工具&#xff0c;通過該命令可以將匹配到的結果信息輸出到終端控制臺。語法格式&#xff1a;grep [-ivnc] 需要匹配的內容 文件名常用參數說明&#xff1a;-i 檢索的時候不區分大小寫-c 檢索到的匹配行數-n 檢索到的匹配行顯式具體的…

-生成樹的相關問題

瓶頸生成樹 無向圖G的一顆瓶頸生成樹(bottleneck spanning tree)。T是這樣的一顆生成樹&#xff0c;它最大的邊權值在G的所有生成樹中是最小的。瓶頸生成樹的值為T中最大權值邊的權。 即生成樹中最長邊最短的樹。 無向圖的最小生成樹一定是瓶頸生成樹&#xff0c;但瓶頸生成樹不…