" CmdBtn [' menu'] = CmdBtn.menu"在倒数第二行意味着。
def makeCommandMenu():
CmdBtn = Menubutton(mBar, text='Button Commands', underline=0)
CmdBtn.pack(side=LEFT, padx="2m")
CmdBtn.menu = Menu(CmdBtn)
...
...
CmdBtn['menu'] = CmdBtn.menu
return CmdBtn
答案 0 :(得分:0)
使用x[y] = z
时,会调用__setitem__
方法。
即
x.__setitem__(y, z)
在您的情况下,CmdBtn['menu'] = CmdBtn.menu
表示
CmdBtn.__setitem__('menu', CmdBtn.menu)
Menubutton
类确实提供了__setitem__
method。看起来这用于设置"资源值" (在这种情况下为CmdBtn.menu
)给定密钥('menu'
)。
答案 1 :(得分:0)
这不是“数组中的字符串”。
括号运算符用于某种序列(通常是list
或tuple
)映射(通常是dict
或字典)或某些序列的项目访问其他类型的特殊对象(例如此MenuButton
对象,它不是序列或映射)。与其他语言不同,在python中,允许任何对象使用此运算符。
list
类似于其他语言的“数组”。它可以包含任何类型的对象的混合,并且它维护对象的顺序。当您想要维护有序的对象序列时,list
对象非常有用。您可以使用其索引访问list
中的对象,如下所示(索引从零开始):
x = [1,2,3] # this is a list
assert x[0] == 1 # access the first item in the list
x = list(range(1,4)) # another way to make the same list
当您想要将值与键相关联时,dict
(字典)非常有用,因此您可以稍后使用键查找值。像这样:
d = dict(a=1, b=2, c=3) # this is a dict
assert x['a'] == 1 # access the dict
d = {'a':1, 'b':2, 'c':3} # another way to make the same dict
最后,您可能还会遇到也使用相同项目访问界面的自定义对象。在Menubutton
情况下,['menu']
只是访问响应密钥'menu'
的某个项目(由tkinter API定义)。您也可以使用item-access创建自己的对象类型(下面是python 3代码):
class MyObject:
def __getitem__(self, x):
return "Here I am!"
除了为您提供的键值或索引值返回相同的字符串外,此对象没有太大作用:
obj = MyObject()
print(obj [100]) # Here I am!
print(obj [101]) # Here I am!
print(obj ['Anything']) # Here I am!
print(obj ['foo bar baz']) # Here I am!
答案 2 :(得分:0)
首先,在Python everything is an object中,方括号表示此对象是可订阅(例如tuple
,list
,dict
,string
等等。 Subscriptable意味着此对象至少实现了__getitem__()
方法(以及您的__setitem__()
)。
通过这些方法,您可以轻松地与班级成员互动,因此不要构建自己的榜样,以了解其他人的代码。
试试这个代码段:
class FooBar:
def __init__(self):
# just two simple members
self.foo = 'foo'
self.bar = 'bar'
def __getitem__(self, item):
# example getitem function
return self.__dict__[item]
def __setitem__(self, key, value):
# example setitem function
self.__dict__[key] = value
# create an instance of FooBar
fb = FooBar()
# lets print members of instance
# also try to comment out get and set functions to see the difference
print(fb['foo'], fb['bar'])
# lets try to change member via __setitem__
fb['foo'] = 'baz'
# lets print members of instance again to see the difference
print(fb['foo'], fb['bar'])
答案 3 :(得分:0)
这是CmdBtn.configure(menu=CmdBtn.menu)
设置窗口小部件选项的方法通常是在创建时(例如:Menubutton(..., menu=...)
)或使用configure
方法(例如:CmdBtn.configure(menu=...)
.Tkinter提供第三种方法,即将小部件视为字典,其中配置值是字典的键(例如:CMdBtn['menu']=...
)
官方python tkinter文档的<{3}}部分介绍了这一点