Флаги не являются уникальными для Python;это понятие используется во многих языках.Они основаны на понятиях битов и байтов , где компьютерная память хранит информацию, используя, по существу, огромное количество флагов .Этими флагами являются биты , они либо выключены (значение 0
), либо включены (значение 1
), даже если вы обычно обращаетесь к памяти компьютера группами не менее 8таких флагов ( байтов , а для больших групп слов , кратных 8, характерных для архитектуры компьютера).
Целые числа - простое и распространенное представление информации, хранящейся в байтах ;один байт может хранить любое целое число от 0 до 255, а с большим количеством байтов вы можете представлять большие целые числа.Но эти целые числа все еще состоят из битов, которые либо включены, либо выключены, и поэтому вы можете использовать их как переключатели для включения или отключения функций.Вы передаете определенные целочисленные значения с включенными или отключенными определенными битами для включения и выключения функций.
Таким образом, байт состоит из 8 флагов (битов), и включение одного из них означает, что у вас есть 8 различных целых чисел;1, 2, 4, 8, 16, 32, 64 и 128, и вы можете передать комбинацию этих чисел в библиотеку, например, wxPython, чтобы установить различные параметры.Для многобайтовых целых чисел числа просто увеличиваются в два раза.
Но вы а) не хотите вспоминать, что означает каждое число, и б) нужен метод объединения их в одно целое число, чтобыпередать.
Оператор |
выполняет последнее, а имена 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
...
*/
The *Оператор 1048 * является побитовым оператором ИЛИ ;он объединяет биты двух целых чисел, каждый совпадающий бит спаривается и превращается в выходной бит в соответствии с логическими правилами для ИЛИ.Когда вы делаете это для этих целочисленных констант, вы получаете новое целое число с включенными несколькими флагами.
Таким образом, выражение
wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
дает вам целое число с номерами битов 9, 611, 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
На принимающей стороне выможно использовать оператор &
побитового И для проверки, установлен ли определенный флаг;это возвращает 0
, если флаг не установлен, или то же самое целое число, которое назначено константе флага, если бит флага был установлен.И в C, и в Python ненулевое число равно true в логическом тесте, поэтому тестирование для определенного флага обычно выполняется с помощью:
if ( style & wxMAXIMIZE_BOX ) {
для определения того, что конкретныйустановлен флаг или
if ( !(style & wxBORDER_NONE) )
для проверки на обратное.