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 【问题描述】:我正在尝试使用 tkinter 和 python 创建客户关系管理程序,并希望根据数据库中的表生成按钮。
这个想法是数据库中的每个表都有一个按钮,以便在需要时可以查看和编辑表。
我想让每个按钮看起来都一样,并在单击时在我的程序的主框架中生成一个表格条目列表。为此,我想扩展 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如何设置好看的按钮的主要内容,如果未能解决你的问题,请参考以下文章