python 3.5 tkinter.listbox更改大小
谁能告诉我下面的代码出了什么问题?我尝试构建一个tkinker.listbox,其中的维度可以用.config命令更改,但失败了。相反,它会产生“AttributeError:'MovListbox'对象没有属性'tk'”的错误。下面附上代码供您参考 非常感谢python 3.5 tkinter.listbox更改大小,python,python-3.x,tkinter,listbox,Python,Python 3.x,Tkinter,Listbox,谁能告诉我下面的代码出了什么问题?我尝试构建一个tkinker.listbox,其中的维度可以用.config命令更改,但失败了。相反,它会产生“AttributeError:'MovListbox'对象没有属性'tk'”的错误。下面附上代码供您参考 非常感谢 import tkinter def test(): root = tkinter.Tk() list = [' 1','2',' 3','4','5',' 6','7','8',' 9','10']
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()
我对你的代码做了一些修改;这可能不完全是你想要的,但你应该发现它很有用 列表框宽度和高度选项不是像素测量值;它们以字符为单位指定尺寸,因此
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\u样式(12,40,tk.EXTENDED)
调用test()
,而不是
self.setup_style(12, 40, tk.EXTENDED)
在MovListbox.\uuuu init\uuuu()
方法的末尾
我已将您的列表
变量更改为lst
<代码>列表对于变量名来说不是一个好的选择,因为它隐藏了内置的列表
类型,这可能会造成混淆,也可能导致神秘的bug
super
内置函数用于访问父类的方法。发件人:
super([type[,object或type]])
返回代理对象,该代理对象将方法调用委托给父对象或
类型的兄弟类。这对于访问继承的方法很有用
已在类中重写的。搜索顺序与此相同
由getattr()使用,但类型本身被跳过
因此
表示调用MovListbox类的父类的\uuuuu init\uuuu
方法,换句话说,就是tk.Listbox.\uuuuu init\uuuu
方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为MovListbox实例设置所有常用的Listbox内容,然后再开始使用它做额外的工作,比如插入inputlist
中的字符串
如果派生类没有定义自己的\uuuuu init\uuuuu
方法,则在创建派生类的实例时,会自动调用父类的\uuuuuuuu init\uuuuuu
方法。但是因为我们已经为MovListbox定义了一个\uuuuu init\uuuu
方法,所以会调用新的\uuuuu init\uuu
。因此,要为MovListbox执行通常的Listbox初始化,我们需要手动调用Listbox的\uuuu init\uuuu
,通常的方法是使用super
实际上,在Python 3中,super
调用可以简化:
super().__init__(master)
我前面使用的表单在Python 2中是必需的。然而,super
仅适用于新型类(Python 3支持的唯一类),但不幸的是,Python 2 Tkinter将古老的老式类用于其小部件,对此类类调用super
会引发TypeError
异常(在使用旧式类时,我们必须通过显式指定父类来执行调用,如下所示:
tk.Listbox.__init__(self, master)
这种语法在Python3中也是有效的,但通常在可用时最好使用
super
。我对您的代码做了一些修改;这可能不是您想要的,但您应该会发现它很有用
列表框宽度和高度选项不是像素测量值;它们以字符为单位指定尺寸,因此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\u样式(12,40,tk.EXTENDED)
调用test()
,而不是
self.setup_style(12, 40, tk.EXTENDED)
在MovListbox.\uuuu init\uuuu()
方法的末尾
我已将您的list
变量更改为lst
list
对于变量名来说不是一个好的选择,因为它会隐藏内置的list
类型,这可能会造成混淆,也可能导致神秘的错误
super
内置函数用于访问父类的方法。来自:
super([type[,object或type]])
返回代理对象,该代理对象将方法调用委托给父对象或
类型的同级类。这对于访问继承的方法很有用
已在类中重写的。搜索顺序与
由getattr()使用,但类型本身被跳过
因此
说调用MovListbox类的父类的\uuuuuu init\uuuuu
方法,换句话说,tk.Listbox.\uuuuuu init\uuuu
方法。我们需要这样做,因为MovListbox是从tk.Listbox派生的,我们需要为MovListbox实例设置所有常用的Listbox内容,然后再开始使用它做额外的工作,比如从inputlist
插入字符串
如果派生类没有定义自己的\uuuuu init\uuuuu
方法,那么当您创建派生类的实例时,会自动调用父类的\uuuu init\uuuuu
方法。但是,因为我们为MovListbox定义了一个\uuu init\uuuuuuu
方法,所以会调用新的\uuu init\uuuuuu
,以获得通常的为MovListbox执行的istbox初始化我们需要手动调用Listbox的\uuuu init\uuuu
,通常的方法是使用super
实际上,在Python 3中,super
调用可以简化:
super().__init__(master)
我前面使用的表单在Python2中是必需的。然而,super
仅适用于新样式的类(Python3支持的唯一类),但不幸的是,Python2 Tkinter将古老的旧样式类用于其小部件,对此类类调用super
会引发TypeError
异常(当使用旧式类时,我们必须通过显式指定父类来执行调用,如