鱼C论坛

 找回密码
 立即注册
查看: 343|回复: 11

[技术交流] 超厉害的Python ttkbootstrap计算器(原创)(甚至还教你图片处理)

[复制链接]
发表于 2024-1-30 08:55:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 某一个“天” 于 2024-1-30 11:21 编辑

加上效果图啦
注:需要用到两张图片(ico图标和等于号)  大家可以自行换上自己喜欢的图片
  1. '''frame框架布局
  2.     在frame内部,可以重新进行一次布局'''
  3. import ttkbootstrap as ttk
  4. from ttkbootstrap.constants import *
  5. from PIL import ImageTk,Image
  6. win = ttk.Window()
  7. win.title("计算器")
  8. win.geometry("320x287+500+200")
  9. win.resizable(width=False,height=False)   # 设置不能调整窗口大小
  10. # 设置窗体图标
  11. win.iconbitmap("./py_pic/jsq3.ico")

  12. style = ttk.Style()
  13. style.configure("TButton",font=("微软雅黑",13))
  14. def calcu(e):
  15.     txt = str(e.widget["text"])
  16.     if txt == "取余":
  17.         txt = "%"
  18.     elif txt == "整除":
  19.         txt = "//"

  20.     if len(varEntry1.get()) < 19 or txt == "C" or txt == "删除":
  21.         if txt == "C":   # 清空
  22.             varLabel0.set("")
  23.             varEntry1.set("")
  24.         elif txt == "删除":
  25.             s = entry1.get()[:-1]
  26.             varEntry1.set(s)
  27.         elif txt in ("+","-","*","/","%","//"):
  28.             if "=" in varEntry1.get():
  29.                 varEntry1.set("")
  30.                 varLabel0.set(get_result() + txt)


  31.             elif ("+"in varLabel0.get() or "-" in varLabel0.get() or
  32.                  "*"in varLabel0.get() or "/" in varLabel0.get() or
  33.                   "%" in varLabel0.get()or"//" in varLabel0.get()):
  34.                 if txt in ("+","-"):
  35.                     try:
  36.                         varLabel0.set(get_result() + txt)
  37.                         varEntry1.set("")
  38.                     except:
  39.                         varEntry1.set("错误")
  40.                 else:
  41.                     varLabel0.set(varLabel0.get()+varEntry1.get()+txt)
  42.                     varEntry1.set("")
  43.             else:
  44.                 varLabel0.set(varEntry1.get()+txt)
  45.                 varEntry1.set("")

  46.         elif varEntry1.get() == "错误":
  47.             varEntry1.set(txt)
  48.         elif "=" in varEntry1.get():
  49.             varLabel0.set("")
  50.             varEntry1.set(txt)
  51.         else:
  52.             varEntry1.set(varEntry1.get() + txt)
  53. def get_result():
  54.     result = eval(varLabel0.get() + varEntry1.get())
  55.     result = format(result, ".6f")  # .6f保留6位小数
  56.     return result
  57. def theEqual_Click():
  58.     try:
  59.         if len(varEntry1.get()) > 19:
  60.             varEntry1.set("错误")
  61.         result = get_result()
  62.         varLabel0.set(varLabel0.get()+varEntry1.get())
  63.         varEntry1.set("=" + result)

  64.     except :
  65.         varEntry1.set("错误")


  66. # 显示结果部分
  67. varLabel0 = ttk.StringVar()
  68. varLabel0.set("计算过程区:")
  69. label0 = ttk.Label(win,font=("宋体",15),textvariable=varLabel0)
  70. label0.grid(sticky=ttk.EW)   # 东西方向填充
  71. varEntry1 = ttk.StringVar()
  72. entry1 = ttk.Entry(win,font=("微软雅黑",15),textvariable=varEntry1)
  73. entry1.grid(sticky=ttk.EW)   # 东西方向填充

  74. # 按钮部分
  75. # 创建frame框架
  76. box = ttk.Frame(win)
  77. box.grid(row=2,column=0)

  78. # 按钮文本的列表
  79. btnText = ["7","8","9","*","/","4","5","6","+","-","1","2","3","C","删除"]
  80. # 行和列
  81. ri = 0
  82. ci = 0
  83. # 通过循环批量制作按钮

  84. for v in btnText:
  85.     if ci != 0 and ci % 5 == 0:
  86.         ri += 1   # 换行
  87.         ci = 0   # 列变为0
  88.     '''单击事件绑定
  89.         1.command只能绑定一个,如果要传参可以用lambda表达式
  90.         2.bind可以传当前控件事件到自定义函数'''

  91.     btn1 = ttk.Button(box,text=v,width=4,bootstyle=(SUCCESS, OUTLINE))


  92.     btn1.bind("<Button-1>",calcu)   # 左键单击事件
  93.     btn1.grid(row=ri,column=ci,rowspan=1)
  94.     ci += 1
  95. #0,.,取余,CE,=
  96. btn_0 = ttk.Button(box,text="0", style='success-outline')
  97. btn_0.bind("<Button-1>",calcu)
  98. btn_0.grid(row=ri+1,column=0,columnspan=2,sticky=ttk.EW)
  99. btnDP = ttk.Button(box,text=".", style='success-outline')
  100. btnDP.bind("<Button-1>",calcu)
  101. btnDP.grid(row=ri+1,column=2,sticky=ttk.EW)
  102. btnTS = ttk.Button(box,text="取余", style='success-outline')
  103. btnTS.bind("<Button-1>",calcu)
  104. btnTS.grid(row=ri+1,column=3,sticky=ttk.EW)
  105. btnCE = ttk.Button(box,text="整除", style='success-outline')
  106. btnCE.bind("<Button-1>",calcu)
  107. btnCE.grid(row=ri+1,column=4,sticky=ttk.EW)

  108. pic_equal = Image.open("./py_pic/等于号.png")   # 载入图片对象
  109. w,h = pic_equal.size
  110. pic_equal = pic_equal.resize((225,60))   # 一个元组
  111. pic_equal = pic_equal.convert("RGBA")
  112. data = pic_equal.getdata()
  113. new_data = []
  114. for item in data:
  115.     if item[0] == 255 and item[1] == 255 and item[2] == 255:  # 判断像素是否为白色
  116.         new_data.append((255, 255, 255, 0))  # 将白色像素设为透明
  117.     else:
  118.         new_data.append(item)
  119. pic_equal.putdata(new_data)
  120. pic_equal = ImageTk.PhotoImage(pic_equal)   # 变成适合ttk的图片格式
  121. btnEqual = ttk.Button(box,image=pic_equal,command=theEqual_Click, style='info-solid')
  122. btnEqual.grid(row=ri+2,column=0,columnspan=5,sticky=ttk.EW)



  123. win.mainloop()
复制代码
py1.png
py2.png

评分

参与人数 5荣誉 +25 鱼币 +15 贡献 +15 收起 理由
python爱好者. + 5 + 3 鱼C有你更精彩^_^
无言、XZ + 5 + 5 + 3 鱼C有你更精彩^_^
cjjJasonchen + 5 + 5 + 3 好康!
歌者文明清理员 + 5 + 3
liuhongrun2022 + 5 + 5 + 3 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-30 08:56:41 | 显示全部楼层
这个计算器使用了ttkbootstrap库来创建界面,同时使用了PIL库进行图片处理。主要分为三部分:显示结果区域、按钮区域和等于按钮。

首先导入所需的库:
  1. import ttkbootstrap as ttk
  2. from ttkbootstrap.constants import *
  3. from PIL import ImageTk,Image
复制代码


然后创建窗口并设置窗口大小、不可调整大小以及图标:
  1. win = ttk.Window()
  2. win.title("计算器")
  3. win.geometry("320x287+500+200")
  4. win.resizable(width=False,height=False)
  5. win.iconbitmap("./py_pic/jsq3.ico")
复制代码


接下来是一些必要的样式和布局设定:
  1. style = ttk.Style()
  2. style.configure("TButton",font=("微软雅黑",13))
复制代码


然后定义一些函数,包括计算过程、单击事件和获取结果:
  1. def calcu(e):
  2.     ...

  3. def get_result():
  4.     ...
  5.    
  6. def theEqual_Click():
  7.     ...
复制代码


然后是结果显示区域的设置,使用Label和Entry控件来显示结果:
  1. varLabel0 = ttk.StringVar()
  2. varLabel0.set("计算过程区:")
  3. label0 = ttk.Label(win,font=("宋体",15),textvariable=varLabel0)
  4. label0.grid(sticky=ttk.EW)   # 东西方向填充

  5. varEntry1 = ttk.StringVar()
  6. entry1 = ttk.Entry(win,font=("微软雅黑",15),textvariable=varEntry1)
  7. entry1.grid(sticky=ttk.EW)   # 东西方向填充
复制代码


接下来是按钮区域的设置。首先创建一个Frame框架来放置按钮,然后通过循环批量创建按钮,并绑定单击事件:
  1. box = ttk.Frame(win)
  2. box.grid(row=2,column=0)

  3. btnText = ["7", "8", "9", "+", "C",
  4.            "4", "5", "6", "-", "<-",
  5.            "1", "2", "3", "*", "CE",
  6.            "0", ".", "%", "/", "="]

  7. ri = 0
  8. ci = 0

  9. for v in btnText:
  10.     if ci != 0 and ci % 5 == 0:
  11.         ri += 1
  12.         ci = 0
  13.    
  14.     btn1 = ttk.Button(box,text=v,width=4,bootstyle=(SUCCESS, OUTLINE))
  15.     btn1.bind("<Button-1>",calcu)
  16.     btn1.grid(row=ri,column=ci,rowspan=1)
  17.     ci += 1
复制代码


最后是等于按钮的设置。首先处理等于号的图片,将白色像素设为透明,然后转换为ttk支持的图片格式。然后创建按钮并绑定点击事件:
  1. pic_equal = Image.open("./py_pic/等于号.png")
  2. w,h = pic_equal.size
  3. pic_equal = pic_equal.resize((225,60))
  4. pic_equal = pic_equal.convert("RGBA")

  5. data = pic_equal.getdata()
  6. new_data = []

  7. for item in data:
  8.     if item == (255, 255, 255):  
  9.         new_data.append((255, 255, 255, 0))  
  10.     else:
  11.         new_data.append(item)

  12. pic_equal.putdata(new_data)
  13. pic_equal = ImageTk.PhotoImage(pic_equal)

  14. btnEqual = ttk.Button(box,image=pic_equal,command=theEqual_Click, style='info-solid')
  15. btnEqual.grid(row=ri+2,column=0,columnspan=5,sticky=ttk.EW)
复制代码


最后启动主循环:
  1. win.mainloop()
复制代码


以上就是一个使用ttkbootstrap库创建计算器界面的示例代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-30 09:00:59 | 显示全部楼层
现在换了手机登录 所以没有图片呜呜…
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-30 09:01:16 | 显示全部楼层
某一个“天” 发表于 2024-01-30 09:00
现在换了手机登录 所以没有图片呜呜…


没问题,你可以尝试使用其他图片替代。只需将代码中的图片路径修改为你手机上的实际图片路径即可。例如:win.iconbitmap("/sdcard/Download/jsq3.ico")和pic_equal = Image.open("/sdcard/Download/等于号.png")。记得在替换图片时,要确保图片路径是正确的。祝你顺利完成计算器!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-30 09:41:23 | 显示全部楼层
康康截图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-30 10:10:59 | 显示全部楼层
不错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-30 10:34:36 | 显示全部楼层
图片可以通过 imgtp.com 图床进行上传
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-30 11:22:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-30 18:17:14 | 显示全部楼层
这个在交互器分分钟就能算出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-30 18:18:09 | 显示全部楼层
stumblemodel 发表于 2024-1-30 18:17
这个在交互器分分钟就能算出来

什么交互器
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-30 21:31:48 | 显示全部楼层
stumblemodel 发表于 2024-1-30 18:17
这个在交互器分分钟就能算出来

人家是研究的图像界面,你要实用直接笔算

点评

我很赞同!: 5.0
我很赞同!: 5
支持!  发表于 2024-1-30 22:14
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 14:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表