python jupter输入文字行_少儿Python编程_第十六讲:图形界面开发
運行在計算機上的程序一般分為命令行程序和圖形界面程序,例如:安裝Python三方模塊的pip命令,軟件版本管理的git命令等都屬于命令行程序;而大多數軟件使用圖形界面,例如Windows的Word,Excel,畫圖等等軟件都是圖形化用戶界面,簡稱GUI。
在圖形化用戶界面中,用戶可以用鼠標操作菜單、按鈕等圖形化組件,并從對話框等圖型化組件中獲取信息。實現圖形化界面的方法與制作游戲界面的流程相似:在初始化工具之后,進入主循環接收用戶事件,并且進行顯示、反饋等處理,直到程序退出,才結束主循環。與繪制游戲界面不同的是,游戲界面中的繪圖、處理鼠標事件都需要開發者寫程序自行處理,而圖形用戶界面內部已經實現了按鈕、文本框的繪制和響應事件,使用時調用這些控件即可,減少了編寫程序的工作量。
圖形界面在任何編程語言中原理都一樣,本講通過Python圖形界面編程,介紹圖形界面中的基本概念和簡單用法:常用控件、布局方法、事件處理。
16.1 圖形界面入門
Python的圖形用戶界面常使用Tkinter開發,Tcl 是“工具控制語言”的縮寫。Tk是Tcl“圖形工具箱”的擴展,而Tkinter是Tk interface的縮寫,意思是TK界面。
在Windows系統中Tkinter已由Anaconda安裝,可以直接使用,在Linux下則需要使用apt安裝python3-tk軟件包。
16.1.1 基本概念
在學習具體編程之前,先了解一些基本概念。
1.控件
控件也叫組件,是圖形用戶界面中最基本的組成部分,常用的控件有:按鈕、文本框、標簽、表格等等。
2.容器
容器是一種特殊的控件,它能容納其它控件,如窗口、對話框都屬于容器。
3.布局
布局是控制控件在容器中的大小和位置的方法。
4.事件處理
事件是可以被程序識別的操作,如:按下按鈕,選擇某個單選按鈕或者復選框,關閉程序等等,開發者往往需要對事件做出處理,響應某個事件的函數就是事件處理程序,也被稱為回調函數。
16.1.2程序示例
下例是一個簡單的圖形界面程序,它創建窗口。并在窗口中顯示兩行文字“test1”和“test2”。
01 import tkinter 02 03 win = tkinter.Tk() 04 win.geometry("320x240+200+50") 05 tx1 = tkinter.Label(win, text="test1") 06 tx1.pack() 07 tx2 = tkinter.Label(win, text="test2") 08 tx2.pack() 09 win.mainloop()第01行引入tkinter模塊。
第03行創建一個實例,用于顯示窗口。
第04行設置窗口大小為:寬度320,高度240,位置在屏幕橫坐標200,縱坐標50。
第05行創建標簽控件tx1用于顯示文字,Label函數有兩個參數,第一個參數指定控件所在的容器,第二個參數text指定標簽上顯示的文字。
第06行將控件放置在容器之中,pack是布局的一種方法,將在之后的“布局”部分詳細介紹。
第07-08行創建和放置了第二個標簽tx2。
第09行開啟主循環,在窗口關閉時主循環退出,程序結束。
程序運行結果如圖16.1所示:
16.1 簡單的圖形用戶界面16.2 布局
布局是把控件放置到容器之中,并且指定放在哪里,以及如何放置。Tkinter有3種基本布局管理器:pack、grid和place,還提供容器Frame支持復雜的嵌套布局。
16.2.1 常用布局方法
1. pack布局
pack是最常用的布局方法——順序布局,用于按順序添加各個控件,上例中使用pack分別添加了兩個文字標簽,可以看到控件按添加的順序依次顯示在窗口中。圖16.2分別展示了橫向和縱向順序布局的方法。
圖16.2 pack布局示意圖其基本語法如下:
01 控件名.pack(可選參數)布局的可選參數如表16.1所示:
表16.1 布局參數表2.grid布局
grid按網格擺放控件,如圖16.3所示,其中每個控件的位置都由行索引row和列索引colomn兩個值確定,索引號從0開始(不是1),如左上角的控件1行列為0,0;控件2行列為0,1,以此類推。
圖16.3 grid布局示意圖其基本語法如下,該函數也支持表16.1中的參數。
01 控件名.grid(row=行索引, column=列索引,可選參數)3.place布局
place按具體坐標擺放控件。如圖16.4所示,用x1,y1設置控件1左上角的位置。
圖16.4 place布局示意圖其基本用法如下,該函數也支持表16.1中的參數。
01 控件名.place(x=橫坐標, y=縱坐標,可選參數)16.2.2 容器布局
當界面設計比較復雜時,一般使用Frame容器實現布局。Frame譯為框架,它是一種容器,容器是可以包含其它控件的特殊控件。圖16.5在同一窗口中加入了11個控件,包含順序和網格兩種布局方法,實現此界面,需要建立兩個frame容器,一個容器為深色背景,用于存放控件1和控件2,另一個容器為淺灰色背景,用于存放其它網絡布局的控件。Frame本身也是控件,兩個frame控件也使用了順序布局。
圖16.5 frame容器示意圖其基本語法如下。
01 f= Frame(父容器,可選參數)以上程序創建了容器f,之后可以將其它控件加入該容器。“父/子”用于描述容器和控件之間的關系,通常將包含其它控件的容器稱為“父”,而被包含的控件被稱為“子”。
16.2.3 綜合實例
本例中使用了pack、grid、place、frame多種方法布局界面。
01 import tkinter 02 03 win = tkinter.Tk() 04 win.geometry("320x240+200+50") 05 06 f1 = tkinter.Frame(win) 07 f1.pack() 08 f2 = tkinter.Frame(win) 09 f2.pack() 10 11 tx1 = tkinter.Label(f1, text="test1") 12 tx1.grid(row=0,column=0) 13 tx2 = tkinter.Label(f1, text="test2") 14 tx2.grid(row=1,column=1) 15 tx3 = tkinter.Label(f2, text="test3") 16 tx3.pack() 17 tx4 = tkinter.Label(win, text="test4") 18 tx4.place(x=10,y=10) 19 20 win.mainloop()第01-04行用于引入模塊和創建窗口。
第06行創建容器f1,并指定其父容器為窗口。
第07行用pack方法將容器以順序方式布局。
第08-09行建立并加入了第二個容器f2。
第11行創建標簽控件tx1,設置其父容器為f1。
第12行用網格方式布局tx1顯示在網格的第0行0列。
第13-14行創建標簽控件tx2,并以網格方式布局tx2顯示在網格的第1行1列。
第15行創建標簽tx3,設置其父容器為f2。
第16行用順序方式將控件tx3布局到其父容器中。
第17行創建標簽tx4,設置其父容器為窗口win。
第18行用指定具體位置的方式將控件布局到窗口的坐標為(10,10)位置上。
第20行開啟主循環,在窗口關閉時主循環退出,程序結束。
程序運行結果如圖16.7所示,其中深灰色部分為容器f2,淺灰色部分為容器f1,它們大小不同是由于容器大小等于其子控件大小。f1中子控件更多,因此區域更大。
圖16.6 布局綜合實例運行結果16.3 控件
Tkinter除了標簽控件Label,還支持很多其它控件,本節將介紹最為常用的:按鈕、輸入框、選擇框、以及顯示圖片的控件。
16.3.1 常用控件
1.標簽
標簽控件用于顯示文字或者圖片,定義方法如下:
01 tkinter.Label(父容器, [可選參數])控件常用的可選參數如表16.2所示:
表16.2 控件常用參數2.按鈕
按鈕控件是最常用的控件,例如對話框中的“確定”、“取消”都用按鈕控件實現。定義方法如下:
01 tkinter.Button(父容器, [可選參數])3.輸入框
輸入框顯示為矩形框,供用戶輸入信息使用。定義方法如下:
01 tkinter.Entry(父容器, [可選參數])4.選擇框
一般情況下,選擇框前面是一個矩形方框,后面跟隨說明文字,例如:讓用戶選擇“婚否”,結婚則在矩形方框中打鉤,否則留空。定義方法如下:
01 tkinter.Checkbutton(父容器, [可選參數])5.圖片
圖片不直接作為控件使用,而是作為標簽或者其它控件的背景,如果不設置標簽文字,只設置其背景圖片,則該標簽是一個圖片標簽。圖片的加載方法如下:
01 tkinter.PhotoImage(file=圖片路徑)圖片加載后,可放在控件的可選參數image中使用。
16.3.2 獲取和設置控件的屬性
屬性指的是控件的性質,一般在創建控件時指定,如:控件的寬度width,高度height等,查看控件的屬性方法類似于訪問字典,具體方法如下:
01 控件變量名[屬性名]使用configure方法可以重新設置控件屬性值,使用方法如下:
01 控件變量名.configure(屬性名=屬性值)下例是操作屬性的實際應用:
01 x = tkinter.Label(win, text=”abcd”) 02 print(x[‘text’]) 03 x.configure(text=’efg’)第01行建立了標簽控件,并設置標簽顯示的文字:text屬性為“abcd”。
第02行顯示出控件變量x的text屬性。
第03行修改控件變量x的text屬性為“efg”。
16.3.3 綜合實例
下面通過綜合實例,進一步鞏固本節中介紹的各個控件的用法。
01 import tkinter 02 03 win = tkinter.Tk() 04 label = tkinter.Label(win,text="請填表") # 創建文字標簽控件 05 label.pack() 06 img = tkinter.PhotoImage(file='bird.png') # 加載圖片 07 label_img = tkinter.Label(win,image=img) # 創建圖片標簽控件 08 label_img.pack() 09 entry = tkinter.Entry(win) # 創建輸入框控件 10 entry.pack() 11 check = tkinter.Checkbutton(win,text="婚否") # 創建選擇框控件 12 check.pack(anchor='w') 13 button = tkinter.Button(win, text="退出") # 創建按鈕控件 14 button.pack() 15 win.mainloop()程序運行結果如圖16.7所示:
16.7 控件綜合實例運行結果課后練習:(練習答案見本講最后的小結部分)
練習一:繪制如圖16.8所示的計算器界面,其中上方用Label顯示輸入數值和計算結果,下方提供12個按鈕用于輸入數字和符號。
圖16.8 計算器效果圖16.4 事件處理
程序需要接收用戶操作,并進行反饋。用戶操作和系統發來的信息統稱事件,事件又分為兩種,一種是與整個窗口相關的事件,比如關閉窗口,另一種是與單個控件相關的事件,比如按下按鈕Button產生的事件。
16.4.1 控件事件處理
在創建按鈕時,可通過command參數設置當按鈕按下時調用的函數,即事件響應函數,用法如下例所示:
01 def do_1(): 02 print("按下1") 03 04 bt=tkinter.Button(win, text='1',command=do_1) 05 bt.pack()第01-02行定義了事件的響應函數do_1,并在函數中顯示字符串“按下1”。
第04行創建按鈕控件,并指定按下按鈕時調用函數do_1(注意:本行do_1函數并未被調用)。
16.4.2 窗口事件處理
在創建按鈕時,可通過protocol設置窗口相關事件的響應函數。下例為設置窗口關閉事件,在窗口關閉時自動調用fun1函數。
01 import tkinter 02 03 def func1(): 04 print("關閉窗口") 05 win.destroy() 06 07 win = tkinter.Tk() 08 win.geometry("400x400+200+50") 09 win.protocol("WM_DELETE_WINDOW",func1) 10 11 win.mainloop()第03行定義事件響應函數fun1。
第04行顯示字符串"關閉窗口"。
第05行調用窗口的destroy方法銷毀窗口。
第09行設置在窗口關閉時調用自定義函數fun1,即關聯事件和響應函數。
課后練習:
練習二:繼續完成上題中計算器程序,響應用戶按下各個按鈕的事件,更新Label顯示算式,在用戶按下”=”按鈕時,計算算式結果。
(提示:Python的eval函數用于執行字符串表達式,例如eval(“1+2”)的結果為3;十二個按鈕功能類似,建議先將其中一兩個按鈕調試正常后,用復制粘貼的方法實現其它按鈕,以免在調試過程中反復修改)。
16.5 思維訓練
16.5.1 眼中的世界
人們對客觀事物比如什么是一、二、三、花、草、樹木有著類似的理解,有了這些共識,可以通過語言來溝通;這也讓我們誤認為,每個人眼中的世界都是相同的。
然而,“一千個讀者眼里有一千個哈姆雷特”,不僅是故事,人們對單個文字的理解也不盡相同。對于什么是“愛”,什么是“道德”,這些并非具體可見的事物,由于文化和經歷不同,大家的理解也不盡相同,越是不能用語言描述的感覺,差異可能越大。
為什么有些笑話,只有大人才覺得有趣,因為孩子并不知道很多語言的二義性以及背后的引申含義,藝術家激活了大家擁有的共同體驗,它們又往往是不可言喻的。引領著讀者的思維在具體文字圖像和感覺之間跳躍。
語言是一種抽象的符號,是人們交流的工具,卻不是現實或思維本身。任何事物或者詞匯的意義都取決于它與其它事物的關系,從而形成了腦中復雜的關系網絡,而不是簡單的字典上的定義。
16.5.2 用語言思考
在表達的過程中,思維本身也在變化,表達過程中可能創造出一些新的想法,這就是“用語言思考”。對于復雜的內容,無法用語言描述它的所有細節,在表達的過程中,必然經過提煉和簡化,這也重構了思維狀態。因此,有時候向別人提問的過程中,自己就找到了答案。
語言的結構以鏈式為主,而思維內部一般是網狀連接,描述過程是將一團相互糾纏的細網拆解成為一條主鏈。當一個人用語言的標號代替一套復雜的結構,就可能建立和處理更加復雜的內容。想要利用語言在他人腦中重建自己腦中的思維結構,必須掌握網狀和鏈狀結構相互轉換的能力,同時還要了解大家頭腦中的“共識”。
比如寫一部小說或者電影的觀后感就是一種總結和梳理,從文章的內容和結構上也能看到寫作者的思路和關注點。練習作文或者寫程序,不只是掌握語言本身,也是鍛煉總結、抽象的能力。這種能力必須通過不斷地書寫、修改、總結來增強。
雖然很多思維與語言無關,比如觸覺、味覺、情緒,不一定能用語言精確地表達出來,但我們仍然常用語言來思考問題,比如常常聽到小孩自言自語,成人思考問題,有時也像在腦中獨白或者與人對話,這都是語言賦予我們的思考方式。
16.5.3 語言以外的表達方式
語言是一種鏈式的表達方式,除了簡單,它還有利于推導,歸因……但是,腦中的結構往往更加復雜,比如下圖中的關系,雖然可以用語言描述,但是非常麻煩。除了各個部件之間的關系,描述時還需要考慮如何遣詞造句,這就把問題變得更加復雜。
圖16.9 關系圖流程圖,思維導圖,公式,程序,它們不僅與自然語言的語法不同,結構也不同。在不同情況下,可采用不同的表達方式,如果做數學應用題的時候也用畫圖的方法,換一種角度表達,可能描述本身就是問題的答案。
16.5.4 學習語言
霍金曾說:多寫一個公式就會嚇跑一半讀者,英國一項研究證明:數學公式不但會嚇跑普通讀者,科學家也會被公式嚇跑。這主要由于日常生活中并不經常使用公式。學習語言需要大量時間。自然語言是這樣,公式和程序語言也一樣,需要反復學習和使用才能記憶。
腦中沒有大量的存儲空間用于記憶,即使空間足夠,從海量信息之中查找也需要大量時間。因此,只有反復使用的內容才能被記住。也只有掌握了語言,才可能利用它思考和解決問題。學任何一門非母語的語言都有很大難度,甚至大多數人對母語掌握得也沒有想象中那么好,比如很少有人能駕馭小說、新聞等不同風格的文章寫作。
寫作的人將腦中的思維框架轉換成文字,并試圖在讀者腦中構建起類似的結構,其中包括著大量的常識和背景知識,比如通過故事發生的時間、地點、氛圍、故事風格,激活讀者腦中的某種場景,這些都是文字之外的信息。思維中故事的框架是多層次的網絡,而機器所識別的文字只是相對扁平的結構。
通過前幾講的學習可以看到,目前機器學習模仿寫武俠小說的能力已經非常強大,而小說的風格明顯不適合寫新聞。如果想訓練機器寫所有類型文章,則需要使用非常大量的數據訓練模型,讓它擁有基本寫作能力。然后再根據要生成的不同文章類型,定向訓練。機器有海量的存儲和算力,但不是每個人都有時間和條件作大規模的訓練。
學習自然語言也一樣,如果希望讀懂新聞,對話,科技論文,就需要非常大量的訓練,不如想看論文,就主要讀論文,當然,練習“閱讀論文”對“對話水平”提高有限。
16.6 小結
16.6.1單詞
本講需要掌握的英文單詞如表16.3所示。
表16.3本講需要掌握的英文單詞16.6.2習題答案
1.練習一:繪制如圖16.8所示的計算器界面,其中上方用Label顯示輸入數值和計算結果,下方提供12個按鈕用于輸入數字和符號。
2.練習二:繼續完成上題中計算器程序,響應用戶按下各個按鈕的事件,更新Label顯示算式,在用戶按下”=”按鈕時,計算算式結果。
01 import tkinter 02 03 win=tkinter.Tk() 04 05 f1=tkinter.Frame(win) 06 f1.pack() 07 f2=tkinter.Frame(win) 08 f2.pack() 09 10 label=tkinter.Label(f1,text="") 11 label.grid(row=0,column=0) 12 def do_1(): 13 y=label['text'] 14 x=str(1) 15 s=y+x 16 label.configure(text=s) 17 18 bt1=tkinter.Button(f2,text='1',command=do_1) 19 bt1.grid(row=1,column=0) 20 def do_2(): 21 y=label['text'] 22 x=str(2) 23 s=y+x 24 label.configure(text=s) 25 26 bt1=tkinter.Button(f2,text='2',command=do_2) 27 bt1.grid(row=1,column=1) 28 def do_3(): 29 y=label['text'] 30 x=str(3) 31 s=y+x 32 label.configure(text=s) … # 此處省略其它數字 90 btjia=tkinter.Button(f2,text='+',command=do_jiahao) 92 btjia.grid(row=4,column=1) 93 def do_dengyu(): 94 y=label['text'] 95 t=str(eval(y)) 96 label.configure(text=t) 97 98 btd=tkinter.Button(f2,text='=',command=do_dengyu) 99 btd.grid(row=4,column=2) 100 def do_jianhao(): 101 y=label['text'] 102 x=str('-') 103 s=y+x 104 label.configure(text=s) … # 此處省略乘除運算 132 win.mainloop()3.練習三:總結常見錯誤信息及其原因。
總結
以上是生活随笔為你收集整理的python jupter输入文字行_少儿Python编程_第十六讲:图形界面开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript速成
- 下一篇: python画反比例函数_拟合一个反比例