tkinter如何设置好看的按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tkinter如何设置好看的按钮相关的知识,希望对你有一定的参考价值。

参考技术A 最好的应该是在flat样式下的Label上显示图片,通过事件绑定回调函数和各种事件下的鼠标、Label、图片样式。当然,这也是最复杂的

Tkinter:如何正确设置扩展 Button 类的参数?

【中文标题】Tkinter:如何正确设置扩展 Button 类的参数?【英文标题】:Tkinter: How do I properly set parameters of extended Button class? 【发布时间】:2022-01-02 07:39:18 【问题描述】:

我正在尝试使用 tkinterpython 创建客户关系管理程序,并希望根据数据库中的表生成按钮。

这个想法是数据库中的每个表都有一个按钮,以便在需要时可以查看和编辑表。

我想让每个按钮看起来都一样,并在单击时在我的程序的主框架中生成一个表格条目列表。为此,我想扩展 Button() 类,以便在定义 display_items 函数的同时保持一些属性并发:

class TabButton(Button):

    def __init__(self, *args, **kwargs):
        super().__init__(Button)
        self['bg'] = '#a1a1a1'
        self['font'] = ('Agency', 24)

    def display_items(self, tab):
        pass
        #mycursor.execute('SELECT * FROM (%s)', tab)

最后一行(上面)是从我的数据库中的正确表中选择数据的内容 - 我在找出课程的其余部分时已将其注释掉。我知道 *args 和 **kwargs 做什么,但我不确定它们在这个 __init__ 函数中的用途(我对类不是很熟悉,并从另一个 Stack Overflow 帖子中复制了这个类)。

为了生成按钮,我引用了一个dict 实例并将每个键分配给一个按钮:

tabs = 
    'Table1': '',
    'Table2': '',
    'Table3': '',


for tab in tabs:
    row = 0
    tabs[tab] = TabButton(side_frame, command=lambda: TabButton.display_items(tab))
    tabs[tab].grid(row=row, column=0)
    row += 1

问题是,当我运行程序时出现此错误:

AttributeError: type object 'Button' has no attribute 'tk'

欢迎任何和所有的指导!

如果您发现我的代码中有任何其他错误,请指出来吗?我对编程很陌生,它可以节省我在 Stack Overflow 上发表另一篇文章的时间。 :p

谢谢, J

【问题讨论】:

这能回答你的问题吗? super() in tkinter application 你好 @Thingamabobs ,我想我已经将 super() 更正为 super()__init__(Button),但我现在收到新错误:AttributeError: type object 'Button' has no attribute 'tk'。我绝对需要更深入地了解这里发生的事情。 super().__init__(master) master 等于 side_frame。因此,对于更改的最小限度,您需要执行 super().__init__(*args),而是在您的 init 方法中执行位置参数,例如:def __init__(self,master, *args, **kwargs) 嘿,谢谢,但 super() 不要求传递“自我”吗?我可以使用 super().__init__(side_frame) 运行代码,但结果在 GUI 中有点混乱。我哪里错了? 查看我的回答,如果对该主题有任何疑问,请告诉我。 【参考方案1】:

Super 返回该类的临时对象并让您访问其内容。 Super itself dosent accept any arguments。 另请参阅context 中的prupose of self。

self表示类的实例

通常,方法的第一个参数称为 self。这不重要 不仅仅是一个约定:self这个名字绝对没有什么特别之处 对 Python 的意义。但是请注意,不遵守约定 您的代码可能对其他 Python 程序员的可读性较差

另一个问题是您使用lambda。您的参数 tab 将被循环的每次迭代覆盖(如果未存储)。另一个问题是,您可能不打算将类用于此方法,而是希望被实例调用,因此我将参数 self 添加到您的方法中并更改了您的 lambda 以使用实例。

import tkinter as tk
tabs = 'Table1': '', 
        'Table2': '',
        'Table3': '',
        

root=tk.Tk()

class TabButton(tk.Button):
    def __init__(self,master, *args, **kwargs):
        #self is a reference to the instance of that object
        super().__init__(master)#super dosent need a reference
        self['bg'] = kwargs.get('bg','#a1a1a1')
        self['font'] = kwargs.get('font',('Agency', 24))
    def display_items(self,item):
        print(f'item to show')
for tab in tabs:
    b = TabButton(root) #returns a reference to that object
    b.configure(command=lambda btn=b, argument=tab:btn.display_items(argument))
    b.pack()

root.mainloop()

【讨论】:

以上是关于tkinter如何设置好看的按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tkinter 中的按钮设置“Entry”小部件的文本/值/内容

Python里tkinter如何重置单选按钮?

Tkinter:如何正确设置扩展 Button 类的参数?

Python tkinter能做出好看的图形界面么

如何在 tkinter 中为多个按钮创建全局样式?

如何使用tkinter按钮更改变量的值?