You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现tkinter中多个PanedWindow鼠标悬停时变色?

解决Tkinter循环创建PanedWindow仅最后一个悬停变色的问题

问题根源

循环中定义的on_enter和on_leave函数依赖循环变量m1,但Python闭包采用延迟绑定——函数不会立即捕获变量值,直到调用时才会查找变量的当前引用。循环结束后,m1始终指向最后一个创建的PanedWindow,导致所有组件的悬停事件都会修改最后一个组件的样式。

解决方案1:使用Lambda传递当前组件

直接在绑定事件时,通过lambda将当前的PanedWindow实例作为参数传入,避免依赖循环变量的延迟绑定:

import tkinter as tk

root = tk.Tk()
for i in range(10):
    m1 = tk.PanedWindow(root, bd=4, relief="flat", bg="blue")
    m1.pack()

    button1 = tk.Button(m1, text=f"{i}")
    button1.pack(pady=20)

    # 绑定事件时通过lambda传递当前PanedWindow实例
    m1.bind('<Enter>', lambda e, win=m1: win.config(background='OrangeRed3', relief="flat"))
    m1.bind('<Leave>', lambda e, win=m1: win.config(background='SystemButtonFace', relief="flat"))

    m1.add(button1)
tk.mainloop()

解决方案2:使用functools.partial绑定组件

定义通用的事件处理函数,通过functools.partial将当前PanedWindow实例与函数绑定,明确指定函数操作的对象:

import tkinter as tk
from functools import partial

def on_enter(win, event):
    win.config(background='OrangeRed3', relief="flat")

def on_leave(win, event):
    win.config(background='SystemButtonFace', relief="flat")

root = tk.Tk()
for i in range(10):
    m1 = tk.PanedWindow(root, bd=4, relief="flat", bg="blue")
    m1.pack()

    button1 = tk.Button(m1, text=f"{i}")
    button1.pack(pady=20)

    # 使用partial绑定当前PanedWindow和事件函数
    m1.bind('<Enter>', partial(on_enter, m1))
    m1.bind('<Leave>', partial(on_leave, m1))

    m1.add(button1)
tk.mainloop()

两种方案都能确保每个PanedWindow的悬停事件只修改自身样式,解决循环绑定的变量引用问题。

内容的提问来源于stack exchange,提问作者rajdeep paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:10:40