菜单打开时自定义tkinter菜单

时间:2014-04-10 04:08:55

标签: python user-interface tkinter menu tkinter-menu

我希望不太受欢迎的菜单项逐渐从白色变为黑色。菜单仍然打开时有没有办法让颜色更新?我已经尝试了postcommand和线程:

def update():
    def color(c):
        animal_menu.config(fg=c)
        root.update()
        print c
    def adapt():
        color('white')
        root.after(100, color('#6E6E6E'))
        root.after(100, color('black'))
##  adapt() ##attempt no.1
##  thread.start_new_thread(adapt, ())  ##attempt no.2

root = Tk()
menubutton = Menubutton(root, text="Animals")
animal_menu = Menu(menubutton, tearoff=0, postcommand=update)
animal_menu.add_command(label="Lion", command=print_time)
animal_menu.add_command(label="Tiger", command=print_time)
animal_menu.add_command(label="Bear", command=print_time)
menubutton.menu = animal_menu
menubutton["menu"]  =  menubutton.menu
menubutton.pack()
root.config()
root.mainloop()

到目前为止,第一次尝试在菜单出现之前完全运行(在发布菜单之前调用postcommand是有意义的),第二次尝试仅在菜单未打开(我不明白)时才运行印刷声明证明了这一点。

当菜单打开时,是否可以有人给我一个关于如何正确动态改变颜色以使项目淡入的指针?

1 个答案:

答案 0 :(得分:1)

回调中的after方法存在一些问题:

def update():
    def color(c):
        animal_menu.config(fg=c)
        root.update()
        print c
    def adapt():
        color('white')
        root.after(100, color('#6E6E6E'))
        root.after(100, color('black'))
    adapt() ##attempt no.1

首先,如果你将参数传递给after中被调用的函数,你必须使用lambda表达式或者用逗号分隔它们:

root.after(100, color, 'black')

否则,括号将首先评估该函数。

其次,after不适用于您可能习惯的典型控制流程 - 它未被评估一个,然后是下一个 - 您在100ms之后评估调用之后设置两者,这就是将要发生的事情。

这是一个fadein回调的工作示例:

from Tkinter import *

def fadein(color):
    if color < 111111:
        animal_menu.config(fg='#000000')
    else:
        print color
        animal_menu.config(fg='#' + str(color))
        root.after(100, fadein, color - 111111)

root = Tk()
menubutton = Menubutton(root, text="Animals")
animal_menu = Menu(menubutton, tearoff=0, postcommand=lambda: fadein(999999))
animal_menu.add_command(label="Lion")
animal_menu.add_command(label="Tiger")
animal_menu.add_command(label="Bear")
menubutton.menu = animal_menu
menubutton["menu"]  =  menubutton.menu
menubutton.pack()
root.config()
root.mainloop()

请注意postcommand中的lambda表达式,它是将参数传递给fadein()所必需的。

更多信息:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method