写在前面:
大概一个月前,从导师那里弄到了一个界面开发的小任务,使用python进行开发,主要是界面制作以及一些小功能的开发,今天开发初步完成,于是记录一下此次开发过程中的所学以备忘巩固。
编程新人...错误请指正,谢谢。
界面代码:
由于功能代码不便流传,功能实现代码就不附上了,以下为界面图片及实现代码:
from tkinter import filedialog, Text
import matplotlib as mpl
import ttkbootstrap as ttk
from PIL import Image, ImageTk
from ttkbootstrap.constants import *
# 正常显示中文
mpl.rcParams['font.sans-serif'] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
# 定义图片导入函数
def Import_pic():
global file_path, a1, myPhoto2,myPhoto2_show
file_path = filedialog.askopenfilename(title='Choose an image.', initialdir=('D:\PyCharm 2023.1\a_py_project'))
b2.configure(state="able")
myPhoto2 = Image.open(file_path)
x, y = myPhoto2.size
myPhoto2_show = myPhoto2.resize((canvas1.winfo_width(), int((canvas1.winfo_width() * y) / x)))#图片根据画布的大小等比例缩放
myPhoto2_shows = ImageTk.PhotoImage(myPhoto2_show)
canvas1.delete("all") #删除画布上之前的图像
canvas1.image = myPhoto2_shows
canvas1.create_image((canvas1.winfo_width() / 2, canvas1.winfo_height() / 2), image=myPhoto2_shows)
# (canvas1.winfo_width() / 2, canvas1.winfo_height() / 2)是位置信息,指图片中心在画布上的位置
#canvas1.winfo_width() 获取画布canvas1 的真实宽度
def Measure_dis():
# for widget in frame2.winfo_children():
# widget.destroy()
#原用于销毁frame2框架控件代码,防止多测测量结果堆叠
myPhoto3_shows = ImageTk.PhotoImage(myPhoto2_show)
canvas2.delete("all")
canvas2.image = myPhoto3_shows
canvas2.create_image((canvas2.winfo_width() / 2, canvas2.winfo_height() / 2), image=myPhoto3_shows) # 300,300是位置信息
b2.configure(state="disable")
canvas2.bind("<Enter>", aa1)
canvas2.bind("<Button-1>", aa2)
canvas2.bind("<Leave>", aa3)
def xFunc(event):
return 0
def aa1(event):
global line1 #标记线
line1 = canvas1.create_line(0, 0, 0, 500, width=1, fill="red") #创建line1
def aa3(event):
canvas1.delete(line1) #删除line1
def aa2(event):
line1_x, _, _, _ = canvas1.coords(line1)
move_x = event.x - line1_x
print(line1_x,event.x)
canvas1.move(line1, move_x, 0) #line1移动
root = ttk.Window(title='预测测量', size=(1500, 900), position=(50, 50), themename="morph")
photo = ttk.PhotoImage(file='./3.png')
root.iconphoto(False, photo) #设置窗口图标
# 创建框架,功能区
frame_1 = ttk.Frame(root, width=960, height=60, bootstyle=LIGHT)
frame_1.pack(side=TOP, padx=0, pady=0, fill=ttk.X) # 自动调节组件自身的尺寸
# 创建框架,工作区
frame_2 = ttk.Frame(root)
frame_2.pack(side=TOP, padx=5, pady=0, fill=ttk.BOTH, expand=True)
frame1 = ttk.LabelFrame(frame_2, text="原始图") # 待分析图片显示位置
frame1.place(relx=0.025, rely=0.05, relheight=0.9, relwidth=0.45)
frame2 = ttk.LabelFrame(frame_2, text="预测曲线") # 预测曲线显示位置
frame2.place(relx=0.525, rely=0.05, relheight=0.9, relwidth=0.45)
# 创建框架,辅助信息区
frame_3 = ttk.Frame(root, width=960, height=180)
frame_3.pack(side=BOTTOM, fill=ttk.X)
xVariable = ttk.StringVar() #创建变量,便于取值
com = ttk.Combobox(frame_1, textvariable=xVariable) # 创建下拉菜单
com.pack(side=LEFT, padx=50, pady=10) # #将下拉菜单绑定到窗体
com["value"] = ("C扫", "相控阵") # #给下拉菜单设定值
com.current(0) # 设定下拉菜单的默认值
com.bind('<<ComboboxSelected>>', xFunc)
b1 = ttk.Button(master=frame_1, text='导入图片', width=12, command=Import_pic) # 导入图片按钮
b1.pack(side=LEFT, padx=20, pady=10)
b2 = ttk.Button(master=frame_1, text='测量宽度', width=12, command=Measure_dis) # 图片分析按钮,未导入前禁用,分析完成后禁用
b2.pack(side=LEFT, padx=20, pady=10)
b2.configure(state="disabled")
bg1 = Image.open("bg1.png") # 导入初始背景图
bg_1 = ImageTk.PhotoImage(bg1)
# 创建画布
canvas1 = ttk.Canvas(frame1) # 画布的位置和大小
canvas1.create_image(300, 300, image=bg_1) # 300,300是位置信息
canvas1.pack(side=LEFT, padx=10, pady=10, fill=BOTH, expand=True)
sep = ttk.Separator(frame_2, orient=VERTICAL, bootstyle=DARK) # 分隔线
sep.place(relx=0.5, rely=0.03, relheight=0.97)
bg2 = Image.open("bg2.png") # 导入初始背景图
bg_2 = ImageTk.PhotoImage(bg2)
#创建画布
canvas2 = ttk.Canvas(frame2) # 画布的位置和大小
canvas2.create_image(300, 300, image=bg_2) # 300,300是位置信息
canvas2.pack(side=LEFT, padx=10, pady=10, fill=BOTH, expand=True)
text = Text(frame_3, height=10) # 交互文本框,padding=5, autohide=True
text.place(relx=0.025, rely=0.05, relheight=0.7, relwidth=0.8)
xiao_hui_1 = Image.open("3.png") # 导入校徽
xh1 = ImageTk.PhotoImage(xiao_hui_1)
canvas3 = ttk.Canvas(frame_3, width=180, height=120) # 画布的位置和大小
canvas3.create_image(130, 60, image=xh1) # 300,300是位置信息
canvas3.create_text(30, 10, text=" Auothor:")
canvas3.place(relx=0.85, rely=0.05)
root.update()
root.mainloop() # 进入主事件循环
函数&模块:
这一部分我将叙述我在界面开发过程中的学习及认知,慢慢写...
一、ttkbootstrap部分:
导入ttkbootstrap模块:
import ttkbootstrap as ttk
from ttkbootstrap import *
1.Frame容器:
frame容器的主要作用是容纳和约束其他控件,以便规划界面,使界面更加美观,其本身常用属性为,width(宽),height(高),bootstyle(样式),relief(框架外框样式)等。
frame1 = ttk.Frame(root, width=960, height=60, bootstyle=LIGHT)
#在root窗口中创建容器frame1,宽960像素,高60像素,背景:LIGHT
frame1.pack()
#将frame1绑定在它的父容器上,自动调节尺寸位置
2.Button
b1 = ttk.Button(master=frame1, text='导入图片', width=12, command=Import_pic,
bootstyle="sussess")
#在frame1容器中创建按钮b1,绑定事件Import_pic
b1.pack(side=LEFT, padx=20, pady=10) #button绑定带frame1上
b1.configure(state="disabled") #b1按钮设置禁用,state="able",恢复使用
先写到这了,之后慢慢补充...