【问题标题】:tkinter custom button class **kwargstkinter 自定义按钮类 **kwargs
【发布时间】:2020-09-02 02:43:35
【问题描述】:

我正在尝试创建一个 tkinter 按钮类来添加带有文本的调整大小的图像。

按钮按预期在主窗口上呈现正常,但我无法将命令传递给按钮。 BTN_IMG_TXT 的附加 **kwargs 会使用原始 tk.button 创建错误。 因此,我在类定义中使用了以下内容,我认为这是代码的问题部分。

def __init__(self, master, command, *args, **kwargs):
    tk.Button.__init__(self,master=master, command=command)

以下是完整的测试代码:

import tkinter as tk
from PIL import  Image, ImageTk

window = tk.Tk()
window.geometry("300x200")

def remove_item(event = None):
    print('Delete button pressed')  #debug

# custom button widget
class BTN_IMG_TXT(tk.Button):
    def __init__(self, master, command, *args, **kwargs):
        tk.Button.__init__(self,master=master, command=command)
        self.fname = kwargs.get('fname')
        self.btn_txt = kwargs.get('btn_txt')
        img = Image.open(self.fname)
        image = img.resize((40,40), Image.ANTIALIAS)  # make static size
        self.photo1=  ImageTk.PhotoImage(image)
        b = tk.Button(self, text=self.btn_txt, image=self.photo1, 
                            compound="top", width=70, height=70,)
        b.pack(side="top")

frm_Main = tk.Frame(master=window, bg='#faeaea', borderwidth=2)
frm_Main.pack()
stp_btn = BTN_IMG_TXT(master=frm_Main,fname="stop_b.png",btn_txt='STOP',command=remove_item)
del_btn= BTN_IMG_TXT(master=frm_Main,fname="delete_b.png",btn_txt='DELETE', command=remove_item)
del_btn.pack(side="left", fill="both", expand=False)
stp_btn.pack(side="left", fill="both", expand=False)


window.mainloop()

【问题讨论】:

    标签: python-3.x class tkinter


    【解决方案1】:

    Tkinter Button 可以同时显示文本和图像,通过使用compound 参数,我们可以告诉按钮小部件将文本与图像对齐的位置,阅读有关复合参数的更多信息Tkinter Buttonconfig(**options)

    您正在使用按钮内的按钮,这就是该命令不起作用的原因,因为它与 BTN_IMG_TXT 类链接,而不是与类内部的 b 链接。

    这就是我所做的,

    # custom button widget
    class BTN_IMG_TXT(tk.Button):
        def __init__(self, master=None, cnf={}, **kw):
            # Merged both cnf and kw dictionaries.
            kw = tk._cnfmerge((kw, cnf)) 
            # make static size
            if kw.get('image'):
                img = Image.open(kw['image'])
                image = img.resize((40,40), Image.ANTIALIAS)  
                self.photo1 = ImageTk.PhotoImage(image)
                kw['image'] = self.photo1
            # Aligns the image on top and text under it
            kw['compound'] = kw.get('compound', 'top') 
            super().__init__(master=master, **kw)
    
    
    frm_Main = tk.Frame(master=window, bg='#faeaea', borderwidth=2)
    frm_Main.pack()
    stp_btn = BTN_IMG_TXT(master=frm_Main, image="stop_b.png", text='STOP', command=remove_item)
    del_btn= BTN_IMG_TXT(master=frm_Main, image="delete_b.png", text='DELETE', command=remove_item)
    del_btn.pack(side="left", fill="both", expand=False)
    stp_btn.pack(side="left", fill="both", expand=False)
    

    希望这能解决你的问题。

    【讨论】:

    • 谢谢。它解决了这个问题。你能详细说明cnf_cnfmerge是什么
    • _cnfmerge 是一个内置的 tkinter 函数,用于合并 cnfkw。如果您决定提供{'text': 'hello', 'bg': 'blue'}cnf={} 之类的参数,我将kwcnf 合并,这样代码会变小并且不会出现任何错误。虽然只要你传递像text='hello', bg='blue' 这样的参数,那么你就不需要它。
    猜你喜欢
    • 2016-12-27
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    相关资源
    最近更新 更多