gpt4 book ai didi

python - 如何将小部件放入 ttk.Button

转载 作者:太空宇宙 更新时间:2023-11-04 08:03:54 25 4
gpt4 key购买 nike

有没有合适的方法将小部件嵌套在 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.Frametk.Label ( ttk.Label 需要与 ttk.Style 进行更多合作)。

我绑定(bind)事件 <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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com