Tkinter是Python的标准GUI(图形用户界面)工具包,用于创建和管理图形用户界面应用程序。Tkinter提供了一组丰富的组件和工具,使开发者能够轻松地构建具有按钮、标签、文本框、菜单等各种交互元素的用户界面。通过Tkinter,开发者加粗样式可以实现用户友好的界面设计,并与用户进行交互,从而创建各种类型的桌面应用程序
* xxx * - 我是为了重点突出 * * 所包裹内容的意思 例如 * a = 11 * 我为了说明 a = 11 这件事,无特殊含义
-
导入库 (不重要)
-
import tkinter as tk from tkinter import ttk from tkinter import messagebox
-
-
创建主窗口
-
root = tk.Tk() # 标题 root.title("莲藕线性回归价格预测器") root.geometry("600x400") # 设置窗口大小为600x400像素
-
-
创建一个框架(建造一个框框类似css 中的盒子)
-
frame = ttk.Frame(root, padding="20") # 这行代码创建了一个框架,并将其放置在指定的根窗口(root)内,padding="20" # padding="20" 表示在框架周围添加了 20 像素的内边距 # sticky=(tk.W, tk.E, tk.N, tk.S) sticky参数用于指定控件在其所在的单元格中对齐方式,tk.W, tk.E, tk.N, tk.S(东西南北都对对齐,东西对齐说明水平分布,南北对齐说明垂直分布,整体来说位于框架中心位置) frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
-
添加了 20 像素的内边距意味着在框架的边界和其内部的控件之间有一个 20 像素的空间。这样做的目的是为了让框架内部的内容与框架的边界之间有一定的间隔
-
创建提示标签和输入框
-
label_temperature = ttk.Label(frame, text="请输入温度 (°C):") # ttk.Label 被用来创建标签控件 **提示信息**,*frame* 将创建标签控件放置在名为frame的框架中,frame是该标签的父容器 label_temperature.grid(row=0, column=0, pady=5) # pady=5 表示在垂直方向上增加 5像素的外边距,标签框架与其他控件之间在上下位置上的间距为5 entry_temperature = ttk.Entry(frame) # * Entry * 创建了一个输入框(Entry)控件,并将其放置在frame框架中,同样frame是该标签的父容器 entry_temperature.grid(row=0, column=1, pady=5) # 同样垂直方向增加5像素的外边框,表明输入框和frame盒子在上下位置上的间距为5像素
-
-
创建预测按钮(执行函数是)
-
# 预测按钮 button_predict = ttk.Button(frame, text="预测价格", command=predict_price) # * ttk.Button * 生成按键 、* text="预测价格" *按钮上显示的文本是"预测价格"、* command=predict_price * command 是ttk的一个参数,用于接受当按钮被点击时要调用的函数(本次中是 *predict_price() *)或方法,具体而言command 选项允许你将一个函数或方法绑定到按钮的点击事件上。当用户点击按钮时,与 command 选项关联的函数或方法将被调用,从而执行特定的操作或处理逻辑 button_predict.grid(row=1, column=0, columnspan=2, pady=10)
-
-
创建预测结果显示标签
-
# 结果标签 result_var = tk.StringVar() # chatgpt label_result = ttk.Label(frame, textvariable=result_var) # *textvariable* textvariable 是tk的一个参数,用于指定控件显示的文本内容所对应的变量(这里是 result_var),当你将一个变量赋给 textvariable 选项时,该控件会动态地显示该变量的值。这意味着当变量的值发生变化时,控件上显示的文本内容也会相应地更新,result_var 接受的是我计算的返回结果,我在输入框输入一个符合要求的平均气温会返回一个计算的预测结果 label_result.grid(row=2, column=0, columnspan=2, pady=10)
-
-
启动主控件
-
# 运行主循环 root.mainloop() # *root * 最外层的盒子所有空间都在这个盒子中
-
-
核心功能(本质作用)
-
# 本质是为了给一个平均气温让其经过自定义计算规则计算后返回一个预测值 很简单 y = kx + b # k = 0.0825747948982792 b = 5.294336835985737 这些都是自定义好的 , x 是我要输入的平均气温。 **重点**是要让其重复执行,我给一个值就执行一次,而不是执行完一次,我又要运行一次,再给一个值 重复执行这一点在 command=predict_price 中得以实现,每当我在输入框输入平均气温值后,点击按钮的同时它就会自动调用计算函数predict_price() def predict_price(): try: temp_c = float(entry_temperature.get()) predicted_price = intercept + slope * temp_c result_var.set(f"预测莲藕价格: {predicted_price:.2f} 元") except ValueError: messagebox.showerror("错误", "请输入有效的温度值!") # * messagebox.showerror * 显示错误消息框函数,在这里面接受了两个参数,第一个参数消息框标题,第二个参数消息框提示信息(这里是请输入有效的温度值!) predict_price() 函数中我认为最重要的是 result_var.set() 的作用 我也不知道你问 chatgpt # try 缩进内容的作用 try 关键字 包裹错误不至于报错,导致程序在 try 包裹中的任意一个位置停止下来 try: pass # pass # except 缩进内容的作用 except 关键字 用于捕获异常并对其进行处理,我在这里做了 如果输入值不符合规则(不是数值或者浮点数,或者没有找到这个平均气温值就会执行except 关键字下面的代码) except: pass
结果:
-
完整代码
重点不在于如何绘制这个交互式GUI而是后面计算预测结果的执行逻辑,当然这个计算方法很简单
predicted_price = intercept + slope * temp_c result_var.set(f"预测莲藕价格: {predicted_price:.2f} 元")
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
# 确保这里导入的是你已经计算好的模型参数
slope = 0.0825747948982792
intercept = 5.294336835985737
def predict_price():
try:
temp_c = float(entry_temperature.get())
predicted_price = intercept + slope * temp_c
result_var.set(f"预测莲藕价格: {predicted_price:.2f} 元")
except ValueError:
messagebox.showerror("错误", "请输入有效的温度值!")
# 创建主窗口
root = tk.Tk()
root.title("莲藕线性回归价格预测器")
root.geometry("600x400") # 设置窗口大小为600x400像素
# 创建一个框架来组织控件
frame = ttk.Frame(root, padding="20")
frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 温度标签和输入框
label_temperature = ttk.Label(frame, text="请输入温度 (°C):")
label_temperature.grid(row=0, column=0, pady=5)
entry_temperature = ttk.Entry(frame)
entry_temperature.grid(row=0, column=1, pady=5)
# 预测按钮
button_predict = ttk.Button(frame, text="预测价格", command=predict_price)
button_predict.grid(row=1, column=0, columnspan=2, pady=10)
# 结果标签
result_var = tk.StringVar()
label_result = ttk.Label(frame, textvariable=result_var)
label_result.grid(row=2, column=0, columnspan=2, pady=10)
# 运行主循环
root.mainloop()
感谢大家对小弟的支持,我做了一个玩玩,我同学也想了解一下,找我要,帮他同学先注释一下,自己也学习一遍,希望帮助到大家。