是否有在ttk.Button内嵌套小部件的正确方法?它支持指定一个标签(一个str
)和一个图像(一个PhotoImage
),我假设它们是使用子控件实现的。
这是一个向按钮添加左对齐标签和右对齐标签的示例。
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
normal_button = ttk.Button(root, text="Normal Button")
normal_button.pack(fill=tk.X)
custom_button = ttk.Button(root)
custom_button.pack(fill=tk.X)
left_label = ttk.Label(custom_button, text="Left")
left_label.pack(side=tk.LEFT, padx=16, pady=4)
right_label = ttk.Label(custom_button, text="Right")
right_label.pack(side=tk.RIGHT, padx=16, pady=4)
root.mainloop()
这种工作,但有一些怪癖:
将鼠标悬停在按钮上时,按钮的背景会突出显示,但嵌套标签会保留其未突出显示的背景。
如果我在任何一个嵌套标签中单击,该按钮将按下,但不会被按下。
当按下按钮时,嵌套标签不会移动,给人以按钮被按下的感觉。
是否有将小部件包装在按钮内的正确方法?
最佳答案
正如我在评论中所说,您可以创建自己的小部件。
这是一个使用tk.Frame
和tk.Label
的简单示例(ttk.Label
需要使用ttk.Style
进行更多工作)。
我绑定事件<Enter>
和<Leave>
来更改框架并标记背景。
对于更多的小部件,您可以将它们保留在列表中,并使用for
循环更改背景。
import tkinter as tk
import tkinter.ttk as ttk
class MyButton(tk.Frame):
def __init__(self, master, bg_hover='red', bg_normal=None, **options):
tk.Frame.__init__(self, master, **options)
self.bg_normal = bg_normal
self.bg_hover = bg_hover
# use default color if bg_normal is `None`
if not self.bg_normal:
self.bg_normal = self['bg']
# add first label
self.left_label = tk.Label(self, text="Left")
self.left_label.pack(side=tk.LEFT, padx=16, pady=4)
# add second label
self.right_label = tk.Label(self, text="Right")
self.right_label.pack(side=tk.RIGHT, padx=16, pady=4)
# bind events
self.bind('<Enter>', self.on_enter)
self.bind('<Leave>', self.on_leave)
def on_enter(self, event=None):
# change all backgrounds on mouse enter
self['bg'] = self.bg_hover
self.left_label['bg'] = self.bg_hover
self.right_label['bg'] = self.bg_hover
def on_leave(self, event=None):
# change all backgrounds on mouse leave
self['bg'] = self.bg_normal
self.left_label['bg'] = self.bg_normal
self.right_label['bg'] = self.bg_normal
root = tk.Tk()
normal_button = ttk.Button(root, text="Normal Button")
normal_button.pack(fill=tk.X)
my_button = MyButton(root)
my_button.pack()
root.mainloop()
关于python - 如何将小部件放入ttk.Button,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35105936/