在某些场合,例如在wxPython中,我遇到了标志的概念。一个示例是帧对象的初始化。 传递给“样式”的属性。
frame = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
我不太了解标志的概念。我什至还没有找到扎实的解释来解释术语“标志”在Python中的确切含义。所有这些属性如何传递给一个变量? 我唯一能想到的就是“ |”字符用作布尔运算符,但是在那种情况下,传递给style的所有属性不是仅求值一个布尔表达式吗?
答案 0 :(得分:0)
在这种意义上,标志通常意味着单个整数值中的位。 |
是常用的位或运算符。
比方说wx.MAXIMIZE_BOX=8
和wx.RESIZE_BORDER=4
,如果您或他们在一起,则得到12。在这种情况下,您实际上可以使用+
运算符代替|
。
尝试打印常量print(wx.MAXIMIZE_BOX)
等,您可能会更好地理解。
答案 1 :(得分:0)
它是一个布尔运算符-不是逻辑运算符,而是按位运算符。 wx.MAXIMIZE_BOX
和其余的通常是整数,它们是2-1、2、4、8、16的幂...这样就使得它们中只有一位为1,其余的均为0。当对这些整数应用按位或(x | y
)时,最终结果是它们结合在一起:2 | 8
(0b00000010 | 0b00001000
)变为10(0b00001010
)。以后可以使用按位AND(x & y
)运算符将它们撬开,也可以调用屏蔽运算符:10 & 8 > 0
将为true,因为与8
对应的位已打开。
答案 2 :(得分:0)
标记不是Python特有的;这是许多语言中使用的概念。它们基于位和字节的概念,计算机内存实际上使用大量的 flags 存储信息。这些标志是bits,它们是关闭的(值0
)或打开的(值1
),即使您通常以至少8个这样的标志的组访问计算机内存( bytes,对于较大的组,words为8的倍数,具体取决于计算机体系结构。
整数是一个简单而通用的representation of the information stored in bytes;一个字节可以存储0到255之间的任何整数,而更多字节则可以表示更大的整数。但是这些整数仍然由打开或关闭的位组成,因此您可以将其用作开关来启用或禁用功能。您传入启用或禁用了特定位的特定整数值来打开和关闭功能。
因此,一个字节由8个标志(位)组成,启用这些标志之一意味着您具有8个不同的整数; 1、2、4、8、16、32、64和128,您可以将这些数字的组合传递给wxPython之类的库来设置不同的选项。对于多字节整数,数字只会增加一倍。
但是您a)不想记住每个数字的含义,并且b)需要一种将它们组合成单个整数以继续进行下去的方法。
|
运算符执行后者,而wx.MAXIMIZE_BOX
,wx.RESIZE_BORDER
等名称只是由wxWidget设置的整数值的符号常量。项目放在各种C头文件中,并总结在wx/toplevel.h
和wx/defs.h
中:
/*
Summary of the bits used (some of them are defined in wx/frame.h and
wx/dialog.h and not here):
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | \_ wxCENTRE
| | | | | | | | | | | | | | \____ wxFRAME_NO_TASKBAR
| | | | | | | | | | | | | \_______ wxFRAME_TOOL_WINDOW
| | | | | | | | | | | | \__________ wxFRAME_FLOAT_ON_PARENT
| | | | | | | | | | | \_____________ wxFRAME_SHAPED
| | | | | | | | | | \________________ wxDIALOG_NO_PARENT
| | | | | | | | | \___________________ wxRESIZE_BORDER
| | | | | | | | \______________________ wxTINY_CAPTION_VERT
| | | | | | | \_________________________
| | | | | | \____________________________ wxMAXIMIZE_BOX
| | | | | \_______________________________ wxMINIMIZE_BOX
| | | | \__________________________________ wxSYSTEM_MENU
| | | \_____________________________________ wxCLOSE_BOX
| | \________________________________________ wxMAXIMIZE
| \___________________________________________ wxMINIMIZE
\______________________________________________ wxSTAY_ON_TOP
...
*/
和
/*
Summary of the bits used by various styles.
High word, containing styles which can be used with many windows:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | \_ wxFULL_REPAINT_ON_RESIZE
| | | | | | | | | | | | | | \____ wxPOPUP_WINDOW
| | | | | | | | | | | | | \_______ wxWANTS_CHARS
| | | | | | | | | | | | \__________ wxTAB_TRAVERSAL
| | | | | | | | | | | \_____________ wxTRANSPARENT_WINDOW
| | | | | | | | | | \________________ wxBORDER_NONE
| | | | | | | | | \___________________ wxCLIP_CHILDREN
| | | | | | | | \______________________ wxALWAYS_SHOW_SB
| | | | | | | \_________________________ wxBORDER_STATIC
| | | | | | \____________________________ wxBORDER_SIMPLE
| | | | | \_______________________________ wxBORDER_RAISED
| | | | \__________________________________ wxBORDER_SUNKEN
| | | \_____________________________________ wxBORDER_{DOUBLE,THEME}
| | \________________________________________ wxCAPTION/wxCLIP_SIBLINGS
| \___________________________________________ wxHSCROLL
\______________________________________________ wxVSCROLL
...
*/
|
运算符是bitwise OR operator;它结合了两个整数的位,每个匹配位都根据OR的布尔规则配对,并变成一个输出位。当对这些整数常量执行此操作时,您将获得一个启用了多个标志的新整数。
所以表达式
wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
为您提供一个整数,并设置位数9、6、11、29和12;在这里,我用'0'
和'1'
字符串表示位,用int(..., 2)
将这些字符串的序列解释为二进制表示的单个整数:
>>> fourbytes = ['0'] * 32
>>> fourbytes[9] = '1'
>>> fourbytes[6] = '1'
>>> fourbytes[11] = '1'
>>> fourbytes[29] = '1'
>>> fourbytes[12] = '1'
>>> ''.join(fourbytes)
'00000010010110000000000000000100'
>>> int(''.join(fourbytes), 2)
39321604
在接收端,可以使用&
按位AND运算符来测试是否设置了特定标志;如果未设置标志,则返回0
;如果已设置标志位,则返回与分配给标志常量的整数。在C语言和Python语言中,布尔测试中的 true 均为非零值,因此通常使用以下方法来测试特定标志:
if ( style & wxMAXIMIZE_BOX ) {
用于确定已设置特定标志,或者
if ( !(style & wxBORDER_NONE) )
测试相反的情况。