python圖形界面,python tkinter 計算器V1.0

 2023-10-17 阅读 34 评论 0

摘要:文章目錄前言一、最終成果物二、代碼詳解1.基本框架1.1 主窗口整體布局1.2 顯示板1.3 按鈕2.內部邏輯2.1 數字處理2.2 計算處理2.3 等號處理總結 前言 python tkinter 系列,實現計算器基本加減乘除的運算 一、最終成果物 python圖形界面, 二、代碼詳解 1.基本框架 參

文章目錄

  • 前言
  • 一、最終成果物
  • 二、代碼詳解
    • 1.基本框架
      • 1.1 主窗口整體布局
      • 1.2 顯示板
      • 1.3 按鈕
    • 2.內部邏輯
      • 2.1 數字處理
      • 2.2 計算處理
      • 2.3 等號處理
  • 總結


前言

python tkinter 系列,實現計算器基本加減乘除的運算


一、最終成果物

python圖形界面,在這里插入圖片描述

二、代碼詳解

1.基本框架

參考電腦自帶的計算機,除去一些復雜的符號,只考慮簡單的加減乘除,設計整體的框架如下:
在這里插入圖片描述

1.1 主窗口整體布局

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()

1.2 顯示板

新建兩個字符變量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')	#注意放置位置為東南角

1.3 按鈕

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')

2.內部邏輯

  1. 變量:
  • 標記位:標記上個按鍵是什么,
    isintbtn:標記按鈕按的數字,默認未按
    isstrbtn :標記按鈕按的符號,默認未按
    is_equal_last:標記上個按鍵是不是等號
  • 保存數據:
    list[]:保存整個計算過程中的按鍵;
    result1:記錄顯示板上面內容
    result2:記錄顯示板下面內容
  1. 按鍵邏輯
  • 1)按了數字后,如果前一個按鍵還是數字,組合在一起形成新的數字,并顯示在下面顯示板;
  • 2)按了符號,下面顯示板不顯示,保持原數字,但記錄result2清空以便記錄下個數字;且將之前的過程顯示在上面顯示板;
  • 3)按了等號后,將結果顯示在下面顯示板,過程顯示在上面顯示板;
  1. 特殊情況:
  • 連續按了多次“=”,將前一次等號計算的結果,與最后一次符號和數字重新計算,如5+6,按“=”計算為11,再次按“=”后,計算變為11+6,結果為17。
  • “=”計算出結果,直接按了符號,將結果作為初始的數值計算。

2.1 數字處理

邏輯:如果上次按的按鈕是符號或等號,則將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 #標記下上個按鍵已不是等號

2.2 計算處理

按了符號后,需將之前輸入的數字和符號顯示到上部分顯示板上,同時把之前的數字和符號記錄到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) #上部分顯示板顯示之前輸入的數字

2.3 等號處理

等號注意,如果正常數字結束的,根據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

總結

  1. 在設計過程中,會增加一些標記,如上個按鍵的情況,上個數字、符號,這些都是為了方便整合數字或處理特殊情況。在設計初期,就應該考慮除了正常的按鍵外,一些非正常的按鍵程序該如何響應(如連續按等號,等號后直接符號等)。
  2. 初始計算器已完成,對照電腦自帶的計算器,還可增加更多符號(%、刪除一位,清空按鍵等),來豐富計算器內容,敬請期待

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/149894.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息