Tkinter设备租赁GUI程序添加图片及修改窗口颜色相关问题
Tkinter设备租赁程序配色与图片添加方案
一、二级窗口背景色设置方法
Toplevel类型的二级窗口和主窗口属性配置逻辑完全一致,直接操作Toplevel实例的bg属性即可,同时需要同步修改窗口内所有容器(比如Frame)和控件的背景色,避免出现色块断层:
- 二级窗口实例设置:
self.win['bg'] = '目标颜色'(支持颜色名、十六进制色值两种格式) - 内部Frame设置:
self.frameFit = Frame(self.win, bg='和窗口一致的颜色') - 窗口内Label、Button等控件也同步添加
bg参数配置即可实现整体配色统一
二、窗口添加图片方法
Tkinter显示图片需要依赖Label控件承载,重点注意需要把图片对象绑定为窗口/类的实例属性,避免Python垃圾回收机制销毁图片导致无法显示:
主窗口添加图片
你已经加载了logo图片,只需要新增一个Label控件承载图片,同时把图片对象绑定为root的属性即可:
# 原有加载图片代码修改为绑定到root属性 root.img = ImageTk.PhotoImage(Image.open("4 Dry Out Logo.png")) # 新增Label放置图片 Label(root, image=root.img, bg='blue').pack()
二级窗口添加图片
在Menu类的__init__方法内加载图片,绑定为self的实例属性,再用Label承载即可:
# 二级窗口内加载图片,绑定为实例属性避免被回收 self.sub_img = ImageTk.PhotoImage(Image.open("二级窗口图片的本地路径.png")) # 新增Label放置图片 Label(self.frameFit, image=self.sub_img, bg='二级窗口背景色').pack()
完整修改后可运行代码
from tkinter import * from tkinter import ttk from PIL import ImageTk, Image import os # 主窗口属性配置 root = Tk() root.title('4 Dry Out | 主菜单') # 主窗口logo图片绑定为root属性避免被回收 root.logo_img = ImageTk.PhotoImage(Image.open("4 Dry Out Logo.png")) root.geometry("350x220") # 调整尺寸适配图片显示 root['bg']='blue' class Menu: def __init__(self): # 创建二级窗口 self.win = Toplevel() # 设置二级窗口背景色,可按需替换为其他颜色 self.win['bg'] = 'lightblue' self.win.geometry("400x450") # 二级窗口内的Frame同步设置背景色 self.frameFit = Frame(self.win, bg='lightblue') self.frameFit.pack(pady=10) # 二级窗口添加自定义图片,替换为你的本地图片路径即可 self.sub_img = ImageTk.PhotoImage(Image.open("二级窗口图片路径.png")) Label(self.frameFit, image=self.sub_img, bg='lightblue').pack(pady=5) # 标题Label同步设置背景色 self.TitleLabel = Label(self.frameFit, text="设备租赁门户", bg='lightblue', font=("黑体",16)).pack(pady=5) # 设备类型下拉框 self.Equipment = ["鼓风机/风扇", "除湿机", "空气净化器", "发电机", "抽吸/清洁设备"] self.equipCombo = ttk.Combobox(self.frameFit, value=self.Equipment) self.equipCombo.current(0) self.equipCombo.pack(pady=5) # 租赁天数输入 self.dayLabel = Label(self.frameFit, text="租赁天数:", bg='lightblue').pack() self.dayTxt = Entry(self.frameFit, width=5) self.dayTxt.pack(pady=2) # 设备数量输入 Label(self.frameFit, text="租赁数量:", bg='lightblue').pack() self.equipAmt = Entry(self.frameFit, width=5) self.equipAmt.pack(pady=2) # 计算按钮 self.recordBtn = Button(self.frameFit, text="计算总费用", command=self.calcTotal, bg='navy', fg='white') self.recordBtn.pack(pady=10) def calcTotal(self): self.Equipment = self.equipCombo.get() self.dayAmount = float(self.dayTxt.get()) self.EquipAmt = float(self.equipAmt.get()) # 优化价格匹配逻辑,简化冗余判断 price_map = { "鼓风机/风扇":25, "除湿机":50, "空气净化器":175, "发电机":200, "抽吸/清洁设备":75 } total = price_map[self.Equipment] * self.dayAmount * self.EquipAmt # 结果Label同步设置背景色 self.totalLbl = Label(self.frameFit, text=f"总应付金额:${round(total, 2)}", bg='lightblue', font=("黑体",14)).pack(pady=5) class MainWindow: def __init__(self, master): mainFrame = Frame(master, bg='blue') mainFrame.pack() # 主窗口显示logo Label(master, image=master.logo_img, bg='blue').pack(pady=5) self.titleLabel = Label(master, text="4 Dry Out 设备租赁", bg = "blue", fg = "white", font =("微软雅黑", 20)) self.titleLabel.pack(pady=5) self.Btn = Button(master, text="水损设备租赁", command=self.MenuWindow, bg = "navy", fg = "white").pack(pady=5) def MenuWindow(self): self.record = Menu() self.record.win.mainloop() # 启动主窗口 winStart = MainWindow(root) root.mainloop()
内容的提问来源于stack exchange,提问作者Lady
相关产品推荐
相关产品推荐

