有人可以告诉我以下代码有什么问题吗?我尝试构建一个tkinker.listbox,其尺寸可以使用.config命令更改,但失败了。相反,它会产生"属性错误的错误:' MovListbox'对象没有属性''"代码附在下面供您参考。
非常感谢。
import tkinter
def test():
root = tkinter.Tk()
list = [' 1','2',' 3','4','5',' 6','7','8',' 9','10']
a = MovListbox(root, list)
a._setup_style(200, 200, EXTENDED)
class MovListbox(tkinter.Listbox):
def __init__(self, master=None, inputlist=None):
# super(MovListbox, self).__init__()
global NewsClassify_catList
NewsClassify_catList = tkinter.Listbox(master)
NewsClassify_catList.grid(row = 0 , column = 0, columnspan=2, sticky=N)
'''populate the news category onto the listbox'''
for i in range (0, inputlist.__len__()):
NewsClassify_catList.insert(END, inputlist[i])
master.mainloop()
def _setup_style(self, height=100, width=100, mode=EXTENDED):
self.config(height=height, width=width, selectmode=mode)
if __name__ == '__main__':
test()
答案 0 :(得分:1)
我对您的代码做了一些修改;它可能不完全是你想要的,但你应该觉得它很有帮助。
列表框宽度和高度选项不是像素测量;它们根据字符指定维度,因此height=12
使列表框12文本行变高,width=40
使列表框变为40个字符宽。
import tkinter as tk
def test():
root = tk.Tk()
lst = [' 1', '2', ' 3', '4', '5', ' 6', '7', '8', ' 9', '10']
a = MovListbox(root, lst)
a.grid(row=0, column=0, columnspan=2, sticky=tk.N)
a.setup_style(12, 40, tk.EXTENDED)
root.mainloop()
class MovListbox(tk.Listbox):
def __init__(self, master=None, inputlist=None):
super(MovListbox, self).__init__(master=master)
# Populate the news category onto the listbox
for item in inputlist:
self.insert(tk.END, item)
def setup_style(self, height=10, width=20, mode=tk.EXTENDED):
self.config(height=height, width=width, selectmode=mode)
if __name__ == '__main__':
test()
如果您愿意,可以删除a.setup_style(12, 40, tk.EXTENDED)
中的test()
来电,而不是
self.setup_style(12, 40, tk.EXTENDED)
在MovListbox.__init__()
方法的末尾。
我已将您的list
变量更改为lst
。 list
对于变量名称来说不是一个好选择,因为它会影响内置的list
类型,这可能会让人感到困惑,而且还会导致神秘的错误。
super
内置函数用于访问父类的方法。来自the docs:
super([type [,object-or-type]])
返回将方法调用委托给父或者的代理对象 兄弟姐妹类型。这对于访问继承的方法很有用 在课堂上被覆盖的。搜索顺序与此相同 getattr()使用,除了跳过类型本身。
因此
super(MovListbox, self).__init__(master=master)
表示调用MovListbox类的父类的__init__
方法,换句话说,tk.Listbox.__init__
方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为我们的MovListbox实例设置所有常用的Listbox内容,然后才开始用它来做额外的事情,比如从inputlist
插入字符串。 / p>
如果派生类没有定义自己的__init__
方法,则在创建派生类的实例时会自动调用父项中的__init__
方法。但是因为我们已经为MovListbox定义了一个__init__
方法,而是调用了新的__init__
。因此,要为MovListbox执行通常的Listbox初始化,我们需要手动调用Listbox的__init__
,并且以优雅方式执行此操作的习惯方法是使用super
。
实际上,在Python 3中,可以简化super
调用:
super().__init__(master)
我之前使用的表单在Python 2中是必需的。但是,super
仅适用于新式类(Python 3支持的唯一类),但不幸的是,Python 2 Tkinter使用了古老的类 - 其窗口小部件的样式类,并在此类上调用super
会引发TypeError
异常。 :(当使用旧式类时,我们必须通过显式指定父类来执行调用,如下所示:
tk.Listbox.__init__(self, master)
该语法在Python 3中也有效,但在它可用时通常首选使用super
。