python tkinter 系列,實現計算器基本加減乘除的運算
python圖形界面,
參考電腦自帶的計算機,除去一些復雜的符號,只考慮簡單的加減乘除,設計整體的框架如下:
1)主窗口固定大小,
2)分為兩部分,frm1和frm2,frm1放置顯示框,frm2放置按鈕碼如下:
import tkinter as tk'''顯示板顯示輸出,代碼見1.2部分'''
def printout(result1, result2,frm):
'''按鈕顯示輸出,代碼見1.3部分'''
def layout_button(frm):
'''整體布局'''
def layout(root, result1, result2):frm1 = tk.Frame(root) #frm1顯示板框體frm1.config(width=320, height=100, relief='solid', highlightthickness=2, highlightbackground='red')printout(result1, result2, frm1)frm1.grid(row=0, column=0)frm1.grid_propagate(0) #固定大小不變frm2 = tk.Frame(root) #frm2按鍵板框體frm2.config(width=320, height=400, bg='#dfe9f4', relief='solid', highlightthickness=2, highlightbackground='blue')layout_button(frm2)frm2.grid(row=1, column=0)frm2.grid_propagate(0)
root = tk.Tk()
root.title("計算器1.0")
root['bg'] = '#dfe9f4'
root.geometry("320x500")result1 = tk.StringVar()
result1.set('') #上面顯示板,默認顯示空
result2 = tk.StringVar()
result2.set(0) #下面顯示板,默認顯示0root.mainloop()
新建兩個字符變量result1和result2,前者記錄上層顯示內容,后者記錄下層顯示內容
'''顯示板顯示輸出'''
def printout(result1, result2,frm):label1 = tk.Label(frm, font=('微軟雅黑', 20), bg='#EEE9E9', bd='9', fg='#828282', anchor='se', textvariable=result1)label1.place(relx=1, rely=0.5, relwidth=1, relheight=0.5, anchor='se')label2 = tk.Label(frm, font=('微軟雅黑', 20), bg='#EEE9E9', bd='9', fg='#828282', anchor='se', textvariable=result2)label2.place(relx=1, rely=1, relwidth=1, relheight=0.5, anchor='se') #注意放置位置為東南角
python opencv?按鍵布局位置,參考基本框架部分,布局采用place函數,位置為相對frm2的相位位置(relx,rely)。
數據按鍵對應數字處理函數press_num(),加減乘除對應計算函數press_compute(),等號對應單獨計算結果函數press_equal()。
def layout_button(frm):btn7 = tk.Button(frm, text='7', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('7'))btn7.place(relx=0.125, rely=0.125, relwidth=0.23,relheight=0.23,anchor='center')btn8 = tk.Button(frm, text='8', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('8'))btn8.place(relx=0.375, rely=0.125, relwidth=0.23,relheight=0.23,anchor='center')btn9 = tk.Button(frm, text='9', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('9'))btn9.place(relx=0.625, rely=0.125, relwidth=0.23,relheight=0.23,anchor='center')btn4 = tk.Button(frm, text='4', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('4'))btn4.place(relx=0.125, rely=0.375, relwidth=0.23,relheight=0.23,anchor='center')btn5 = tk.Button(frm, text='5', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('5'))btn5.place(relx=0.375, rely=0.375, relwidth=0.23,relheight=0.23,anchor='center')btn6 = tk.Button(frm, text='6', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('6'))btn6.place(relx=0.625, rely=0.375, relwidth=0.23,relheight=0.23,anchor='center')btn1 = tk.Button(frm, text='1', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('1'))btn1.place(relx=0.125, rely=0.625, relwidth=0.23,relheight=0.23,anchor='center')btn2 = tk.Button(frm, text='2', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('2'))btn2.place(relx=0.375, rely=0.625, relwidth=0.23,relheight=0.23,anchor='center')btn3 = tk.Button(frm, text='3', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('3'))btn3.place(relx=0.625, rely=0.625, relwidth=0.23,relheight=0.23,anchor='center')btn10 = tk.Button(frm, text='0', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('0'))btn10.place(relx=0.125, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')btn11= tk.Button(frm, text='.', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_num('.'))btn11.place(relx=0.375, rely=0.875, relwidth=0.23,relheight=0.23,anchor='center')btn12= tk.Button(frm, text='=', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_equal())btn12.place(relx=0.625, rely=0.875, relwidth=0.23,relheight=0.23,anchor='center')btn13= tk.Button(frm, text='+', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_compute('+'))btn13.place(relx=0.875, rely=0.125, relwidth=0.23,relheight=0.23,anchor='center')btn13 = tk.Button(frm, text='-', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_compute('-'))btn13.place(relx=0.875, rely=0.375, relwidth=0.23, relheight=0.23, anchor='center')btn13 = tk.Button(frm, text='X', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_compute('*'))btn13.place(relx=0.875, rely=0.625, relwidth=0.23, relheight=0.23, anchor='center')btn13 = tk.Button(frm, text='÷', font=('微軟雅黑', 20), bg='#f1f5fa', command=lambda:press_compute('/'))btn13.place(relx=0.875, rely=0.875, relwidth=0.23, relheight=0.23, anchor='center')
邏輯:如果上次按的按鈕是符號或等號,則將result2記為0,重新記數字;如果按的是數字,則在原來的基礎上再把新按數字記上;
def press_num(num):global isintbtn #標記按鈕按的數字,默認未按global isstrbtn #標記按鈕按的符號,默認未按global is_equal_last #標記上一個按鍵global last_num #記錄上一個數字global listif isstrbtn == False:passelse:result2.set(0)isstrbtn=False #若上次按鍵為符號,數字重新清零開始計數if is_equal_last == True:result2.set(0) #等號同理oldnum = result2.get()if oldnum == '0':result2.set(num)last_num = numelse:newnum = oldnum+numresult2.set(newnum)last_num = newnum #連續按數字,將數字連起來作為新的數字is_equal_last = False #標記下上個按鍵已不是等號
按了符號后,需將之前輸入的數字和符號顯示到上部分顯示板上,同時把之前的數字和符號記錄到list表中。
def press_compute(sign):global isintbtnglobal isstrbtnglobal is_equal_lastglobal last_cptglobal listnum = result2.get()list.append(num) #把數字記錄到列表中list.append(sign)isstrbtn = True #把符號記錄到列表中is_equal_last = Falselast_cpt = signcur_out = ''.join(list)result1.set(cur_out) #上部分顯示板顯示之前輸入的數字
等號注意,如果正常數字結束的,根據list內容計算出結果,如果是連續按的等號,將list內容更新下,更換為結果+最后一個符號+最后一個數字,再計算結果。
def press_equal():global isintbtnglobal isstrbtnglobal is_equal_lastglobal last_numglobal listif is_equal_last == False:curnum = result2.get()list.append(curnum)computeStr = ''.join(list)endnum = eval(computeStr) #使用eval函數將list內容計算出結果result2.set(endnum)result1.set(computeStr) #將計算結果和內容顯示在顯示板上is_equal_last = True #標記此時最后一個按鍵是等號list.clear() #清空listelse:curnum = result2.get() #如果上次按鍵是等號,記錄上次的計算結果list.append(curnum)list.append(last_cpt)list.append(str(last_num)) #將計算結果、最后一次的符號、最后一個數字添加到list中#print(list)computeStr = ''.join(list)endnum = eval(computeStr)#print(computeStr)result2.set(endnum)result1.set(computeStr)is_equal_last = Truelist.clear() #按照新的list計算結果并顯示
pycharm和python區別。3、整體代碼和最終結果
見下一篇:https://blog.csdn.net/u010234441/article/details/111995477
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态