如何解决如何使 ttk 小部件在悬停时缓慢发光
我试图让我的 ttk
小部件在像 messageBox
OK 按钮一样悬停时缓慢发光。
在您的代码编辑器中键入此内容,然后将鼠标悬停在“确定”按钮上,以了解小部件缓慢发光的含义。
from tkinter import *
from tkinter import messageBox
messageBox.showinfo("","Hover over OK button!")
但是,ttk
小部件在悬停时会立即亮起。
from tkinter import *
from tkinter import ttk
root = Tk()
ttk.Button(root,text ="Hover over me!").pack()
root.mainloop()
我可以知道如何让我的 ttk
小部件在悬停时缓慢发光吗?
解决方法
使用 ttk
您必须创建一堆样式并循环使用它们。那将是荒谬的,也是不必要的。使用 tk
您可以即时更改背景(或任何其他属性)。它更适合您想要的行为。
您不必使用我的 deque
方法。您可以继续增加一些整数并重置它。您还可以执行以下操作:self.colors.append(self.colors.pop(0))
~ 作为代理,这与 deque
所做的基本相同。这里真正的重点是 after
用于继续运行一个方法,该方法在颜色列表中循环,并将当前颜色应用于按钮。
import tkinter as tk
from collections import deque
class GlowButton(tk.Button):
def __init__(self,master,**kwargs):
tk.Button.__init__(self,**kwargs)
#store background color
self.bg_idle = self.cget('background')
#list of glow colors to cycle through
self.colors = ['#aa88aa','#aa99aa','#aaaaaa','#aabbaa','#aaccaa','#aaddaa','#aaeeaa','#aaffaa']
#deque to use as an offset
self.col_index = deque(range(len(self.colors)))
#eventual reference to after
self.glow = None
#add MouseOver,MouseOut events
self.bind('<Enter>',lambda e: self.__glow(True))
self.bind('<Leave>',lambda e: self.__glow(False))
def __glow(self,hover):
if hover:
#get rotation offset
ofs = self.col_index.index(0)
#apply color from rotation offset
self.configure(background=self.colors[ofs])
#if the offset has not reached the end of the color list
if ofs != len(self.colors)-1:
#rotate
self.col_index.rotate(1)
#do all of this again in 50ms
self.glow = self.after(50,self.__glow,hover)
else:
#kill any expected after
self.after_cancel(self.glow)
#rewind
self.col_index.rotate(-self.col_index.index(0))
#reset to idle color
self.configure(background=self.bg_idle)
root = tk.Tk()
GlowButton(root,text='button',font='Helvetica 10 bold',bg='#aa88aa').grid()
if __name__ == '__main__':
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。