簡體   English   中英

如何將小部件放入ttk.Button

[英]How to put widgets inside a ttk.Button

有沒有在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更多工作)。

我綁定事件<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()

沒有正確的方法將小部件打包在按鈕內。 按鈕不是為此功能設計的。 如您所見,您確實可以使用packgrid將小部件放置在按鈕內。 但是,您必須添加自定義綁定,以使其看起來像是一鍵式小部件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM