摘要:上機實踐課程開始了嗯,老師來了之后念了下,然后說開始做吧然后就開始了的之路,以前沒接觸過的可視化界面雖然這樣很不明智但是現(xiàn)在做起來感覺寫小工具還挺方便的,當時搜到的第一個庫便是就直接開始寫了后來發(fā)現(xiàn)很不錯的樣子,下個實驗就用吧然后關(guān)于計算器
上機實踐課程開始了,嗯,老師來了之后念了下PPT,然后說:開始做吧.........
然后就開始了Python的GUI之路,以前沒接觸過PYthon的可視化界面(雖然這樣很不明智)
但是現(xiàn)在做起來感覺寫小工具還挺方便的,當時搜到的第一個庫便是Tkinter就直接開始寫了
后來發(fā)現(xiàn)QT很不錯的樣子,下個實驗就用QT吧.然后關(guān)于Tkinter(python3.6)
計算器源碼 ennn.....有的命名不規(guī)范.......
首先對于python中棧的實現(xiàn)是通過list的方式模擬開始一個窗口
pop()出棧,append()入棧
做一個可視化的東西,首先想到的坑定是窗口吧
窗口又有很多構(gòu)成,比如title,ico,size,bd,菜單等.
import tkinter import os from tkinter import * class Calculator(object): """計算器""" def __init__(self): self.tk=tkinter.Tk() #實例化 self.tk.title("計算器") self.tk.minsize(370,460) self.tk.maxsize(400,400) #也可以用self.tk.resizable(0, 0)來禁止調(diào)節(jié)大小 self.tk.iconbitmap(os.getcwd()+"/favicon.ico") def start(self): self.tk.mainloop() if __name__ == "__main__": NewCalculator=Calculator() NewCalculator.start()
這里就生成了一個基本的窗口,對于其中的mainloop()的作用
如果我們刪除它,窗口會一閃而過,它就是為了防止這種情況
做成計算器之后坑定要先是計算結(jié)果,這里就需要生成顯示面板
當然我們也會很自然地聯(lián)想到顯示內(nèi)容的字體設(shè)置等需求,具體事例在下面代碼
.... import tkinter.font as tkfont .... #字體設(shè)置 self.EntryFont=tkfont.Font(self.tk,size=13) self.ButtonFont=tkfont.Font(self.tk,size=12) #面板顯示 self.count=tkinter.StringVar() self.count.set("0") self.label=tkinter.Label(self.tk,bg="#EEE9E9",bd="3",fg="black",anchor="center",font=self.EntryFont,textvariable=self.count) self.label.place(y=10,width=380,height=40) ....
其中tkinter中面板Lable有一些參數(shù),這里用到的基本上也可以滿足常見的需求了
其中bg是背景色,fg是前景色,改變內(nèi)容的顏色,anchor是定位內(nèi)容在面板中的位置,如下圖
方向 | 示例 | 表格 |
---|---|---|
nw | n | ne |
w | center | e |
sw | s | se |
關(guān)于面板以及后邊的Button的定位,可以用很多方式,place可以準確的定位,也可以用pack(),grid()
對于計算器place是更好的,能夠準確定位每一個控件
其中字體也可以直接在Lable()加參數(shù),例如font=("Arial,6")
textvariable相當于“監(jiān)聽”的作用,綁定tkinter中的string,就可以用set()的方式方便的改變面板的內(nèi)容
按鈕,輸入框的參數(shù)和面板里面的是相似的
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg="#EE6A50",text=self.ButtonList[0], font=self.ButtonFont,command=self.clear) self.NumButton.place(x=30,y=80,width=70,height=55) self.shiEntry=Entry(self.baoxianTk,validate="key",validatecommand=(self.checkNum,"%P"),font=self.EntryFont) self.shiEntry.place(x=190,y=80)
一樣的是通過bg等參數(shù)設(shè)置基礎(chǔ)的樣式,只不過這里會通過command綁定事件,類似于JQ中的.click
這里的place也是為了能夠準確定位才使用的,其中的relief代表著Button的樣式
relief=FLAT or GROOVE or RAISED or RIDGE or SOLID or SUNKEN
其中刪除輸入框的輸入內(nèi)容
text.delete(10) #刪除索引值為10的值 text.delete(10, 20) #刪除索引值從10到20之前的值 text.insert(0, END) #刪除所有值輸入限制
在設(shè)計功能的時候我們可能需要用戶輸入數(shù)字等,這里可以進行限制一下
Button參數(shù)中validate指定什么時候執(zhí)行validatecommand綁定的函數(shù),使用%P可以實時獲取輸入的內(nèi)容
當validate選項指定為key的時候,有任何的輸入操作都會被攔截,這個時候返回True白能量才會輸入到Entry
self.checkNum=self.baoxianTk.register(self.validateNum) self.gerenEntry=Entry(self.baoxianTk,validate="key",validatecommand=(self.checkNum,"%P"),font=self.EntryFont) self.gerenEntry.place(x=190,y=190) #驗證是否輸入數(shù)字 def validateNum(self,content): if content.isdigit() and int(content)>=0 or content=="": return True else: return False
validateNum()函數(shù)可以根據(jù)自己的需求進行更改
啟用驗證validate選項可以設(shè)置的值有:
名稱 | 事件 |
---|---|
focus | 當 Entry 組件獲得或失去焦點的時候驗證 |
focusin | 當 Entry 組件獲得焦點的時候驗證 |
focusout | 當 Entry 組件失去焦點的時候驗證 |
key | 當輸入框被編輯的時候驗證 |
all | 當出現(xiàn)上邊任何一種情況的時候驗證 |
這個小計算器中我增加了%,/,sqrt三個符號
對于他們的實現(xiàn)我的思路是添加到面板之前檢測一下傳入的button內(nèi)容
如果是這三種符號則做出對應(yīng)的處理
其中需要注意如果是多位數(shù)或者帶有符號式子
不能直接進行變換,需要判斷你要轉(zhuǎn)置的數(shù)字的位數(shù),我的具體方式如下
def checkList(self): result=0 locate=-1 listSum=0 for length in range(0,len(self.inputlist)): if re.findall(r"[-+*/]",str(self.inputlist[length])): result=1 if length>locate: locate=length else: pass if result==1: for i in range(locate+1,len(self.inputlist)): listSum+=int(self.inputlist[i])*(10**(len(self.inputlist)-i-1)) else: for j in range(0,len(self.inputlist)): listSum+=int(self.inputlist[j])*(10**(len(self.inputlist)-j-1)) return listSum,locate #添加button def addButton(self,button): if button==self.ButtonList[18]: listSum,locate=self.checkList() if locate==-1: self.inputlist=[str(round(eval("1/"+str(listSum)),5))] else: for k in range(locate+1,len(self.inputlist)): del self.inputlist[k] self.inputlist.append(str(round(eval("1/"+str(listSum)),5))) elif button==self.ButtonList[19]: pass elif button==self.ButtonList[20]: pass else: self.inputlist.append(button) self.count.set(self.inputlist)關(guān)于lambda
百度百科:Lambda表達式是Python中一類特殊的定義函數(shù)的形式,使用它可以定義一個匿名函數(shù)
與其它語言不同,Python的Lambda表達式的函數(shù)體只能有唯一的一條語句,也就是返回值表達式語句
搜索更多文章后理解更多,Lambda函數(shù)可以說是對按鈕起到“call back”的作用
如果我們不使用Lambda進行中間函數(shù)的延遲回調(diào),在創(chuàng)建按鈕的同時command綁定的函數(shù)會被調(diào)用
即如下面兩句代碼的區(qū)別,第二句在進行創(chuàng)建時會直接執(zhí)行knobDown函數(shù)
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg="#BFEFFF",text=self.ButtonList[20], font=self.ButtonFont,command=lambda:self.knobDown(self.ButtonList[20])) self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg="#BFEFFF",text=self.ButtonList[20], font=self.ButtonFont,command=self.knobDown(self.ButtonList[20]))
更詳細的解釋可以參考文末最后兩個文章,還是前輩寫得好關(guān)于單選框
本來想實現(xiàn)PPT中給出的示例-房貸計算的拓展,但是一直這個單選框產(chǎn)生BUG就放棄了
下面的示例是從網(wǎng)上摘抄過來的,具體的網(wǎng)址忘了
就是通過variable綁定一個IntVar(),通過.get()方式可以獲取Radiobutton中value的值
#!/usr/bin/env python import tkinter from tkinter import * import tkinter.font as tkfont root=tkinter.Tk() val=tkinter.IntVar() val.set(0) def func1(): if val.get() == 0: label.configure(text="radio 0") else: label.configure(text="radio 1") label = tkinter.Label(root, text="radio 0") label.pack() r0 = tkinter.Radiobutton(text = "radio0", variable = val, value = 0) r0.pack() r1 = tkinter.Radiobutton(text = "radio1", variable = val, value = 1) r1.pack() b = tkinter.Button(root, text="button", command=func1) b.pack() root.mainloop()打包
C:UsersayiDesktopshiyanprogrem (venv) λ pip install pyinstaller C:UsersayiDesktopshiyanprogrem (venv) λ pyinstaller -F -w -i favicon.ico run.py
一開始因為代碼中的設(shè)置ico圖標為下面代碼第一行
windows下打包路徑識別有問題,把圖標換到一個路徑短的地方
修改成絕對路徑就OK了(下面代碼第二行,exe和ico要放在同一個目錄下
self.baoxianTk.icobitmap("favicon.ico") self.baoxianTk.iconbitmap(os.getcwd()+"/favicon.ico")效果預(yù)覽
雖然是現(xiàn)學(xué)現(xiàn)賣和對于別人的老知識,但是成功之后還是挺有成就感的(and我似乎對美工要求挑剔........
調(diào)顏色和樣式能挑半天,包括以前的那個爬蟲的前端
參考:Tkinter控件詳解
Python數(shù)據(jù)結(jié)構(gòu)——棧
創(chuàng)建一個只能輸入數(shù)字的輸入框
Tkinter教程之Entry篇
另一個Lambda表達式教程
《Python編程》筆記(七)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41076.html
摘要:在這個窗口之上,可以添加各種輸入框按鈕文本等,可以增加對各種動作的處理。事件要與特定的控件相綁定,比如按鈕有點擊事件,輸入框有按鍵事件,窗體有關(guān)閉事件等。 在大多數(shù)時候,我們都在黑黢黢的控制臺里執(zhí)行 Python 腳本。這看起來很酷很 GEEK。但對于部分場景下的用戶來說,這樣就不大美觀和人性化了:我們需要交互更方便的圖形化產(chǎn)品,也就是 GUI (圖形用戶界面,Graphical Us...
導(dǎo)語?? 哈嘍!我是木木子,今天又想我了嘛? 之前不是出過一期Python美顏相機嘛?不知道你們還記得不?這一期的話話題還是圍繞上期關(guān)于顏值方面來走。 還是原來的配方,還是原來的味道。 偶爾有女生或者說男生都有過這樣的經(jīng)歷,偶然照鏡子的時候覺得自己美、帥到爆炸?!拘【幋蛩啦粫姓J的.jpg】 ? 但打開無美顏的前置攝像頭無濾鏡,或者看到真正的漂亮小姐姐,又會感慨自己怎么能這么丑! ? 顏值打分其...
摘要:老蔣在前面的老牌免費開源遠程客戶端軟件文章中有介紹到作為一款老牌免費的遠程連接工具我們很多運維工程師也都有使用過。我個人覺得是目前在系統(tǒng)中體驗較高顏值較好的免費客戶端軟件。在安裝過程中,我們選擇學(xué)校個人用戶,這個是免費資格的。老蔣在前面的PuTTY – 老牌免費開源Windows SSH遠程客戶端軟件文章中有介紹到Putty作為一款老牌免費的SSH遠程連接工具我們很多運維工程師也...
閱讀 2087·2021-09-29 09:35
閱讀 692·2021-09-08 09:36
閱讀 3400·2021-09-03 10:30
閱讀 2118·2019-08-30 14:21
閱讀 2915·2019-08-30 11:18
閱讀 3319·2019-08-29 17:31
閱讀 3147·2019-08-29 17:29
閱讀 1314·2019-08-29 17:13