Merge remote-tracking branch 'iron/master'

This commit is contained in:
Lin JH 2018-06-11 23:33:34 +08:00
commit b1f0904f1a
115 changed files with 17755 additions and 318 deletions

63
.gitattributes vendored Normal file
View file

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

View file

@ -1,5 +1,6 @@
eclipse.preferences.version=1
encoding//ActiveX\u7A97\u53E3/AxWidget.py=utf-8
encoding//C\u548CC++\u6269\u5C55/py\u8F6Cpyd/pydmod.py=utf-8
encoding//Json\u751F\u6210QTreeWidget/Json\u751F\u6210\u6811\u5F62\u7ED3\u6784.py=utf-8
encoding//PyQtChart\u7EC3\u4E60/ChartView/ChartView.py=utf-8
encoding//PyQtChart\u7EC3\u4E60/ChartView/ChatWidget.py=utf-8
@ -15,6 +16,10 @@ encoding//QGraphicsView\u7EC3\u4E60/\u6DFB\u52A0QWidget.py=utf-8
encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImagePs.py=utf-8
encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImageThread.py=utf-8
encoding//QGraphicsView\u7EC3\u4E60/\u7B80\u5355\u56FE\u50CF\u5904\u7406/SimpleImageView.py=utf-8
encoding//QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/qrctest1.py=utf-8
encoding//QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/qrctest2.py=utf-8
encoding//QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/res_rc.py=utf-8
encoding//QRC\u8D44\u6E90\u6587\u4EF6\u4F7F\u7528/textread.py=utf-8
encoding//tmp/LocalClient.py=utf-8
encoding//tmp/Material/Effect/LineEffect.py=utf-8
encoding//tmp/Material/Utils/Colors.py=utf-8
@ -43,6 +48,12 @@ encoding//\u591A\u7EBF\u7A0B\u4F7F\u7528/\u7EBF\u7A0B\u6302\u8D77\u6062\u590D.py
encoding//\u5B57\u4F53\u6D4B\u8BD5/FontAwesome.py=utf-8
encoding//\u5B57\u4F53\u6D4B\u8BD5/TestFontAwesome.py=utf-8
encoding//\u5B57\u4F53\u6D4B\u8BD5/TestFontRoboto.py=utf-8
encoding//\u5DE6\u4FA7\u9009\u9879\u5361/LeftTabWidget.py=utf-8
encoding//\u63A2\u6D4B\u7A97\u53E3\u548C\u653E\u5927\u622A\u56FE/\u7B80\u5355\u63A2\u6D4B\u7A97\u53E3\u548C\u653E\u5927\u622A\u56FE.py=utf-8
encoding//\u6570\u636E\u5E93\u67E5\u8BE2\u663E\u793A\u8868\u683C/main.py=utf-8
encoding//\u6570\u636E\u5E93\u67E5\u8BE2\u663E\u793A\u8868\u683C/mainui.py=utf-8
encoding//\u65E0\u8FB9\u6846\u81EA\u5B9A\u4E49\u6807\u9898\u680F\u7A97\u53E3/FramelessWindow.py=utf-8
encoding//\u65E0\u8FB9\u6846\u81EA\u5B9A\u4E49\u6807\u9898\u680F\u7A97\u53E3/Test.py=utf-8
encoding//\u68A6\u5E7B\u6811/DreamTree.py=utf-8
encoding//\u6C14\u6CE1\u63D0\u793A/BubbleTips.py=utf-8
encoding//\u6D4F\u89C8\u5668\u83B7\u53D6Cookie/WebEngineView.py=utf-8
@ -62,6 +73,8 @@ encoding//\u754C\u9762\u7F8E\u5316/QPushButton\u8FDB\u5EA6\u52A8\u753B/PushButto
encoding//\u754C\u9762\u7F8E\u5316/QSS\u7F8E\u5316\u4F8B\u5B50/QProgressBar\u8FDB\u5EA6\u6761\u6837\u5F0F/ProgressBar.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/QSS\u7F8E\u5316\u4F8B\u5B50/QPushButton\u6309\u94AE/ButtonHover.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/QScrollBar\u6EDA\u52A8\u6761\u6837\u5F0F/ScrollBar.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/QSlider\u7F8E\u5316/PaintQSlider.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/QSlider\u7F8E\u5316/QssQSlider.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/\u6C34\u6CE2\u7EB9\u8FDB\u5EA6\u6761/ProgressBar.py=utf-8
encoding//\u754C\u9762\u7F8E\u5316/\u6C34\u6CE2\u7EB9\u8FDB\u5EA6\u6761/TestWidget.py=utf-8
encoding//\u7A0B\u5E8F\u91CD\u542F/AutoRestart.py=utf-8

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2037
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pydext", "pydext\pydext.vcxproj", "{023C9F4B-FECC-430A-81D2-7044FAFF15D0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Debug|x64.ActiveCfg = Debug|x64
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Debug|x64.Build.0 = Debug|x64
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Debug|x86.ActiveCfg = Debug|Win32
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Debug|x86.Build.0 = Debug|Win32
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Release|x64.ActiveCfg = Release|x64
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Release|x64.Build.0 = Release|x64
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Release|x86.ActiveCfg = Release|Win32
{023C9F4B-FECC-430A-81D2-7044FAFF15D0}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FB11C75A-F832-45BC-BEB7-40ED2F7A3A3B}
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,15 @@
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\vc141.pdb
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.obj
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.pyd
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.pdb
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.lib
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.exp
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.ipdb
f:\python\github\pyqt\c和c++扩展\pydext\release\pydext.iobj
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\cl.command.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\cl.read.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\cl.write.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\link.command.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\link.read.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\link.write.1.tlog
f:\python\github\pyqt\c和c++扩展\pydext\pydext\release\pydext.tlog\pydext.write.1u.tlog

View file

@ -0,0 +1,7 @@
F:\Python\Github\PyQt\C和C++扩展\pydext\pydext\pydext.vcxproj(201,5): warning : Python debug symbols are not installed. Installing the symbols through the Python installer is strongly recommended.
pydext.c
正在创建库 F:\Python\Github\PyQt\C和C++扩展\pydext\Release\pydext.lib 和对象 F:\Python\Github\PyQt\C和C++扩展\pydext\Release\pydext.exp
正在生成代码
All 5 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
pydext.vcxproj -> F:\Python\Github\PyQt\C和C++扩展\pydext\Release\pydext.pyd

Binary file not shown.

View file

@ -0,0 +1,2 @@
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.16299.0
Release|Win32|F:\Python\Github\PyQt\C和C++扩展\pydext\|

Binary file not shown.

View file

@ -0,0 +1,5 @@
cd %~dp0
python setup.py build
pause

View file

@ -0,0 +1,92 @@
#include <Python.h>
// 无参数
PyObject *pydext_hello(PyObject *self) {
return Py_BuildValue("s", "this is hello function");
}
// 可以解析普通参数
// 这里就解析一个好了
PyObject *pydext_hello2(PyObject *self, PyObject *args) {
char *name = "";
if (!PyArg_ParseTuple(args, "s", &name)) {
PyErr_SetString(PyExc_ValueError, "parameter must be str");
return NULL;
}
return Py_BuildValue("s", name);
}
PyDoc_STRVAR(pydext_sum_doc, "sum(x, y, minus=False)\
\
sum function, if minus=True then return -(x+y)");
// 可以解析普通参数和指定参数
PyObject *pydext_sum(PyObject *self, PyObject *args, PyObject *kwargs) {
/* Shared references that do not need Py_DECREF before returning. */
int x = 0;
int y = 0;
int minus = 0;
/* Parse positional and keyword arguments */
static char* keywords[] = { "x", "y", "minus", NULL };
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii|$p", keywords, &x, &y, &minus)) {
PyErr_SetString(PyExc_ValueError, "x and y must be int, and minus must be True or False");
return NULL;
}
/* Function implementation starts here */
if (minus == 1)
return Py_BuildValue("i", -(x + y));
return Py_BuildValue("i", x + y);
}
/*
* List of functions to add to pydext in exec_pydext().
*/
static PyMethodDef pydext_functions[] = {
{ "hello", (PyCFunction)pydext_hello, METH_NOARGS, NULL },
{ "hello2", (PyCFunction)pydext_hello2, METH_VARARGS, NULL },
{ "sum", (PyCFunction)pydext_sum, METH_VARARGS | METH_KEYWORDS, pydext_sum_doc },
{ NULL, NULL, 0, NULL } /* marks end of array */
};
/*
* Initialize pydext. May be called multiple times, so avoid
* using static state.
*/
int exec_pydext(PyObject *module) {
PyModule_AddFunctions(module, pydext_functions);
PyModule_AddStringConstant(module, "__author__", "Irony");
PyModule_AddStringConstant(module, "__mail__", "892768447@qq.com");
PyModule_AddStringConstant(module, "__version__", "1.0.0");
return 0; /* success */
}
/*
* Documentation for pydext.
*/
PyDoc_STRVAR(pydext_doc, "The pydext module");
static PyModuleDef_Slot pydext_slots[] = {
{ Py_mod_exec, exec_pydext },
{ 0, NULL }
};
static PyModuleDef pydext_def = {
PyModuleDef_HEAD_INIT,
"pydext",
pydext_doc,
0, /* m_size */
NULL, /* m_methods */
pydext_slots,
NULL, /* m_traverse */
NULL, /* m_clear */
NULL, /* m_free */
};
PyMODINIT_FUNC PyInit_pydext() {
return PyModuleDef_Init(&pydext_def);
}

View file

@ -0,0 +1,203 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{023C9F4B-FECC-430A-81D2-7044FAFF15D0}</ProjectGuid>
<RootNamespace>pydext</RootNamespace>
<PythonVersion>3.5</PythonVersion>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Label="PythonConfiguration">
<RegistryView>RegistryView.Registry32</RegistryView>
<RegistryView Condition="$(Platform) == 'x64'">RegistryView.Registry64</RegistryView>
<PythonTag>$(PythonVersion)-32</PythonTag>
<PythonTag Condition="$(Platform) == 'x64'">$(PythonVersion)</PythonTag>
<PythonHome Condition="$(PythonHome) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', null, null, $(RegistryView)))</PythonHome>
<PythonHome Condition="$(PythonHome) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', null, null, $(RegistryView)))</PythonHome>
<PythonExe Condition="$(PythonExe) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', 'ExecutablePath', null, $(RegistryView)))</PythonExe>
<PythonExe Condition="$(PythonExe) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', 'ExecutablePath', null, $(RegistryView)))</PythonExe>
<PythonExe Condition="$(PythonExe) == '' and $(PythonHome) != ''">$(PythonHome)python.exe</PythonExe>
<PythonDevVersion>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'dev', null, $(RegistryView)))</PythonDevVersion>
<PythonDevVersion Condition="$(PythonDevVersion) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'dev', null, $(RegistryView)))</PythonDevVersion>
<PythonCorePDBVersion>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'core_pdb', null, $(RegistryView)))</PythonCorePDBVersion>
<PythonCorePDBVersion Condition="$(PythonCorePDBVersion) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'core_pdb', null, $(RegistryView)))</PythonCorePDBVersion>
<PythonCoreDVersion>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'core_d', null, $(RegistryView)))</PythonCoreDVersion>
<PythonCoreDVersion Condition="$(PythonCoreDVersion) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstalledFeatures', 'core_d', null, $(RegistryView)))</PythonCoreDVersion>
<PythonDebugSuffix Condition="$(PythonCoreDVersion) != ''">_d</PythonDebugSuffix>
<PythonDExe Condition="$(PythonExe) != '' and $(PythonDExe) == ''">$([System.IO.Path]::GetDirectoryName($(PythonExe)))\python$(PythonDebugSuffix).exe</PythonDExe>
<PythonDExe Condition="!Exists($(PythonDExe))">$(PythonExe)</PythonDExe>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup>
<DefaultDebuggerFlavor>WindowsLocalDebugger</DefaultDebuggerFlavor>
<DefaultDebuggerFlavor Condition="$(HasPythonDebugLaunchProvider) == 'true'">PythonDebugLaunchProvider</DefaultDebuggerFlavor>
</PropertyGroup>
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>pydext$(PythonDebugSuffix)</TargetName>
<TargetExt>.pyd</TargetExt>
<LocalDebuggerCommand>$(PythonDExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>-i -c "print('&gt;&gt;&gt; import pydext'); import pydext"</LocalDebuggerCommandArguments>
<LocalDebuggerEnvironment>PYTHONPATH=$(OutDir)</LocalDebuggerEnvironment>
<DebuggerFlavor>$(DefaultDebuggerFlavor)</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>pydext</TargetName>
<TargetExt>.pyd</TargetExt>
<LocalDebuggerCommand>$(PythonExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>-i -c "print('&gt;&gt;&gt; import pydext'); import pydext"</LocalDebuggerCommandArguments>
<LocalDebuggerEnvironment>PYTHONPATH=$(OutDir)</LocalDebuggerEnvironment>
<DebuggerFlavor>$(DefaultDebuggerFlavor)</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<TargetName>pydext$(PythonDebugSuffix)</TargetName>
<TargetExt>.pyd</TargetExt>
<LocalDebuggerCommand>$(PythonDExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>-i -c "print('&gt;&gt;&gt; import pydext'); import pydext"</LocalDebuggerCommandArguments>
<LocalDebuggerEnvironment>PYTHONPATH=$(OutDir)</LocalDebuggerEnvironment>
<DebuggerFlavor>$(DefaultDebuggerFlavor)</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<TargetName>pydext</TargetName>
<TargetExt>.pyd</TargetExt>
<LocalDebuggerCommand>$(PythonExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>-i -c "print('&gt;&gt;&gt; import pydext'); import pydext"</LocalDebuggerCommandArguments>
<LocalDebuggerEnvironment>PYTHONPATH=$(OutDir)</LocalDebuggerEnvironment>
<DebuggerFlavor>$(DefaultDebuggerFlavor)</DebuggerFlavor>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<RuntimeLibrary Condition="$(PythonCoreDVersion) == ''">MultithreadedDLL</RuntimeLibrary>
<AdditionalIncludeDirectories>D:\soft\Python35\include;$(PythonHome)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(PythonHome)libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<RuntimeLibrary Condition="$(PythonCoreDVersion) == ''">MultithreadedDLL</RuntimeLibrary>
<AdditionalIncludeDirectories>$(PythonHome)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(PythonHome)libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>Multithreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>D:\soft\Python35\include;$(PythonHome)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<IgnoreSpecificDefaultLibraries>libucrt.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<AdditionalDependencies>ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(PythonHome)libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>Multithreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>$(PythonHome)Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<IgnoreSpecificDefaultLibraries>libucrt.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<AdditionalDependencies>ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(PythonHome)libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="pydext.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<Target Name="_ValidatePythonInstall" BeforeTargets="PrepareForBuild">
<Error Condition="$(PythonHome) == ''" Text="Python $(PythonTag) is not installed. Please install Python $(PythonTag) and try again." />
<Error Condition="$(PythonDevVersion) == ''" Text="Python development files are not installed. Please add the development files, or repair your existing installation." />
<Warning Condition="$(PythonCorePDBVersion) == ''" Text="Python debug symbols are not installed. Installing the symbols through the Python installer is strongly recommended." />
</Target>
</Project>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="pydext.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

View file

@ -0,0 +1,8 @@
from distutils.core import setup, Extension
module = Extension('pydext', sources = ['pydext.c'])
setup (name = 'pydext',
version = '1.0.0',
description = 'This is pydext',
ext_modules = [module])

View file

@ -0,0 +1,22 @@
import sys
sys.path.insert(0,
'./build/lib.{0}-{1}.{2}'.format(sys.platform, sys.version_info.major, sys.version_info.minor))
import pydext
print(pydext)
print(dir(pydext))
print(pydext.__author__)
print(pydext.__mail__)
print(pydext.hello())
print(pydext.hello2('Irony'))
print(pydext.sum(1, 5))
# 结果变负数
print(pydext.sum(1, 5, minus=True))

View file

@ -0,0 +1 @@
该目录下的setup.py是在vs编译环境的cmd下调用build.bat进行编译生成build文件夹。然后执行python test.py 对build文件夹中的pyd进行测试

View file

@ -0,0 +1,19 @@
import sys
sys.path.insert(0, './Release')
import pydext
print(pydext)
print(dir(pydext))
print(pydext.__author__)
print(pydext.__mail__)
print(pydext.hello())
print(pydext.hello2('Irony'))
print(pydext.sum(1, 5))
# 结果变负数
print(pydext.sum(1, 5, minus=True))

View file

@ -0,0 +1 @@
该目录的test.py是用vs打开pydext.sln编译后生成的Release文件夹里的pyd进行测试

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
#%%cython
import numpy as np
cimport numpy as np
np.import_array()
# 参考http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html?highlight=cdef%20extern%20from
# 参考https://www.zhihu.com/question/23003213
cdef extern from "CalSpecSpeaLib.h":
void cal_spec_accel(double acc[], int len, double dt, double maxPeriod, double periodStep, double dampRatio, double *Period, double *Fre, double *MAcc, double *MVel, double *MDis, int numt)
def calspecaccel(np.ndarray[double, ndim=1, mode="c"] acc, int length, double dt, double maxPeriod, double periodStep, double dampRatio):
cdef int numt = int(maxPeriod / periodStep) + 1
# 初始化各存储数据
cdef np.ndarray[double, ndim=1] Fre = np.zeros(numt, float)
cdef np.ndarray[double, ndim=1] MDis = np.zeros(numt, float)
cdef np.ndarray[double, ndim=1] MVel = np.zeros(numt, float)
cdef np.ndarray[double, ndim=1] MAcc = np.zeros(numt, float)
#产生501个
cdef np.ndarray[double, ndim=1] Period = np.arange(0.0, maxPeriod + periodStep, periodStep) # 10.0 + 0.02, 0.02
Period[0] = 0.001
# 调用CalSpecSpeaLib.cpp定义的函数对数组进行处理
cal_spec_accel(<double*> np.PyArray_DATA(acc), length, dt, maxPeriod, periodStep, dampRatio,
<double*> np.PyArray_DATA(Period), <double*> np.PyArray_DATA(Fre),
<double*> np.PyArray_DATA(MAcc), <double*> np.PyArray_DATA(MVel),
<double*> np.PyArray_DATA(MDis), numt)
return Period, Fre, MAcc, MVel, MDis

View file

@ -0,0 +1,63 @@
#include "CalSpecSpeaLib.h"
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
double maxabs(double num[], int len)
{
//略
return abs(num[0]);
}
bool isALLvaluezero(double num[], int len)
{
//略
return false;
}
void cal_spec_accel(double acc[], int len, double dt, double maxPeriod, double periodStep, double dampRatio, double *Period, double *Fre, double *MAcc, double *MVel, double *MDis, int numt)
{
//略
Period[0] = 99.95;
Fre[0] = 99.96;
MAcc[0] = 99.97;
MVel[0] = 99.98;
MDis[0] = 99.99;
}
int main()
{
double acc[20] = { 0.0038,0.0049,0.0061,0.0075,0.0088,0.01,0.0112,0.0123,0.0133,0.0140,0.0146,0.0152,0.0157,0.0162,0.0167,0.0172,0.0175,0.0178,0.0179,0.0179 };
int len = 20;
double dt = 0.005;
double maxPeriod = 10.0;
double periodStep = 0.02;
double dampRatio = 0.05;
int numt = int(maxPeriod / periodStep) + 1;
double *Fre = new double[numt];
double *MDis = new double[numt];
double *MVel = new double[numt];
double *MAcc = new double[numt];
double *Period = new double[numt];
for (int i = 0; i<numt; i++) {
Period[i] = periodStep*i;
Fre[i] = 0;
MDis[i] = 0;
MVel[i] = 0;
MAcc[i] = 0;
}
Period[0] = 0.001;
//cal_spec_accel(double acc[], int len,double dt,double maxPeriod,double periodStep,double dampRatio,double *Period,double *Fre,double *MAcc,double *MVel,double *MDis)
cal_spec_accel(acc, len, dt, maxPeriod, periodStep, dampRatio, Period, Fre, MAcc, MVel, MDis, numt);
for (int i = 0; i<numt; i++)
{
cout << MAcc[i] << endl;
}
delete[] Fre;
return 0;
}

View file

@ -0,0 +1,3 @@
double maxabs(double num[], int len);
bool isALLvaluezero(double num[], int len);
void cal_spec_accel(double acc[], int len, double dt, double maxPeriod, double periodStep, double dampRatio, double *Period, double *Fre, double *MAcc, double *MVel, double *MDis, int numt);

View file

@ -0,0 +1,7 @@
cd %~dp0
python setup.py build
python test.py
pause

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
from distutils.core import setup, Extension
from Cython.Distutils import build_ext
import numpy
setup(
cmdclass={'build_ext': build_ext},
ext_modules=[Extension("CalSpecSpea", sources=[
"CalSpecSpea.pyx", "CalSpecSpeaLib.cpp"], language="c++", include_dirs=[numpy.get_include()])]
)

View file

@ -0,0 +1,32 @@
import sys
import time
sys.path.append(
'./build/lib.{0}-{1}.{2}'.format(sys.platform, sys.version_info.major, sys.version_info.minor))
from CalSpecSpea import calspecaccel
import matplotlib.pyplot as plt
import numpy as np
t1 = time.time()
acc = np.loadtxt('hf_acc.txt')
dt = 0.005
maxPeriod = 10.0
periodStep = 0.02
dampRatio = 0.05
Period, Fre, MAcc, MVel, MDis = calspecaccel(
acc, acc.shape[0], dt, maxPeriod, periodStep, dampRatio)
print('Period[0]', Period[0])
print('Fre[0]', Fre[0])
print('MAcc[0]', MAcc[0])
print('MVel[0]', MVel[0])
print('MDis[0]', MDis[0])
t2 = time.time() - t1
print(t2)
plt.plot(Period, MAcc)
plt.show()

View file

@ -0,0 +1,7 @@
cd %~dp0
python setup.py build
python test.py
pause

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,19 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created on 2018年5月6日
# author: Irony
# site: https://github.com/892768447
# email: 892768447@qq.com
# file:
# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0
def sum(x, y):
return x + y

View file

@ -0,0 +1,9 @@
from distutils.core import setup, Extension
from Cython.Distutils import build_ext
setup(
cmdclass={'build_ext': build_ext},
ext_modules=[Extension("pydmod", sources=["pydmod.py"])]
)

View file

@ -0,0 +1,7 @@
import sys
sys.path.insert(0,
'./build/lib.{0}-{1}.{2}'.format(sys.platform, sys.version_info.major, sys.version_info.minor))
import pydmod
print(pydmod)
print(pydmod.sum(1, 5))

View file

@ -0,0 +1,34 @@
# 图片加载测试
### [Python3.4.4 or Python3.5][PyQt5]
### 分别通过2种情况加载图片文件和资源文件
1. 通过pyrcc5转换res.qrc为res_rc.py文件可以直接import加载
- 转换命令pyrcc5 res.qrc -o res_rc.py
- import res_rc
- 此时可以通过QPixmap(":/images/head.jpg")来加载
2. 通过rcc命令转成为二进制文件res.rcc
- 转换命令cd tools
- rcc.exe -binary ../res.qrc -o ../res.data
- 通过QResource.registerResource("res.data")注册
- 此时可以通过QPixmap(":/images/head.jpg")来加载
3. 文本资源读取
```
def readText(path):
file = QFile(path)
if not file.open(QIODevice.ReadOnly):
return ''
stream = QTextStream(file)
#下面这句设置编码根据文件的编码自行确定
stream.setCodec(QTextCodec.codecForName('UTF-8'))
data = stream.readAll()
file.close()
del stream
return data
```
其它方式见https://github.com/892768447/PyQt/tree/master/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -0,0 +1,44 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2018年05月01日
@author: Irony."[讽刺]
@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447
@email: 892768447@qq.com
@file: qrctest1
@description:
'''
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QLabel
import res_rc # @UnusedImport @UnresolvedImport
__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
class ImageView(QLabel):
def __init__(self, *args, **kwargs):
super(ImageView, self).__init__(*args, **kwargs)
self.resize(800, 600)
# 从资源文件res_rc.py中加载
# 转换命令pyrcc5 res.qrc -o res_rc.py
# 这种方式是从通过pyrcc5转换res.qrc为res_rc.py文件可以直接import加载
# 此时可以通过路径:/images/head.jpg来访问
self.setPixmap(QPixmap(":/images/head.jpg"))
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
app.aboutToQuit.connect(res_rc.qCleanupResources) # 退出时要清理资源
w = ImageView()
w.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,44 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2018年05月01日
@author: Irony."[讽刺]
@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447
@email: 892768447@qq.com
@file: qrctest2
@description:
'''
from PyQt5.QtCore import QResource
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QLabel
__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
class ImageView(QLabel):
def __init__(self, *args, **kwargs):
super(ImageView, self).__init__(*args, **kwargs)
self.resize(800, 600)
self.setPixmap(QPixmap(":/images/head.jpg"))
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
# 从二进制资源文件res.data中加载
# 转换命令cd tools
# rcc.exe -binary ../res.qrc -o ../res.data
# 此时需要注册
QResource.registerResource("res.data")
app.aboutToQuit.connect(lambda: QResource.unregisterResource("res.data"))
w = ImageView()
w.show()
sys.exit(app.exec_())

Binary file not shown.

View file

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>images/head.jpg</file>
<file>README.md</file>
</qresource>
</RCC>

View file

@ -0,0 +1,545 @@
# -*- coding: utf-8 -*-
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.10.1)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x04\x0e\
\x23\
\x20\xe5\x9b\xbe\xe7\x89\x87\xe5\x8a\xa0\xe8\xbd\xbd\xe6\xb5\x8b\
\xe8\xaf\x95\x0d\x0a\x0d\x0a\x23\x23\x23\x20\x5b\x50\x79\x74\x68\
\x6f\x6e\x33\x2e\x34\x2e\x34\x20\x6f\x72\x20\x50\x79\x74\x68\x6f\
\x6e\x33\x2e\x35\x5d\x5b\x50\x79\x51\x74\x35\x5d\x0d\x0a\x0d\x0a\
\x23\x23\x23\x20\xe5\x88\x86\xe5\x88\xab\xe9\x80\x9a\xe8\xbf\x87\
\x32\xe7\xa7\x8d\xe6\x83\x85\xe5\x86\xb5\xe5\x8a\xa0\xe8\xbd\xbd\
\xe5\x9b\xbe\xe7\x89\x87\xe6\x96\x87\xe4\xbb\xb6\xe5\x92\x8c\xe8\
\xb5\x84\xe6\xba\x90\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x0d\x0a\x31\
\x2e\x20\xe9\x80\x9a\xe8\xbf\x87\x70\x79\x72\x63\x63\x35\xe8\xbd\
\xac\xe6\x8d\xa2\x72\x65\x73\x2e\x71\x72\x63\xe4\xb8\xba\x72\x65\
\x73\x5f\x72\x63\x2e\x70\x79\xe6\x96\x87\xe4\xbb\xb6\xef\xbc\x8c\
\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x9b\xb4\xe6\x8e\xa5\x69\x6d\x70\x6f\
\x72\x74\xe5\x8a\xa0\xe8\xbd\xbd\x0d\x0a\x20\x2d\x20\xe8\xbd\xac\
\xe6\x8d\xa2\xe5\x91\xbd\xe4\xbb\xa4\x70\x79\x72\x63\x63\x35\x20\
\x72\x65\x73\x2e\x71\x72\x63\x20\x2d\x6f\x20\x72\x65\x73\x5f\x72\
\x63\x2e\x70\x79\x0d\x0a\x20\x2d\x20\x69\x6d\x70\x6f\x72\x74\x20\
\x72\x65\x73\x5f\x72\x63\x0d\x0a\x20\x2d\x20\xe6\xad\xa4\xe6\x97\
\xb6\xe5\x8f\xaf\xe4\xbb\xa5\xe9\x80\x9a\xe8\xbf\x87\x51\x50\x69\
\x78\x6d\x61\x70\x28\x22\x3a\x2f\x69\x6d\x61\x67\x65\x73\x2f\x68\
\x65\x61\x64\x2e\x6a\x70\x67\x22\x29\xe6\x9d\xa5\xe5\x8a\xa0\xe8\
\xbd\xbd\x0d\x0a\x0d\x0a\x32\x2e\x20\xe9\x80\x9a\xe8\xbf\x87\x72\
\x63\x63\xe5\x91\xbd\xe4\xbb\xa4\xe8\xbd\xac\xe6\x88\x90\xe4\xb8\
\xba\xe4\xba\x8c\xe8\xbf\x9b\xe5\x88\xb6\xe6\x96\x87\xe4\xbb\xb6\
\x72\x65\x73\x2e\x72\x63\x63\x0d\x0a\x20\x2d\x20\xe8\xbd\xac\xe6\
\x8d\xa2\xe5\x91\xbd\xe4\xbb\xa4\x63\x64\x20\x74\x6f\x6f\x6c\x73\
\x0d\x0a\x20\x2d\x20\x72\x63\x63\x2e\x65\x78\x65\x20\x2d\x62\x69\
\x6e\x61\x72\x79\x20\x2e\x2e\x2f\x72\x65\x73\x2e\x71\x72\x63\x20\
\x2d\x6f\x20\x2e\x2e\x2f\x72\x65\x73\x2e\x64\x61\x74\x61\x0d\x0a\
\x20\x2d\x20\xe9\x80\x9a\xe8\xbf\x87\x51\x52\x65\x73\x6f\x75\x72\
\x63\x65\x2e\x72\x65\x67\x69\x73\x74\x65\x72\x52\x65\x73\x6f\x75\
\x72\x63\x65\x28\x22\x72\x65\x73\x2e\x64\x61\x74\x61\x22\x29\xe6\
\xb3\xa8\xe5\x86\x8c\x0d\x0a\x20\x2d\x20\xe6\xad\xa4\xe6\x97\xb6\
\xe5\x8f\xaf\xe4\xbb\xa5\xe9\x80\x9a\xe8\xbf\x87\x51\x50\x69\x78\
\x6d\x61\x70\x28\x22\x3a\x2f\x69\x6d\x61\x67\x65\x73\x2f\x68\x65\
\x61\x64\x2e\x6a\x70\x67\x22\x29\xe6\x9d\xa5\xe5\x8a\xa0\xe8\xbd\
\xbd\x0d\x0a\x0d\x0a\x33\x2e\x20\xe6\x96\x87\xe6\x9c\xac\xe8\xb5\
\x84\xe6\xba\x90\xe8\xaf\xbb\xe5\x8f\x96\x0d\x0a\x0d\x0a\x60\x60\
\x60\x0d\x0a\x64\x65\x66\x20\x72\x65\x61\x64\x54\x65\x78\x74\x28\
\x70\x61\x74\x68\x29\x3a\x0d\x0a\x20\x20\x20\x20\x66\x69\x6c\x65\
\x20\x3d\x20\x51\x46\x69\x6c\x65\x28\x70\x61\x74\x68\x29\x0d\x0a\
\x20\x20\x20\x20\x69\x66\x20\x6e\x6f\x74\x20\x66\x69\x6c\x65\x2e\
\x6f\x70\x65\x6e\x28\x51\x49\x4f\x44\x65\x76\x69\x63\x65\x2e\x52\
\x65\x61\x64\x4f\x6e\x6c\x79\x29\x3a\x0d\x0a\x20\x20\x20\x20\x20\
\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x27\x27\x0d\x0a\x20\x20\
\x20\x20\x73\x74\x72\x65\x61\x6d\x20\x3d\x20\x51\x54\x65\x78\x74\
\x53\x74\x72\x65\x61\x6d\x28\x66\x69\x6c\x65\x29\x0d\x0a\x20\x20\
\x20\x20\x23\xe4\xb8\x8b\xe9\x9d\xa2\xe8\xbf\x99\xe5\x8f\xa5\xe8\
\xae\xbe\xe7\xbd\xae\xe7\xbc\x96\xe7\xa0\x81\xe6\xa0\xb9\xe6\x8d\
\xae\xe6\x96\x87\xe4\xbb\xb6\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\
\xe8\x87\xaa\xe8\xa1\x8c\xe7\xa1\xae\xe5\xae\x9a\x0d\x0a\x20\x20\
\x20\x20\x73\x74\x72\x65\x61\x6d\x2e\x73\x65\x74\x43\x6f\x64\x65\
\x63\x28\x51\x54\x65\x78\x74\x43\x6f\x64\x65\x63\x2e\x63\x6f\x64\
\x65\x63\x46\x6f\x72\x4e\x61\x6d\x65\x28\x27\x55\x54\x46\x2d\x38\
\x27\x29\x29\x0d\x0a\x20\x20\x20\x20\x64\x61\x74\x61\x20\x3d\x20\
\x73\x74\x72\x65\x61\x6d\x2e\x72\x65\x61\x64\x41\x6c\x6c\x28\x29\
\x0d\x0a\x20\x20\x20\x20\x66\x69\x6c\x65\x2e\x63\x6c\x6f\x73\x65\
\x28\x29\x0d\x0a\x20\x20\x20\x20\x64\x65\x6c\x20\x73\x74\x72\x65\
\x61\x6d\x0d\x0a\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x64\
\x61\x74\x61\x0d\x0a\x60\x60\x60\x0d\x0a\x0d\x0a\xe5\x85\xb6\xe5\
\xae\x83\xe6\x96\xb9\xe5\xbc\x8f\xe8\xa7\x81\x68\x74\x74\x70\x73\
\x3a\x2f\x2f\x67\x69\x74\x68\x75\x62\x2e\x63\x6f\x6d\x2f\x38\x39\
\x32\x37\x36\x38\x34\x34\x37\x2f\x50\x79\x51\x74\x2f\x74\x72\x65\
\x65\x2f\x6d\x61\x73\x74\x65\x72\x2f\x25\x45\x35\x25\x39\x42\x25\
\x42\x45\x25\x45\x37\x25\x38\x39\x25\x38\x37\x25\x45\x35\x25\x38\
\x41\x25\x41\x30\x25\x45\x38\x25\x42\x44\x25\x42\x44\
\x00\x00\x19\xf0\
\xff\
\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x78\x00\
\x78\x00\x00\xff\xe1\x00\x3a\x45\x78\x69\x66\x00\x00\x4d\x4d\x00\
\x2a\x00\x00\x00\x08\x00\x03\x51\x10\x00\x01\x00\x00\x00\x01\x01\
\x00\x00\x00\x51\x11\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x51\
\x12\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\
\xdb\x00\x43\x00\x02\x01\x01\x02\x01\x01\x02\x02\x02\x02\x02\x02\
\x02\x02\x03\x05\x03\x03\x03\x03\x03\x06\x04\x04\x03\x05\x07\x06\
\x07\x07\x07\x06\x07\x07\x08\x09\x0b\x09\x08\x08\x0a\x08\x07\x07\
\x0a\x0d\x0a\x0a\x0b\x0c\x0c\x0c\x0c\x07\x09\x0e\x0f\x0d\x0c\x0e\
\x0b\x0c\x0c\x0c\xff\xdb\x00\x43\x01\x02\x02\x02\x03\x03\x03\x06\
\x03\x03\x06\x0c\x08\x07\x08\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x78\
\x00\x78\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\
\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff\xc4\x00\
\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\
\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\
\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\x42\xb1\xc1\x15\x52\
\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17\x18\x19\x1a\x25\x26\
\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\
\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\
\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x83\x84\x85\x86\x87\
\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\
\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\
\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\
\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\
\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\
\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\
\x07\x08\x09\x0a\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\
\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00\x01\x02\x03\x11\x04\
\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81\x08\x14\
\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15\x62\x72\xd1\x0a\x16\
\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27\x28\x29\x2a\x35\x36\
\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\
\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\
\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\
\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\
\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\
\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\
\x03\x01\x00\x02\x11\x03\x11\x00\x3f\x00\xfd\xfc\xa2\xbc\x87\xf6\
\xf5\xf8\xc3\xe2\xef\x80\x1f\xb1\xff\x00\x8f\x3c\x65\xe0\x5d\x36\
\xcf\x53\xf1\x3f\x87\xb4\xef\xb5\xda\xa5\xdd\xb4\xb7\x50\x5b\xa0\
\x74\x13\x5c\xc9\x0c\x4c\xb2\x4c\xb0\x42\x64\x98\xc6\x8c\x19\xc4\
\x5b\x41\x04\x8a\xf0\x6f\x1f\x7f\xc1\x4c\xbe\x20\x7e\xc7\xdf\x04\
\x34\xef\x88\x9f\x1a\x3e\x1e\x68\x3e\x22\xf8\x67\x34\x30\xdd\x5c\
\xf8\xf7\xe1\xae\xb0\x6f\xb4\xf8\x2d\xa7\x09\xe4\x5d\x49\x63\x74\
\xb1\xcf\x1c\x72\x17\x5e\x52\x49\x80\x2c\xa3\x71\xc8\xc8\x07\xda\
\xf4\x57\x8e\x7e\xca\xdf\xf0\x50\x4f\x82\xff\x00\xb6\xbf\x83\xe1\
\xd6\xbe\x18\xfc\x47\xf0\xb7\x8a\xad\xe4\x00\xbd\xbd\xbd\xea\xa5\
\xed\xa9\x3f\xc3\x2d\xbb\xe2\x58\xdb\xd9\x94\x67\xb6\x6b\xd8\xe8\
\x00\xa2\xbe\x49\xff\x00\x82\x80\x7f\xc1\x6e\xff\x00\x67\x5f\xf8\
\x26\xfc\x37\x16\x7e\x3c\xf1\xc5\xad\xf7\x8a\xa1\x52\x57\xc3\x1a\
\x16\xdd\x43\x56\x27\x9e\x1e\x35\x60\xb0\xfd\x66\x64\xf6\xcd\x7c\
\x51\xf1\x37\xfe\x0f\x47\xfd\x9f\x7c\x3a\x92\x7f\xc2\x2b\xf0\xff\
\x00\xe2\x47\x89\xda\x34\x8d\x81\xb8\x5b\x6d\x35\x19\x9b\xef\x28\
\xcc\x8e\xdf\x2f\xae\xdc\x1e\xd4\x01\xfb\x1b\x45\x7f\x3b\x7f\x19\
\xff\x00\xe0\xf7\x3f\x19\x5d\xeb\x93\x2f\xc3\xef\x82\xde\x18\xd3\
\xb4\xd5\x38\x8a\x4d\x7b\x52\x9e\xf6\x77\x1e\xac\xb0\xf9\x2a\xa7\
\xd8\x16\xfa\xd7\x07\xa3\xff\x00\xc1\xec\x3f\x1f\x6d\x2e\xc3\x5e\
\xfc\x2e\xf8\x4b\x79\x06\x79\x48\xe3\xbf\x85\xb1\xec\xdf\x68\x61\
\xfa\x50\x07\xf4\xc1\x58\x3f\x14\x7c\x7f\x67\xf0\xab\xe1\xbe\xbd\
\xe2\x6b\xf0\xcd\x67\xa0\xd8\x4d\x7f\x2a\xa9\xf9\xa4\x11\xa1\x6d\
\xa3\xfd\xa6\xc6\x07\xb9\x15\xf8\x63\xf0\x37\xfe\x0f\x74\xd3\xef\
\xee\xa3\x87\xe2\x27\xc0\xd9\xac\xe3\x66\x02\x4b\x9d\x03\x5f\x12\
\x32\x8e\xe4\x45\x3c\x4a\x0f\xd0\xca\x2b\xf4\x53\xe1\xc7\xfc\x15\
\x07\xe0\xbf\xfc\x15\x1b\xe0\x8f\x86\xed\x7e\x18\xf8\x9a\x3b\xfb\
\x8f\x11\x78\x97\x4a\xb4\xd5\x34\x0b\xf4\xfb\x26\xaf\x61\x6e\x97\
\x2b\x73\x2f\x9b\x6e\xc7\x26\x36\x8e\xdd\xd7\xcc\x42\xf1\x90\xd8\
\x0c\x7a\x50\x07\x5d\xf0\x87\xf6\xd1\xf1\x27\xc2\xcf\xda\x83\x41\
\xf8\x33\xf1\xc3\xfb\x3a\xc7\xc4\x5f\x11\x34\x81\xae\xf8\x27\x5c\
\xb6\x87\xec\xd6\x3a\xbc\xca\xa1\xaf\xb4\x56\x19\x21\x6e\xed\x09\
\x0c\x87\x3f\xbe\x85\x95\xb8\x75\x60\x7e\xaa\xaf\x8b\x3f\xe0\xe0\
\x0f\xd9\xbe\xf3\xf6\x82\xff\x00\x82\x63\xf8\xea\xff\x00\x41\x4b\
\x98\xfc\x69\xf0\xc7\xc9\xf1\xdf\x86\xef\x2c\xdc\xc5\x79\x65\x75\
\xa7\x38\x9d\xde\x09\x17\xe6\x49\x0c\x02\x65\x05\x79\xc9\x15\xc3\
\x7f\xc1\xbd\xff\x00\xf0\x59\xbb\x5f\xf8\x2a\x7f\xec\xfb\x7d\xa3\
\x78\x9a\xea\xc9\x7e\x2d\x7c\x3d\x58\xa0\xd6\x96\x30\x21\xfe\xdc\
\xb5\x60\x04\x5a\x94\x71\x7f\x06\xe3\x94\x95\x57\x2a\x92\x0c\x8c\
\x2c\x88\x28\x03\xf4\x32\x8a\x28\xa0\x02\x8a\x28\xa0\x06\x5c\x5b\
\xc7\x79\x6f\x24\x33\x46\xb2\x45\x2a\x94\x74\x61\x95\x75\x3c\x10\
\x47\xa1\xaf\x92\x7f\xe0\x99\x1f\x0f\x74\x2f\x8c\x5f\xf0\x4b\xcd\
\x33\xe1\xbf\x8b\xf4\xcb\x4d\x7f\x41\xd3\x64\xd7\x7c\x0d\xaa\x69\
\x97\xa9\xe6\x45\x2d\xb5\x9e\xa9\x79\x64\x20\x60\x7b\x08\x62\x40\
\x31\xd3\x00\x8c\x60\x57\xd7\x35\xf2\x7f\xc0\x2b\xc9\x3f\x63\xcf\
\xdb\x87\xc7\x9f\x0c\xf5\x80\x6d\xfc\x23\xf1\xa3\x55\xb8\xf1\xd7\
\x81\x6f\xdb\x88\x4e\xa5\x24\x6a\x75\x7d\x24\xb7\x41\x2f\x98\x9f\
\x6c\x8d\x7f\x8d\x27\x9f\x19\xf2\x9a\x80\x3f\x9f\xcf\xf8\x2c\xe7\
\xfc\x10\x8b\xe2\x67\xfc\x11\xe7\xe2\x95\xd7\xc5\x4f\x84\x7a\x86\
\xbd\xa9\x7c\x20\x6b\x8f\x36\xcf\x59\xb3\x99\x86\xa1\xe1\x62\xef\
\x81\x6d\x78\x57\xac\x7b\x88\x55\x9b\xee\xb8\x20\x30\x0d\xc1\xf2\
\x0f\x08\x7f\xc1\xc3\xdf\xb4\xce\x91\xfb\x3d\x6b\x1f\x0e\xb5\x2f\
\x88\xfe\x20\xbc\xd1\xef\x97\x6d\xb4\xb6\xaf\x1d\x9d\xf4\x00\xae\
\xd6\x8b\xed\x4a\xbe\x6a\xc2\x7a\x94\x8c\xa9\x27\x20\x32\x82\x6b\
\xee\x6f\xf8\x3b\x97\xfe\x0b\x01\x75\xe3\x7f\x88\xb2\x7e\xcb\xfe\
\x03\xd4\xb6\x68\x3e\x1d\x68\xee\x7c\x6d\x73\x03\x7f\xc7\xf5\xef\
\x0f\x15\x96\x7f\xbb\x08\xda\xee\x3f\xe7\xa1\x00\xf2\x95\xf8\x5f\
\x40\x16\x35\x6d\x5a\xe7\x5d\xd4\xa7\xbc\xbc\x9a\x5b\x8b\xab\xa9\
\x1a\x59\x65\x91\x8b\x34\x8e\xc7\x25\x89\x3c\x92\x7d\x4d\x57\xa2\
\x8a\x00\x28\xa2\x8a\x00\x2b\xf4\x47\xfe\x0d\x7e\xf8\xdd\xa4\x7c\
\x2d\xff\x00\x82\xbe\xfc\x35\xb7\xf1\x46\xa8\x2c\xf4\x8d\x59\x2f\
\xb4\xeb\x2f\xb4\x49\x88\x63\xbe\x9a\xd6\x44\x83\xaf\x00\xb3\x31\
\x41\xd0\x65\xc7\xb5\x7e\x77\x55\xef\x0d\x78\x8e\xf7\xc1\xfe\x22\
\xb0\xd5\xb4\xdb\x89\x2d\x35\x0d\x2e\xe2\x3b\xbb\x59\xe3\x38\x68\
\x65\x46\x0c\xac\x3d\xc3\x00\x68\x03\xfb\xe1\xd5\x34\xdb\x1f\x18\
\x78\x72\xe2\xce\xe1\x61\xbd\xd3\x75\x4b\x66\x86\x55\xc8\x68\xe7\
\x8a\x45\x20\x8f\x42\xac\xa7\xf1\x06\xbf\x8c\x4f\xd9\xe7\xf6\x8f\
\xf1\x37\xfc\x11\x8f\xfe\x0a\xc7\x79\xe2\x2d\x0d\x6e\x1b\xfe\x15\
\xaf\x8b\x2f\xf4\x4d\x4f\x4f\x0f\xb4\x6a\xda\x62\xdc\x3c\x33\xdb\
\xb7\x6f\x9e\x21\x95\x27\x21\x5d\x51\xba\xa8\xaf\x70\xfd\x85\x3f\
\xe0\xe5\xef\x8f\x5f\xb2\xcc\x27\x45\xd4\xf5\xcb\x7d\x5f\x43\x68\
\xed\x2d\x2d\x5e\xea\xd4\xdc\x7f\x64\xda\xc1\x34\x92\x0b\x78\x60\
\xde\x23\x58\xd9\x65\x74\x24\x28\x90\x05\x8f\x0d\x84\xda\x7c\x5f\
\xfe\x0a\x91\xf1\xf3\xc0\x9f\xb7\x4f\xc6\xe3\xf1\x5f\xc2\xf7\xba\
\x7e\x9f\xe2\x2f\x14\x41\x68\x3c\x41\x65\x24\x0b\x61\xe6\x5e\x6c\
\x21\xa6\x75\xc0\x8f\xcc\x2a\x14\x4b\x24\x78\x8d\x99\x77\xe1\x0c\
\x8c\x8a\x01\xfd\x8e\x7c\x1e\xf8\xb5\xa0\x7c\x7a\xf8\x53\xe1\xcf\
\x1b\x78\x57\x50\x87\x56\xf0\xdf\x8a\xf4\xe8\x35\x5d\x36\xee\x23\
\x95\x9e\x09\x90\x3a\x37\xb1\xc3\x0c\x83\xc8\x39\x07\x91\x5d\x25\
\x7e\x1b\xff\x00\xc1\xa6\xdf\xf0\x54\x4d\x23\x48\xf8\x67\xa4\x7e\
\xcb\x7e\x32\x76\xd2\xf5\xfb\x67\xbc\xbe\xf0\xb4\xb7\x53\xb3\x7d\
\xb4\x3b\xb5\xc4\x96\xca\x49\xda\x32\xa5\xe4\x8c\x2e\x01\x0b\x20\
\xe4\xed\x2d\xfb\x91\x40\x05\x14\x51\x40\x05\x7c\xc7\xff\x00\x05\
\x87\xf8\xe7\xe0\xcf\xd9\x9b\xfe\x09\xe9\xf1\x03\xc7\xfe\x34\xd3\
\xe1\xd4\xa1\xf0\xa5\xb4\x77\xda\x24\x26\x53\x0c\xeb\xac\x07\x0b\
\x60\xf0\x4a\xa4\x3c\x72\xac\xec\x84\x3a\x10\xc1\x43\x76\xc8\x3f\
\x4e\x57\xe1\xbf\xfc\x1e\xbb\xfb\x55\x2f\x86\xbe\x03\xfc\x2c\xf8\
\x37\x6b\x20\x37\x1e\x28\xd4\xa5\xf1\x2e\xa0\x81\xb0\x52\x1b\x51\
\xe5\x41\x9f\x50\xcf\x2c\xbf\x8c\x7e\xd4\x01\xfc\xf0\xf8\xfb\xc7\
\x5a\xb7\xc5\x0f\x1c\x6b\x1e\x24\xd7\xaf\xae\x35\x4d\x73\x5e\xbd\
\x9b\x50\xbf\xbc\x9d\xb7\x49\x73\x3c\xae\x5e\x47\x63\xea\x59\x89\
\xfc\x6b\x26\x8a\xfd\x0c\xff\x00\x82\x00\x7f\xc1\x1c\x97\xfe\x0a\
\x5f\xf1\xa7\x56\xf1\x67\x8e\x05\xc5\x8f\xc1\x5f\x86\x2a\x2f\xbc\
\x45\x32\x13\x1b\xeb\x12\xaa\x99\x12\xc2\x37\xfe\x1d\xca\xa5\xa4\
\x61\xca\xa0\xc0\xc3\x32\x9a\x00\xfc\xf3\xa2\xba\x2f\x8b\xbe\x28\
\xb7\xf1\xb7\xc5\x4f\x11\xea\xf6\x76\x96\xba\x7d\x96\xa5\xa9\x5c\
\x5c\x5b\x5a\xdb\x46\x23\x86\xda\x26\x91\x8a\x46\x8a\x38\x0a\xab\
\x85\x03\xd0\x57\x3b\x40\x16\x34\xbd\x22\xef\x5b\xba\x30\x59\xda\
\xdc\x5e\x4c\xb1\xbc\xc6\x38\x63\x32\x30\x44\x42\xee\xd8\x1c\xed\
\x54\x56\x62\x7a\x00\xa4\x9e\x05\x57\xaf\xbb\xbf\xe0\xda\xbf\x87\
\x31\xfc\x51\xff\x00\x82\xc8\xfc\x2a\xd2\xee\x6c\xe1\xbe\xd3\x5e\
\x3d\x55\xb5\x0b\x79\xa3\xf3\x22\x9e\xd8\xe9\x97\x4b\x2a\x38\xe8\
\x55\x95\x8a\x9c\xff\x00\x7a\xb8\x6f\xf8\x2d\x1f\xfc\x13\xff\x00\
\x4b\xff\x00\x82\x79\xfe\xdc\x7e\x28\xf0\x9f\x85\x75\x9b\x3f\x10\
\x78\x1a\xf2\xe5\xee\xf4\x3b\xab\x69\xbc\xef\xb1\xc6\xcc\x77\x59\
\x4c\xc3\x8f\x3a\x06\xca\x11\xd4\x80\xad\xc6\x71\x40\x1f\x25\x51\
\x45\x14\x00\x51\x45\x14\x01\xd5\x7c\x1d\xf8\xc7\xe2\x0f\x81\xff\
\x00\x14\x3c\x37\xe2\xef\x0d\xea\x37\x1a\x7e\xbd\xe1\x3d\x46\x0d\
\x53\x4c\xb9\x47\x39\xb6\x9e\x19\x04\x88\x47\xb6\xe0\x32\x3b\x8c\
\x8e\xf5\xfd\xc1\x7e\xc5\x5f\xb4\xde\x97\xfb\x66\x7e\xc9\xbf\x0f\
\xbe\x29\x68\xfb\x56\xcb\xc6\xda\x25\xbe\xa4\x62\x5f\xf9\x76\x99\
\x97\x13\x43\xf5\x8e\x51\x22\x1f\x74\xaf\xe1\x51\x4e\x18\x57\xf5\
\x01\xff\x00\x06\x71\x7e\xd2\x8f\xf1\x27\xf6\x06\xf1\x77\xc3\x9b\
\xb9\xcc\x97\x5f\x0e\x3c\x42\x2e\x2d\x15\x9f\x25\x2c\xb5\x08\xfc\
\xe5\x00\x7a\x0b\x88\xee\xbf\x3a\x00\xfd\x7b\xa2\x8a\x28\x00\xaf\
\xe4\x5b\xfe\x0e\x87\xfd\xab\x47\xed\x37\xff\x00\x05\x65\xf1\xa5\
\x9d\xac\x8d\x26\x97\xf0\xee\x38\xbc\x2f\x6a\x77\xee\x52\x61\x5d\
\xd3\x15\xf6\xf3\x9e\x4a\xfe\xb2\xfe\x28\xf8\xc5\x7e\x1d\xfc\x33\
\xf1\x17\x88\x1b\x69\x5d\x0f\x4c\xb9\xbf\x20\xf4\x3e\x54\x4c\xf8\
\xff\x00\xc7\x6b\xf8\x79\xfd\xbb\x3c\x49\xff\x00\x09\x6f\xed\x8d\
\xf1\x2b\x50\xf3\x1a\x66\xb9\xf1\x05\xdb\x33\xb1\xcb\x3b\x07\x20\
\x93\xf5\x20\x9a\x00\xf3\x5f\x0c\x78\x6e\xfb\xc6\x5e\x24\xd3\xf4\
\x8d\x36\xde\x5b\xcd\x47\x54\xb9\x8e\xd2\xd6\x08\xd7\x73\xcd\x2c\
\x8c\x15\x14\x0e\xe4\xb1\x03\xf1\xaf\xeb\xeb\xf6\x64\xff\x00\x82\
\x5b\x78\x4f\xf6\x15\xff\x00\x82\x5a\x58\xf8\x5e\xdf\x4f\x92\xf3\
\xc7\x9e\x0b\xf0\x4e\xad\x79\x73\x3c\x37\xb3\x2a\x4b\xac\x5d\xd8\
\xcb\xf6\x99\x0c\x48\xe2\x39\x1b\x27\xca\x47\x75\x2c\x12\x35\x00\
\x8a\xfe\x57\x3f\x61\x4f\x88\xf6\x1f\x02\x3e\x3f\xe9\x7f\x11\xb5\
\x38\x74\x8b\x9b\x7f\x01\x93\xaa\xdb\xc1\xa9\x43\x24\xf0\xdd\x5d\
\xaf\x16\xf1\x88\xa3\x64\x69\x1b\xcc\x2a\xc1\x77\xa2\xfc\x84\xb3\
\x00\x39\xf7\xfb\x0f\xf8\x38\x6b\xf6\x94\xf0\xb7\xc4\x4d\x67\x5e\
\xf0\xe6\xbd\xe1\x3f\x0f\x7f\x6e\x42\xf6\x77\x50\x59\x78\x47\x4d\
\x8d\x2e\x2d\x98\x9c\xc7\x21\xf2\x77\x37\xd4\xb6\x73\xde\x80\x3e\
\x1e\xb9\x84\xdb\xdc\x49\x19\xeb\x1b\x15\x3f\x85\x32\xa6\xd4\x2e\
\xda\xfe\xfe\x69\xdf\x6e\xf9\xa4\x69\x1b\x68\xc0\xc9\x39\xe0\x54\
\x34\x01\xfb\x29\xff\x00\x06\x5e\xfe\xcf\x32\x78\xdb\xf6\xec\xf1\
\xe7\xc4\x8b\x88\x5b\xfb\x3b\xe1\xff\x00\x85\xda\xd5\x27\x23\xe5\
\x4b\xab\xd9\x02\x28\xcf\x6f\xdc\xc5\x71\x5f\xae\xdf\xf0\x56\xe9\
\xff\x00\x66\x7f\xdb\x6b\xf6\x67\xd4\xbe\x15\xfc\x46\xd7\x22\x5b\
\x5b\xe9\xc7\xf6\x57\x88\xac\x6d\xc3\x43\xe1\xdb\xf0\x76\xa5\xd4\
\x77\x2e\x56\x16\x08\x49\x12\x22\x39\xca\x6f\x07\x1d\x47\x85\x7f\
\xc1\x0d\x3f\xe0\x98\x7e\x3c\xfd\x9d\xbf\xe0\x91\xbe\x1d\xf0\xf6\
\x9c\xf6\x3e\x11\xf1\x57\xc7\x8b\xa3\xe2\x4f\x18\x6b\x57\x96\xcb\
\x71\x75\xa1\x69\x4f\x12\x8b\x6b\x78\x2d\xdf\xe5\x7b\x86\x80\x29\
\x1e\x68\x29\x13\x4f\x29\x65\x72\xa1\x1b\xf0\x03\xfe\x0a\x81\xfb\
\x4c\x69\xbf\x1b\xff\x00\x6b\x1f\x19\x47\xe1\x3f\xed\x01\xe1\x3d\
\x1f\x50\x9b\x48\xd2\xee\x75\x0b\xd9\x2f\xaf\xf5\x0b\x68\x1c\xc6\
\x2e\x26\x9e\x42\x58\xb4\xc5\x4c\x85\x53\x6a\x28\x65\x55\x55\x55\
\x02\x80\x3c\xbb\xf6\xab\xfd\x9b\x75\x4f\xd9\x3b\xe3\x96\xb9\xe0\
\x9d\x53\x54\xf0\xff\x00\x88\x1b\x49\x9c\xad\xb6\xad\xa1\x6a\x31\
\x6a\x1a\x6e\xab\x01\xe6\x39\xe1\x9a\x36\x2a\x55\x97\x07\x07\x0c\
\xa7\x20\x80\x41\x15\xe7\x55\x7d\x3c\x43\x33\x68\xc3\x4f\x99\x63\
\x9a\xd5\x18\xbc\x41\x94\x6f\x85\x8f\x52\xad\xd4\x03\x8e\x47\x43\
\xe9\x9e\x6b\xd1\xfe\x32\xfe\xc5\x3f\x12\xfe\x05\xfc\x27\xf0\x4f\
\x8f\xb5\xff\x00\x09\xea\xf6\xbe\x07\xf8\x89\xa7\xae\xa5\xa0\x6b\
\x62\x02\xf6\x77\x88\x49\x05\x0c\x83\x84\x91\x4a\x9c\xa3\x60\x91\
\x86\x00\xa9\x06\x80\x3c\xa6\x8a\x28\xa0\x02\xbf\x6c\xff\x00\xe0\
\xcb\x5f\x89\xb3\x69\x3f\xb6\x5f\xc4\x0f\x0c\x33\xb0\xb7\xd7\xbc\
\x12\x6e\x0a\xe7\xe5\x69\x2d\x2f\xa3\xd8\x71\xea\x12\xe6\x41\xf8\
\xd7\xe2\x65\x7e\xb7\x7f\xc1\xa0\x1e\x26\xb5\xd0\x7f\xe0\xa5\x9a\
\x7c\x12\x17\xfb\x56\xb5\xa1\x6b\x5a\x6c\x63\xf8\x71\xe5\x5a\xdc\
\x8f\xfd\x27\x7f\xce\x80\x3f\xa8\xea\x28\xa2\x80\x3c\xbf\xf6\xcf\
\x2f\x27\xec\xc3\xe2\xeb\x78\xdb\x6b\x5f\xdb\x25\x89\x27\xd2\x79\
\xa3\x84\xfe\x8e\x6b\xf8\x9c\xfd\xb2\x34\x1b\x8f\x0c\x7e\xd6\xff\
\x00\x14\x34\xeb\xa4\x68\xe7\xb1\xf1\x66\xab\x6e\xea\x47\x2a\x52\
\xf2\x55\x23\xf4\xaf\xee\x27\xe3\x6f\x80\x24\xf8\xa3\xf0\xab\x5a\
\xd0\xa1\x99\x60\xb8\xbe\x80\x79\x12\x30\xf9\x52\x54\x61\x22\x13\
\xed\xb9\x57\x3e\xd5\xfc\x93\xff\x00\xc1\xc5\xbf\xb2\x56\xa5\xfb\
\x3e\xff\x00\xc1\x4f\xfe\x32\x6a\x1f\x63\x92\x2d\x1f\x5c\xf1\x02\
\x6b\xd0\x36\xcc\x2f\x97\xa9\xc6\xd7\x4a\x47\xb7\x9c\xb7\x49\xec\
\x63\x22\x80\x3e\x78\x87\xf6\x5b\xd6\x13\xfe\x09\xd9\x2f\xc6\x2f\
\x29\xbf\xb1\x24\xf1\xbf\xfc\x23\x3e\x66\x38\xf3\x56\xd1\x66\xc7\
\xe2\x1b\xff\x00\x1d\x35\x3f\xed\x57\xe0\xef\x80\xfe\x1f\xfd\x9e\
\x7e\x06\x6a\x1f\x0a\x7c\x4d\xe2\x0d\x63\xe2\x06\xb1\xa1\x5c\xc9\
\xf1\x27\x4f\xd4\x22\x65\x83\x48\xd4\x16\x65\x11\x2c\x04\xc6\xa0\
\xab\x29\x93\x85\x67\x1b\x52\x32\x48\x66\x22\xbf\x63\x3f\xe0\xdd\
\xff\x00\xd9\xb3\xc1\x5f\xf0\x54\x7f\xf8\x22\x57\xc6\x2f\xd9\xaf\
\xc6\x30\xff\x00\x67\x9d\x1f\xc5\x11\xea\x76\xfa\x9d\xaa\x06\xb9\
\xd3\xee\x2e\xad\xa3\x9a\xd6\xed\x73\xc1\x64\x78\x64\x52\x38\xdd\
\x1e\xe5\x38\xc9\x35\xf2\xb7\x89\xff\x00\xe0\xce\x8f\xda\xc7\x4b\
\xf8\x91\x75\xa4\xe9\xb7\x5f\x0d\x75\x5d\x0e\x36\xcc\x1a\xe9\xd7\
\x1a\xde\x09\x97\x23\xac\x2d\x11\x99\x58\x0e\x48\xda\x47\x1c\x31\
\xe3\x20\x1f\x9e\xfa\xbf\xec\xbb\xab\x69\x1f\x03\x5b\xc7\x53\xc7\
\x71\x0e\x9a\xda\x55\x86\xa5\x13\x3a\x61\x66\xfb\x55\xed\xdd\xa2\
\x80\x7b\xf3\x67\x31\xff\x00\x80\x9a\xfb\xcf\xfe\x0d\xc3\xff\x00\
\x82\x20\x6a\x1f\xf0\x50\x5f\xda\x07\x4c\xf8\x8d\xe3\xad\x26\x64\
\xf8\x3b\xe0\x3b\xe4\xbb\xbd\xfb\x44\x65\x62\xf1\x15\xe4\x78\x78\
\xb4\xf4\xcf\xdf\x4c\xed\x79\x88\xe1\x50\x04\xce\xe9\x3e\x5f\xde\
\xef\x86\x9f\xf0\x44\x4f\x82\x5a\x7f\xec\x65\xf0\xd3\xe1\x0f\x8e\
\x3c\x37\x6b\xe3\x0b\x3f\x02\xe9\xba\x75\xad\xe5\xcb\x49\x2d\xb0\
\xd6\xe6\xb4\x69\xe6\xcc\xc1\x18\x16\x84\xdc\x5d\x5c\xc8\x22\x62\
\x47\xef\x30\x73\x8a\xfa\xbb\xe1\xf7\xc3\xcd\x07\xe1\x3f\x83\x34\
\xff\x00\x0e\xf8\x67\x47\xd3\x7c\x3f\xa0\xe9\x30\x88\x2c\xb4\xfb\
\x0b\x75\xb7\xb7\xb6\x41\xfc\x28\x8a\x00\x1d\xcf\xb9\x24\xf5\x34\
\x01\x37\x8a\x74\x99\xb5\x5f\x08\xea\x56\x36\x6e\xb6\xd3\xdc\xd9\
\xcb\x04\x0e\x38\x11\x33\x21\x55\x3f\x81\x23\xf2\xaf\xe1\x87\xe1\
\x77\x8a\xee\xff\x00\x64\x0f\xda\xfb\xc3\xfa\xdf\x88\x34\x1b\x5d\
\x77\x50\xf8\x65\xe2\xe8\x2e\xf5\x3d\x16\xf7\xfd\x4d\xec\xb6\x37\
\x81\xa5\xb6\x90\x90\x78\x66\x89\x94\x92\x0f\x5e\x87\xa5\x7f\x76\
\x15\xf8\xef\xff\x00\x05\x75\xff\x00\x83\x4e\xfc\x3d\xfb\x73\xfc\
\x7b\xd6\xbe\x2a\x7c\x29\xf1\xb5\xa7\xc3\xbf\x15\x78\xaa\xe0\xde\
\x6b\xba\x4e\xa5\x62\xd7\x1a\x55\xfd\xd3\x7f\xac\xb9\x8d\xa3\x22\
\x48\x1d\xcf\xcc\xe3\x6b\xab\x31\x66\x1b\x49\x39\x00\xfe\x7b\x3f\
\x6f\xff\x00\xda\x8a\xc7\xf6\xd4\xfd\xb2\xbe\x21\x7c\x54\xd3\x3c\
\x2b\x67\xe0\x8b\x1f\x1b\x6a\x87\x50\x87\x45\xb6\x90\x4a\x96\x43\
\x62\x21\xcb\xaa\x20\x67\x62\xa5\xd9\x82\x8c\xb3\xb1\xc5\x7e\xec\
\xfc\x7b\xf8\x13\xac\x37\xfc\x19\x93\xe1\x7b\x3d\x69\x6e\xad\x75\
\x6d\x07\xc3\x9a\x77\x89\xa1\x07\x2a\xe9\x0b\x6a\xa2\xe2\x1c\xf7\
\xc1\xb7\x9d\x7e\x99\xaf\x31\xf8\x2b\xff\x00\x06\xa1\xfc\x25\xfd\
\x91\x3e\x2a\x78\x27\x50\xfd\xa6\x7e\x3a\x59\xeb\x50\xea\xd7\x8e\
\xd6\xbe\x15\xd0\xf4\x99\x6d\xe1\xd5\x3e\xce\xbe\x6c\xa6\x6b\x92\
\xcd\x22\xda\x46\x83\x74\xd2\x18\xe2\x54\x53\xcc\x89\x90\x4f\xe9\
\x77\xfc\x16\x2f\xc7\x3e\x0c\xf8\xb1\xff\x00\x04\x3e\xf8\xf1\x75\
\xe0\xbd\x57\x43\xd6\x3c\x33\x67\xe1\x79\xac\xe0\x9b\x4a\x95\x24\
\xb3\x88\xdb\xcb\x1a\x98\x90\xa7\xcb\x84\x2a\x17\x03\x81\x8c\x76\
\xa0\x0f\xe3\xa6\xea\xe9\xef\x27\x69\x24\x21\xa4\x73\x96\x20\x01\
\x93\xf8\x54\x74\x51\x40\x05\x7e\xc4\x7f\xc1\xaa\xbf\x09\x5b\x4d\
\xfd\xaa\xfe\x10\xf8\xf3\xec\xf2\x08\xf5\x0f\x13\x78\x97\x42\x69\
\x73\xf2\xb3\x27\x87\xfc\xe5\x1f\x80\x2f\x5f\x8e\xf5\xfd\x49\x7f\
\xc1\xae\xdf\xb1\x43\x78\x63\xfe\x09\xbd\xf0\xc3\xc5\x1a\xe6\x9f\
\x2d\x8e\xb1\x63\xe3\xad\x73\xc5\x10\x09\x17\x6c\x83\x7d\x9c\x9a\
\x56\xd3\xe9\xc6\xf3\x8f\xf6\x45\x00\x7e\xb5\x51\x45\x14\x00\x57\
\xc7\xdf\xf0\x57\x2f\xf8\x25\x0f\x87\x7f\xe0\xa5\xdf\x06\xf5\x6b\
\x36\xfb\x35\x8f\x8b\x7f\xb0\x6e\xb4\xbb\x1b\xb9\x23\x1b\x64\x62\
\xc9\x3d\xb6\xf6\xea\x3c\xab\x88\x94\x83\xd9\x65\x9c\x63\xe7\x35\
\xf6\x0d\x14\x01\xf8\x37\xff\x00\x06\x65\x49\x6f\xf0\xaf\xe2\xc7\
\xed\x49\xf0\xd3\x56\xba\x6b\x7f\x16\xe8\xf7\x9a\x52\xc9\x61\x32\
\xf9\x72\xb2\x59\xc9\x7b\x6b\x3b\x6c\xc9\xff\x00\x57\x2b\x22\xb7\
\x27\x05\xd7\xd6\xbf\x79\x2b\xf9\x65\xfd\xbb\x3e\x2a\xf8\xeb\xfe\
\x08\x8f\xff\x00\x07\x0d\xfc\x50\xf8\x9f\xe0\xdb\x1b\x7b\xff\x00\
\x33\x56\x3e\x23\x96\xc2\xf0\xed\xb7\xd6\x74\x8d\x5c\x09\x2e\x21\
\x2c\x06\x55\x44\xec\xc8\x24\x19\xd8\xe8\x84\x86\xc1\x07\xf6\x23\
\xe0\xd7\xfc\x1c\x4f\xf0\x9f\xf6\xd6\xf8\x0c\x63\xf8\x23\x71\x0d\
\xf7\xc7\x8d\x68\xc1\xa6\x68\x9f\x0f\x7c\x46\x4d\x8d\xd7\xf6\x84\
\xec\xa9\xe6\x3b\x80\x52\x6b\x58\x01\x79\xa5\x92\x16\x27\xca\x85\
\xb8\x56\x20\x50\x07\xd2\x3f\xb6\x4f\xed\xdf\x6b\xfb\x3a\x6b\x9a\
\x47\x80\xfc\x1b\xe1\xfb\xaf\x89\x5f\x1b\x3c\x61\x13\x3f\x87\x7c\
\x19\xa7\xcc\x23\x73\x10\x3b\x5a\xfe\xfa\x63\x95\xb3\xb0\x8c\x9f\
\x9e\x79\x3a\x9f\x95\x03\xb7\x03\xc9\x3e\x14\xfe\xc4\x1f\xb5\x9f\
\x83\x34\x8b\xdd\x62\xe3\xf6\xaa\xd3\x63\xf1\x37\x89\xb5\x3b\xad\
\x63\x55\xd1\xe6\xf0\x34\x5a\xa6\x81\xa5\x49\x75\xb3\x75\xbd\x89\
\x92\x74\xb9\x11\x5b\x88\xd4\x45\xba\x40\xa4\xf9\x8c\xc8\x7c\xc2\
\x07\xb6\xfe\xc5\x9f\xb1\x56\x9b\xfb\x2a\x68\x1a\xa6\xad\xaa\x6a\
\x52\x78\xcb\xe2\xa7\x8d\xa4\x5b\xef\x1a\x78\xce\xf6\x31\xf6\xcd\
\x76\xeb\x1f\x71\x3f\xe7\x8d\xa4\x5f\x72\x0b\x74\xc2\x44\x80\x70\
\x58\xb3\x37\xb7\xd0\x07\xc6\x5e\x0a\xf8\x55\xfb\x44\x7e\xc1\x1e\
\x23\xd7\xbc\x49\x71\xe3\xad\x73\xf6\x9e\xf0\x16\xb4\xd1\xdf\xeb\
\x5a\x6e\xa7\x04\x56\x7e\x2a\xd0\xa4\x8e\x20\x92\xc9\xa5\x47\x0a\
\xad\xb5\xcc\x2c\x15\x58\xda\x30\x89\xc6\xcf\x91\xdd\xd8\x87\xfa\
\x7b\xe0\x4f\xc7\xaf\x08\xfe\xd2\xff\x00\x0c\x74\xef\x18\xf8\x1f\
\x5b\xb4\xd7\xfc\x3f\xaa\x06\xf2\xae\x20\xc8\x68\xdd\x4e\xd9\x22\
\x95\x18\x07\x8a\x54\x60\x55\xe3\x70\x1d\x18\x10\xc0\x11\x8a\xeb\
\xeb\xe2\xbf\xdb\x0b\xc0\x3a\x9f\xfc\x13\xc7\xe2\x86\xab\xfb\x4c\
\x7c\x37\xb2\xba\x9f\xc1\xf7\x8e\xb3\xfc\x63\xf0\x75\x92\x6e\x8b\
\x55\xb2\x5c\x2b\xf8\x82\xd2\x21\xc2\xea\x16\xa9\xf3\xca\x17\x1f\
\x69\x81\x18\x37\xce\x88\xc4\x03\xec\x6d\x53\xc3\x5a\x6e\xb8\xec\
\xd7\xda\x7d\x8d\xe3\x34\x0f\x6a\x4c\xf0\x2c\x84\xc4\xfb\x4b\xc7\
\xc8\x3f\x23\x6d\x5c\xaf\x43\xb4\x67\xa0\xaf\x89\xff\x00\xe0\xe2\
\x2d\x7b\x4d\xf8\x41\xff\x00\x04\x44\xf8\xe5\x1d\xad\xbd\xae\x9d\
\x6b\x3e\x91\x6f\xa5\xdb\xdb\xc1\x12\xc5\x1a\xb5\xcd\xfd\xbc\x58\
\x55\x50\x00\xcf\x98\xc7\x8f\x7a\xfb\x5f\xc2\xbe\x29\xd3\xbc\x73\
\xe1\x7d\x37\x5a\xd1\xef\x2d\xf5\x2d\x27\x58\xb5\x8a\xf6\xca\xee\
\x07\xdf\x15\xd4\x12\x20\x78\xe4\x46\xee\xac\xac\x08\x3d\xc1\xaf\
\xc9\xef\xf8\x3b\xfb\xe3\xee\x97\x61\xff\x00\x04\xfd\xd0\x7e\x12\
\xe9\xba\x95\xad\xe7\x8c\xfe\x20\x78\xc3\x4b\x8c\x68\x96\xf2\xac\
\x97\xcf\x68\x9e\x7c\xa2\x4f\x24\x1d\xfb\x5a\x68\xa2\x55\x38\xc1\
\x6e\x07\x34\x01\xfc\xba\x30\xda\x68\x55\xdd\x9f\x61\x9a\xbb\xe2\
\x4d\x3a\x4d\x1f\x5a\xb8\xb3\x9a\x36\x86\x7b\x57\x68\x65\x8d\xbe\
\xf4\x6e\xa4\xab\x29\xf7\x04\x11\x56\x3c\x2f\xe0\xdb\xcf\x16\xcd\
\x75\x15\xa7\x93\xbe\xde\x23\x21\x12\x48\x13\x79\x1d\x11\x73\xd5\
\xce\x0e\x14\x72\x48\xc0\xe7\x02\x80\x13\xc0\xba\x1d\xd7\x89\xfc\
\x6d\xa3\xe9\xb6\x36\xf2\x5e\x5f\x6a\x17\xb0\xdb\x5b\xdb\xa2\xee\
\x69\xe4\x77\x0a\x88\x07\x72\xcc\x40\xfc\x6b\xfb\x98\xfd\x8b\x3e\
\x01\xa7\xec\xb9\xfb\x26\xfc\x3d\xf8\x7e\x36\x99\xbc\x2f\xa2\x5b\
\xda\x5d\xba\xf4\x96\xeb\x6e\xeb\x89\x3f\xe0\x53\x34\x8d\xff\x00\
\x02\xaf\xe5\xe3\xfe\x08\x93\xff\x00\x04\xee\xf1\x17\x87\xff\x00\
\xe0\xbe\x5f\x0d\x7e\x1b\xfc\x42\xd0\x66\xd3\x75\x2f\x87\xb7\x2d\
\xe2\x7d\x5a\xc6\xe9\x39\x85\xed\x6c\xbe\xd7\x06\x47\x71\xe7\xb5\
\xbf\xb5\x7f\x5a\xd4\x00\x51\x45\x14\x00\x51\x45\x14\x01\xf2\x07\
\xfc\x14\xa3\xfe\x09\x07\xe0\xbf\xf8\x28\x4f\x8e\x3c\x27\xe3\x0b\
\xa9\x21\xd2\xfc\x5d\xe1\xdb\x79\x74\x3b\xc9\xe5\x8b\xcd\xb7\xd6\
\xf4\x3b\x9c\xad\xd5\x8c\xe8\x30\x72\x15\xdd\xe1\x90\x10\x63\x93\
\x9e\x87\x8f\xcd\x8f\xf8\x20\xbf\xec\x79\xe0\x9f\xf8\x24\x07\xfc\
\x14\x97\xe2\xc6\x87\xf1\xc3\xc4\xd3\x78\x37\xc7\x92\x33\x78\x63\
\xc0\x57\x3a\xd5\xa7\xd8\x74\x3f\x15\xe9\x8e\xeb\x37\xda\xed\xaf\
\xe4\x1e\x53\xdd\x48\x12\x20\x60\x0e\xac\xbf\x30\xc3\x92\x42\x7e\
\xf3\x57\xc8\x5f\xf0\x5c\xed\x02\x1f\x19\xff\x00\xc1\x39\xfc\x4f\
\xe1\xd9\x74\x3d\x3f\x58\xff\x00\x84\xb7\x56\xd1\xfc\x3a\x67\xbe\
\xb1\x4b\xa8\x74\x48\xef\xb5\x1b\x7b\x59\xb5\x03\xbd\x48\x8b\xc8\
\x86\x59\x5c\x4b\xc7\x96\x40\x6c\x8c\x66\x80\x3e\xbb\x8e\x45\x9a\
\x35\x65\x65\x65\x61\x90\x41\xc8\x22\x9d\x5c\xef\xc2\x6b\xaf\x0c\
\x4d\xf0\xe7\x48\x83\xc1\xb7\x9a\x4d\xf7\x86\x74\xdb\x64\xd3\xf4\
\xf7\xd3\x2e\x52\xe2\xd6\x38\xa0\x1e\x50\x8d\x1d\x09\x5f\x93\x66\
\xdc\x03\xc1\x5c\x57\x45\x40\x05\x56\xd6\x34\x8b\x5f\x10\x69\x17\
\x5a\x7d\xf4\x11\xdd\x59\xdf\x42\xf6\xf3\xc3\x22\xee\x49\x63\x75\
\x2a\xca\xc0\xf5\x04\x12\x08\xf7\xab\x35\xf9\x1f\xff\x00\x07\x3a\
\xfe\xdf\xbe\x32\xfd\x89\x6e\x7c\x0f\xa7\xe8\xfe\x32\xf1\xff\x00\
\x87\x34\x3f\x1e\xe8\x5a\x85\xaa\xa7\x85\xef\x21\xd3\x5e\xdb\x50\
\x82\xea\xcc\xa4\xf3\x5d\x18\x24\x95\x63\x68\x26\x99\x36\xc6\x54\
\xe4\x2b\x73\x82\x08\x07\x3b\xfb\x01\x2f\xc6\x4b\x5f\xda\x0a\x1f\
\xd8\xf4\xfc\x66\xf1\x86\x9b\xe1\x3f\x84\xba\x87\x89\x74\x7d\x46\
\x1f\x0e\xe9\xf6\x36\x7a\xd6\x99\xa1\x59\x8b\x19\x74\x3b\x96\xbd\
\x96\x39\x64\x54\xb9\x8e\xfc\xc2\x36\xaa\x90\x6d\xf0\xad\x85\x26\
\xbc\x0f\xe2\x64\x3f\x0b\x7f\x65\x7f\xf8\x28\x47\xc7\x1f\x10\x7c\
\x4c\x97\xce\xf8\x95\xfb\x33\x78\x72\x3b\xaf\x87\xfa\x25\xf4\x93\
\xea\xba\xa7\xc4\x5d\x5e\xfd\x47\xd9\x75\xdb\xbb\x89\x9e\x57\x9a\
\x78\xbc\xeb\x45\x16\xca\x76\xc5\x82\xe8\xaa\xaa\x45\x74\x1f\xf0\
\x4d\x6f\xf8\x28\x17\x83\x7f\x63\x3f\xd9\xdb\x51\xd0\xff\x00\x65\
\x3f\x82\xdf\x16\xbf\x69\xef\x8f\x5e\x3f\x75\xbf\xf1\x67\x8b\xce\
\x87\x79\x6f\xa2\x4d\x7d\x83\xb5\x5e\xf2\xe3\x33\x9b\x58\x0b\xb0\
\x40\xe1\x0b\xfc\xce\xce\x8c\xe7\x17\xbf\x64\x5f\xf8\x37\x47\xf6\
\x9c\xf8\xf9\xfb\x52\xf8\x93\xf6\x9a\xf8\xff\x00\xf1\x2b\x4f\xf8\
\x77\xf1\x63\x53\x9e\x6d\x7b\x41\xb4\xd1\x4a\x5f\x5c\xe9\xda\xbe\
\xc1\xf6\x39\x27\x2a\x4c\x11\xdb\x40\x56\x34\xf2\x11\xa5\x2f\x1a\
\x6c\x2c\xbc\xe4\x03\xf3\xb7\xe0\x27\xfc\x11\x7f\xe2\x89\xfd\xa8\
\xfc\x1f\xe0\xad\x6f\xc3\x70\xeb\xdf\x17\xbc\x51\x69\x1f\x89\x21\
\xf0\x8d\xd8\x97\xca\xd0\xad\x26\x67\xf2\xaf\xf5\xc9\x02\xec\xb6\
\xb7\x42\x04\xaf\x0e\xe6\x96\x43\xb2\x10\xa1\x9d\xb1\xfb\x19\xfb\
\x1a\xff\x00\xc1\xa7\xbf\x0b\xff\x00\x67\x76\xf8\x5b\xe2\x6f\x12\
\x78\xa6\xfb\xc4\x9f\x10\x3c\x17\xe2\x2b\x1f\x12\xeb\x13\x0b\x48\
\xdb\x4b\xd4\xa4\xb7\xf3\x9c\xda\x45\x11\x0a\x52\x26\x9e\x48\x1c\
\xbb\xef\x62\x2d\x55\x40\x50\xc6\xbe\xc9\xff\x00\x82\x61\x7c\x4f\
\xf0\xf7\xc6\xef\x87\xfe\x2e\xf1\x35\xc7\x85\x2c\xbc\x23\xf1\x9a\
\x2d\x72\x4d\x13\xe2\x9d\x87\x98\xd3\xdd\x5b\xeb\x76\x8a\xa8\xca\
\x24\x72\x5d\xad\x1a\x32\x92\xdb\x00\x76\x08\x66\x5d\xa0\x12\xd5\
\xf4\xed\x00\x78\x3e\xb3\xff\x00\x04\xe5\xf8\x6b\xab\xfe\xdf\x9a\
\x37\xed\x28\xb6\xba\xad\x8f\xc4\xdd\x23\x44\x97\x40\x79\xad\x6e\
\xfc\xbb\x3d\x4a\xd9\xd1\x90\x1b\x88\xb6\x9f\x31\xd1\x5b\x0a\x77\
\x0c\x6d\x5c\x83\xb5\x71\xe9\x5f\x18\x3e\x3e\xf8\x17\xf6\x7b\xd0\
\x23\xd5\x7c\x7b\xe3\x2f\x0a\xf8\x2b\x4c\x99\x8a\x47\x75\xae\xea\
\xb0\x69\xf0\xca\xc3\xaa\xab\x4a\xca\x18\xf2\x38\x1c\xf3\x5a\x9f\
\x11\xfc\x7d\xa6\xfc\x2a\xf8\x7b\xaf\x78\xa3\x5a\x9b\xec\xda\x3f\
\x86\xf4\xeb\x8d\x52\xfa\x6c\x7f\xaa\x82\x08\xda\x59\x1b\xf0\x55\
\x26\xbf\x89\xdf\xf8\x29\x5f\xfc\x14\x4b\xc7\x1f\xf0\x53\x0f\xda\
\xab\xc4\x1f\x12\x3c\x65\x7d\x70\xd6\xf7\x53\xc9\x06\x87\xa4\x97\
\xdd\x6d\xa0\xe9\xe1\x8f\x95\x6d\x12\xf4\x18\x5c\x17\x61\xcb\xb9\
\x66\x3c\x9a\x00\xfe\xd7\x7e\x19\xfc\x56\xf0\xbf\xc6\x8f\x09\x41\
\xaf\xf8\x3f\xc4\x9a\x0f\x8a\xb4\x3b\xa2\x56\x1d\x47\x47\xbf\x8a\
\xfa\xd6\x52\x3a\x81\x24\x4c\xca\x48\xc8\xc8\xcf\x14\x57\xf3\xa9\
\xff\x00\x06\x4f\x6a\x1f\x10\x8f\xed\x77\xf1\x52\xd7\x4f\x93\x52\
\x6f\x85\xeb\xe1\x75\x97\x5a\x8c\xbb\x7d\x8a\x3d\x50\xdc\xc4\x2c\
\xdb\x1d\x3c\xe3\x12\xdd\x80\x47\x25\x03\x67\xa0\xa2\x80\x3f\xa4\
\xaa\x28\xa2\x80\x0a\xf9\x17\xf6\x9f\xf8\xa7\xe1\xbf\x10\xff\x00\
\xc1\x43\x3c\x2d\xf0\xb7\xe2\x86\xa9\xa4\x69\x7f\x0d\x57\xc0\x97\
\x3e\x30\xb5\xb3\xd5\xae\x52\xdb\x4e\xf1\x1e\xa5\x15\xfa\x41\x24\
\x57\x0d\x23\x04\x99\x6d\xa1\x64\x94\x40\xd9\x52\x67\xde\xc0\xf9\
\x63\x05\x14\x00\xdf\xf8\x26\x86\xa5\xe0\xbd\x33\xf6\x80\xfd\xa7\
\xbc\x3b\xe0\xfd\x4a\xc6\xf2\x2b\x7f\x1a\xd8\xeb\xad\x0e\x8c\x22\
\x1a\x1d\xad\xbd\xf6\x93\x68\xd6\xe2\xd8\x44\x4a\x09\x58\x43\x23\
\x4d\x8c\x16\x76\x57\x20\x6f\x15\xf5\xe5\x14\x50\x07\x01\xfb\x55\
\xfc\x6d\x87\xf6\x6c\xfd\x9a\x3c\x7b\xf1\x02\x68\x5a\xe2\x3f\x06\
\xe8\x37\x9a\xbf\x94\xab\x9f\x30\xc3\x0b\x3a\x83\xe8\x09\x03\x27\
\xb0\xc9\xed\x5f\x9b\xdf\x1d\xbf\xe0\x84\xbf\x0f\xfc\x4d\xff\x00\
\x04\xbf\xd6\x3c\x59\xe2\x9b\x7d\x3f\xe2\x07\xed\x01\x6f\xa3\x47\
\xe3\xad\x53\xc6\x5a\x8e\xa9\x7b\xab\x41\xe2\x0d\x4e\xda\x3f\xb5\
\xc9\x07\xcd\x27\x36\x13\x05\x78\x84\x51\x85\x5d\x8e\xa4\x0c\xa8\
\x34\x51\x40\x1b\x9f\x02\x3f\xe0\xe5\x6f\x80\x7a\x4e\x81\xa3\xea\
\xfe\x32\xb0\xf1\x47\xc1\x4f\x86\x3a\x96\x83\x6c\xbe\x0b\x8f\x50\
\xf0\x7d\xda\xda\xeb\x8d\x11\xf2\xee\xda\xd6\x5b\x68\xde\x2f\x26\
\xde\x41\xe4\x22\x2e\x09\x11\xbb\x1c\x02\x82\xba\xdf\x8d\xbf\xf0\
\x75\x2f\xec\x65\xf0\x93\xc1\xd2\xea\x3a\x5f\xc4\x4d\x4b\xc7\x9a\
\x87\x94\x64\x83\x4a\xd0\x74\x2b\xc3\x71\x33\x63\x85\x2f\x71\x1c\
\x51\x26\x4f\xf7\x9c\x63\xde\x8a\x28\x03\xe1\xaf\xf8\x24\xb7\xfc\
\x15\x03\xe2\xe7\xc6\x5f\xf8\x29\x27\x8c\x7f\x6a\x4f\x14\x78\x6d\
\x7c\x33\xf0\x07\xe3\x77\x8b\x34\xdf\x85\xd7\x51\x22\x15\x83\x4e\
\xbc\x30\xc8\x34\x99\xcc\x98\x02\x67\x89\x92\x3b\x79\xa6\x38\x1b\
\xaf\xd4\x60\x00\xaa\xbf\xbf\x94\x51\x40\x1f\x2f\x7f\xc1\x6b\xf5\
\x2b\xcd\x27\xfe\x09\x23\xfb\x45\x4d\x63\xe6\x0b\x81\xe0\x3d\x51\
\x33\x1f\xde\x08\xd0\x32\xb9\xfc\x10\xb7\xe1\x5f\xc5\x34\x60\x06\
\x56\x65\x2c\x99\x19\xf7\xa2\x8a\x00\xfe\xc0\xff\x00\xe0\xda\x2f\
\xd9\x7f\x4e\xfd\x99\xff\x00\xe0\x8f\xdf\x0b\x64\x87\x4f\x8a\xd3\
\x59\xf1\xfd\xb4\x9e\x2e\xd5\xe7\x09\x89\x2e\xe4\xbb\x72\xd0\x33\
\x1e\xa7\x6d\xa8\xb7\x41\xec\xbe\xe6\x8a\x28\xa0\x0f\xff\xd9\
"
qt_resource_name = b"\
\x00\x09\
\x05\x91\xe8\x14\
\x00\x52\
\x00\x45\x00\x41\x00\x44\x00\x4d\x00\x45\x00\x2e\x00\x6d\x00\x64\
\x00\x06\
\x07\x03\x7d\xc3\
\x00\x69\
\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
\x00\x08\
\x0b\x77\x5c\xa7\
\x00\x68\
\x00\x65\x00\x61\x00\x64\x00\x2e\x00\x6a\x00\x70\x00\x67\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x18\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x04\x12\
"
qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x63\x19\x74\xf8\x4b\
\x00\x00\x00\x18\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x04\x12\
\x00\x00\x01\x60\x83\x46\x10\xc7\
"
qt_version = QtCore.qVersion().split('.')
if qt_version < ['5', '8', '0']:
rcc_version = 1
qt_resource_struct = qt_resource_struct_v1
else:
rcc_version = 2
qt_resource_struct = qt_resource_struct_v2
def qInitResources():
QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()

View file

@ -0,0 +1,48 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QFile, QIODevice, QTextStream, QTextCodec
from PyQt5.QtWidgets import QTextBrowser
import res_rc # @UnresolvedImport @UnusedImport
# Created on 2018年5月1日
# author: Irony
# site: https://github.com/892768447
# email: 892768447@qq.com
# file: QRC资源文件使用.textread
# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0
class TextBrowser(QTextBrowser):
def __init__(self, *args, **kwargs):
super(TextBrowser, self).__init__(*args, **kwargs)
self.setText(self.readText(':/README.md'))
def readText(self, path):
file = QFile(path)
if not file.open(QIODevice.ReadOnly):
return ''
stream = QTextStream(file)
# 下面这句设置编码根据文件的编码自行确定
stream.setCodec(QTextCodec.codecForName('UTF-8'))
data = stream.readAll()
file.close()
del stream
return data
if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
app.aboutToQuit.connect(res_rc.qCleanupResources) # 退出时要清理资源
w = TextBrowser()
w.show()
sys.exit(app.exec_())

Binary file not shown.

View file

@ -32,6 +32,16 @@
- [1.22 Json生成QTreeWidget](Json生成QTreeWidget/)
- [1.23 嵌入外部窗口](嵌入外部窗口/)
- [1.24 必应壁纸](https://github.com/892768447/BingWallpaper)
- [1.25 网络操作](网络操作/)
- [1.26 无边框自定义标题栏窗口](无边框自定义标题栏窗口/)
- [1.27 QRC资源文件使用](QRC资源文件使用/)
- [1.28 C和C++扩展](C和C++扩展/)
- [1.28.1 pyx和c++](C和C++扩展/pyx和c++/)
- [1.28.2 py转pyd](C和C++扩展/py转pyd/)
- [1.28.3 pydext](C和C++扩展/pydext/)
- [1.29 数据库查询显示表格](数据库查询显示表格/)
- [1.30 左侧选项卡](左侧选项卡/)
- [1.40 探测窗口和放大截图](探测窗口和放大截图/)
### [2.QGraphicsView练习](QGraphicsView练习/)
@ -53,7 +63,7 @@
- [4.7 QPushButton进度动画](界面美化/QPushButton进度动画)
- [4.8 折叠动画效果](partner_625781186/2.折叠控件/)
- [4.9 水波纹进度条](界面美化/水波纹进度条)
- [4.10 QSlider美化](界面美化/QSlider美化)
### [5.QML](partner_625781186/QML_QtQuick_PY)
- [python_QML调用基础](partner_625781186/QML_QtQuick_PY/python_QML调用基础)

View file

@ -11,7 +11,9 @@ Created on 2017年12月11日
'''
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTextBrowser, QPushButton
from PyQt5.QtCore import pyqtSignal, Qt
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTextBrowser, QPushButton,\
QMessageBox
import keyboard
@ -22,9 +24,12 @@ __Version__ = "Version 1.0"
class Window(QWidget):
dialogShow = pyqtSignal()
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
layout = QVBoxLayout(self)
self.dialogShow.connect(self.onShowDialog, type=Qt.QueuedConnection)
self.logView = QTextBrowser(self)
self.logView.append("点击右上角关闭按钮会隐藏窗口,通过热键Alt+S来显示")
self.logView.append("等待热键中")
@ -53,6 +58,10 @@ class Window(QWidget):
self.logView.append('按下alt+s')
self.show()
self.showNormal()
self.dialogShow.emit()
def onShowDialog(self):
QMessageBox.information(self, '对话框', '按下alt+s键')
def onHide(self):
"""隐藏"""

View file

@ -4,5 +4,20 @@ pip install keyboard
https://github.com/892768447/keyboard
* keyboard
* 该模块使用全局低级钩子的方式hook键盘来处理,对系统有一定的影响
* 有反映说弹出对话框假死,这里粗略解决下使用信号槽的方式来弹出对话框
* 该模块里使用了每次产生一个子线程来回调函数
```
def call_later(fn, args=(), delay=0.001):
"""
Calls the provided function in a new thread after waiting some time.
Useful for giving the system some time to process an event, without blocking
the current execution flow.
"""
thread = _Thread(target=lambda: (_time.sleep(delay), fn(*args)))
thread.start()
```
# 截图
![截图](ScreenShot/1.gif)

Binary file not shown.

View file

@ -0,0 +1,18 @@
# 认识设计师
* 1、启动对话框常用的QDialogQMainWindow, QWidget见①
* Dialog with Buttons Bottom在下方有两个按钮的对话框
* Dialog with Buttons Right在右边有两个按钮的对话框
* Dialog without Buttons不带按钮的对话框
* Main Window标准的主界面窗口带有菜单栏状态栏浮动窗口等等
* Widget所有控件的基类一般用于当作容器
![Colors.png](ScreenShot/初识设计师1.png)
* 2、设计师界面分布见②③④⑤
* 左侧②是常用控件区域,拖动放到中间
* ③是当前的控件对象
* ④当前控件的属性设置(比如设置大小、文字之类的)
* ⑤该区域为信号槽设计、图片等文件资源设计、动作设计器(后面在详细讲)
![Colors.png](ScreenShot/初识设计师2.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View file

@ -0,0 +1,110 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from random import randint
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QListWidget, QStackedWidget, QHBoxLayout,\
QListWidgetItem, QLabel
# Created on 2018年5月29日
# author: Irony
# site: https://github.com/892768447
# email: 892768447@qq.com
# file: LeftTabWidget
# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0
class LeftTabWidget(QWidget):
def __init__(self, *args, **kwargs):
super(LeftTabWidget, self).__init__(*args, **kwargs)
self.resize(800, 600)
#左右布局(左边一个QListWidget + 右边QStackedWidget)
layout = QHBoxLayout(self, spacing=0)
layout.setContentsMargins(0, 0, 0, 0)
# 左侧列表
self.listWidget = QListWidget(self)
layout.addWidget(self.listWidget)
# 右侧层叠窗口
self.stackedWidget = QStackedWidget(self)
layout.addWidget(self.stackedWidget)
self.initUi()
def initUi(self):
# 初始化界面
# 通过QListWidget的当前item变化来切换QStackedWidget中的序号
self.listWidget.currentRowChanged.connect(
self.stackedWidget.setCurrentIndex)
# 去掉边框
self.listWidget.setFrameShape(QListWidget.NoFrame)
# 隐藏滚动条
self.listWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.listWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
# 这里就用一般的文本配合图标模式了(也可以直接用Icon模式,setViewMode)
for i in range(20):
item = QListWidgetItem(
QIcon('images/0%d.ico' % randint(1, 8)), str('选 项 %s' % i), self.listWidget)
# 设置item的默认宽高(这里只有高度比较有用)
item.setSizeHint(QSize(16777215, 60))
# 文字居中
item.setTextAlignment(Qt.AlignCenter)
# 再模拟20个右侧的页面(就不和上面一起循环放了)
for i in range(20):
label = QLabel('我是页面 %d' % i, self)
label.setAlignment(Qt.AlignCenter)
# 设置label的背景颜色(这里随机)
# 这里加了一个margin边距(方便区分QStackedWidget和QLabel的颜色)
label.setStyleSheet('background: rgb(%d, %d, %d);margin: 50px;' % (
randint(0, 255), randint(0, 255), randint(0, 255)))
self.stackedWidget.addWidget(label)
# 美化样式表
Stylesheet = """
/*去掉item虚线边框*/
QListWidget, QListView, QTreeWidget, QTreeView {
outline: 0px;
}
/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/
QListWidget {
min-width: 120px;
max-width: 120px;
color: white;
background: black;
}
/*被选中时的背景颜色和左边框颜色*/
QListWidget::item:selected {
background: rgb(52, 52, 52);
border-left: 2px solid rgb(9, 187, 7);
}
/*鼠标悬停颜色*/
HistoryPanel::item:hover {
background: rgb(52, 52, 52);
}
/*右侧的层叠窗口的背景颜色*/
QStackedWidget {
background: rgb(30, 30, 30);
}
/*模拟的页面*/
QLabel {
color: white;
}
"""
if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
app.setStyleSheet(Stylesheet)
w = LeftTabWidget()
w.show()
sys.exit(app.exec_())

10
左侧选项卡/README.md Normal file
View file

@ -0,0 +1,10 @@
# 选项卡
### [Python3.4.4 or Python3.5][PyQt5]
### 1.方式一使用 左边一个QListWidget + 右边QStackedWidget
详细注释在代码中
# 截图
![截图](ScreenShot/1.gif)

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,7 @@
# 简单探测窗口和放大截图
利用win32gui模块获取鼠标所在位置的窗口大小(未去掉边框)和rgb颜色, 主要思路是利用一个全屏的全透明鼠标穿透的窗口(目的在于绘制矩形框和截图)
截图
![1](ScreenShot/1.gif)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View file

@ -0,0 +1,120 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen, QCursor, QColor
from PyQt5.QtWidgets import QLabel, QWidget, QApplication
import win32gui
# Created on 2018年6月8日
# author: Irony
# site: https://github.com/892768447
# email: 892768447@qq.com
# file: 简单探测窗口和放大截图
# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0
class FrameWidget(QWidget):
# 一个全屏的透明窗口
def __init__(self, *args, **kwargs):
super(FrameWidget, self).__init__(*args, **kwargs)
self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint |
Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.showFullScreen() # 全屏
self._rect = QRect() # 被探测的窗口的矩形位置
def setRect(self, x, y, w, h):
# 更新矩形框
self._rect.setX(x)
self._rect.setY(y)
self._rect.setWidth(w - x)
self._rect.setHeight(h - y)
self.update()
def paintEvent(self, event):
super(FrameWidget, self).paintEvent(event)
if self._rect.isValid(): # 画边框
painter = QPainter(self)
painter.setPen(QPen(Qt.red, 4))
painter.drawRect(self._rect)
class Label(QLabel):
def __init__(self, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.ismd = False # 是不是否按下
self.setAlignment(Qt.AlignCenter)
self.setText('鼠标按住不放拖动到外面')
self.resize(240, 240)
self.frameWidget = FrameWidget() # 边框
def closeEvent(self, event):
self.frameWidget.close()
super(Label, self).closeEvent(event)
def mousePressEvent(self, event):
super(Label, self).mousePressEvent(event)
self.ismd = True # 按下
# 设置鼠标样式为十字
self.setCursor(Qt.CrossCursor)
def mouseReleaseEvent(self, event):
super(Label, self).mouseReleaseEvent(event)
self.ismd = False
self.frameWidget.setRect(0, 0, 0, 0)
# 设置鼠标样式为普通
self.setCursor(Qt.ArrowCursor)
self.clear()
self.setText('鼠标按住不放拖动到外面')
def mouseMoveEvent(self, event):
super(Label, self).mouseMoveEvent(event)
# 得到鼠标在屏幕中的位置
pos = self.mapToGlobal(event.pos())
hwnd = win32gui.WindowFromPoint((pos.x(), pos.y()))
self.frameWidget.setRect(*win32gui.GetWindowRect(hwnd))
# 截图
screen = QApplication.primaryScreen()
if screen is not None:
image = screen.grabWindow(0,
pos.x() - 60, pos.y() - 60, 120, 120)
if not image.isNull():
self.setPixmap(image.scaled(240, 240))
def paintEvent(self, event):
super(Label, self).paintEvent(event)
# 中正间画十字
painter = QPainter(self)
painter.setPen(Qt.red)
x = int(self.width() / 2)
y = int(self.height() / 2)
painter.drawLine(x, 0, x, self.height())
painter.drawLine(0, y, self.width(), y)
if self.ismd:
# 画坐标点
pos = QCursor.pos()
ret = win32gui.GetPixel(win32gui.GetWindowDC(
win32gui.GetDesktopWindow()), pos.x(), pos.y())
r, g, b = ret & 0xff, (ret >> 8) & 0xff, (ret >> 16) & 0xff
print(r, g, b)
painter.setPen(Qt.white)
painter.drawText(self.rect(), Qt.AlignLeft |
Qt.AlignBottom, '({}, {})\nRGB: ({}, {}, {})\n{}'.format(
pos.x(), pos.y(), r, g, b, QColor(r, g, b).name()))
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)
w = Label()
w.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,5 @@
# sqlalchemy动态拼接字段查询结果
截图
![1](ScreenShot/1.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

View file

@ -0,0 +1,149 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年5月15日
@author: Irony
@site: https://github.com/892768447
@email: 892768447@qq.com
@file: 数据库查询显示表格.main
@description:
"""
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QWidget, QMessageBox, QTableWidgetItem
from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative.api import declarative_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.sql.expression import and_
from sqlalchemy.sql.schema import Column
from sqlalchemy.sql.sqltypes import Integer, Text
from 数据库查询显示表格.mainui import Ui_Form
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = "Copyright (c) 2018 Irony"
__Version__ = "Version 1.0"
# engine = create_engine('mysql+mysqldb://root@localhost:3306/tourist?charset=utf8')
engine = create_engine('sqlite:///data.sqlite3', echo=True) # echo 表示开启命令显示
Base = declarative_base()
class Tourist(Base):
__tablename__ = 'tourist'
id = Column(Integer, primary_key=True)
name = Column(Text)
license = Column(Text)
flightnumber = Column(Text)
flightdate = Column(Text)
seatnumber = Column(Text)
boardingport = Column(Text)
no = Column(Text)
departurestation = Column(Text)
destinationstation = Column(Text)
class Window(QWidget, Ui_Form):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
self.setupUi(self)
# sql的拼接字段
self.sql = {}
# 数据库连接
self.session = sessionmaker(bind=engine)()
@pyqtSlot()
def on_pushButtonQuery_clicked(self):
"""查询按钮"""
self.applyName()
self.applySeat()
self.applyLicense()
self.applyPort()
if not self.sql:
return QMessageBox.warning(self, '提示', '没有进行任何输入')
# 清空数据
self.tableWidget.clear()
# 重新设置表头
self.tableWidget.setHorizontalHeaderLabels(
['编号', '姓名', '证件号', '航班号', '航班日期', '座位号', '登机口', '序号', '出发地', '目的地'])
# 根据选择的字段进行并列查询
rets = self.session.query(Tourist).filter(
and_(*(key == value for key, value in self.sql.items()))).all()
if not rets:
return QMessageBox.information(self, '提示', '未查询到结果')
self.tableWidget.setRowCount(len(rets))
# 根据查询结果添加到表格中
for row, tourist in enumerate(rets):
self.tableWidget.setItem(row, 0, QTableWidgetItem(str(tourist.id)))
self.tableWidget.setItem(
row, 1, QTableWidgetItem(str(tourist.name)))
self.tableWidget.setItem(
row, 2, QTableWidgetItem(str(tourist.license)))
self.tableWidget.setItem(
row, 3, QTableWidgetItem(str(tourist.flightnumber)))
self.tableWidget.setItem(
row, 4, QTableWidgetItem(str(tourist.flightdate)))
self.tableWidget.setItem(
row, 5, QTableWidgetItem(str(tourist.seatnumber)))
self.tableWidget.setItem(
row, 6, QTableWidgetItem(str(tourist.boardingport)))
self.tableWidget.setItem(row, 7, QTableWidgetItem(str(tourist.no)))
self.tableWidget.setItem(
row, 8, QTableWidgetItem(str(tourist.departurestation)))
self.tableWidget.setItem(
row, 9, QTableWidgetItem(str(tourist.destinationstation)))
def applyName(self):
"""姓名"""
if not self.checkBoxName.isChecked():
if Tourist.name in self.sql:
# 移除
self.sql.pop(Tourist.name)
# 更新或添加到字典里
else:
self.sql[Tourist.name] = self.lineEditName.text().strip()
def applySeat(self):
"""座位号"""
if not self.checkBoxSeat.isChecked():
if Tourist.seatnumber in self.sql:
# 移除
self.sql.pop(Tourist.seatnumber)
# 更新或添加到字典里
else:
self.sql[Tourist.seatnumber] = self.lineEditSeat.text().strip()
def applyLicense(self):
"""证件号"""
if not self.checkBoxLicense.isChecked():
if Tourist.license in self.sql:
# 移除
self.sql.pop(Tourist.license)
# 更新或添加到字典里
else:
self.sql[Tourist.license] = self.lineEditLicense.text().strip()
def applyPort(self):
"""登机口"""
if not self.checkBoxPort.isChecked():
if Tourist.boardingport in self.sql:
# 移除
self.sql.pop(Tourist.boardingport)
# 更新或添加到字典里
else:
self.sql[Tourist.boardingport] = self.lineEditPort.text().strip()
if __name__ == '__main__':
import sys
import cgitb
sys.excepthook = cgitb.Hook(1, None, 5, sys.stderr, 'text')
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,111 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mainui.ui'
#
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 362)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.checkBoxName = QtWidgets.QCheckBox(Form)
self.checkBoxName.setObjectName("checkBoxName")
self.gridLayout.addWidget(self.checkBoxName, 0, 0, 1, 1)
self.checkBoxSeat = QtWidgets.QCheckBox(Form)
self.checkBoxSeat.setObjectName("checkBoxSeat")
self.gridLayout.addWidget(self.checkBoxSeat, 0, 2, 1, 1)
self.lineEditName = QtWidgets.QLineEdit(Form)
self.lineEditName.setObjectName("lineEditName")
self.gridLayout.addWidget(self.lineEditName, 0, 1, 1, 1)
self.tableWidget = QtWidgets.QTableWidget(Form)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(10)
self.tableWidget.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
self.gridLayout.addWidget(self.tableWidget, 3, 0, 1, 4)
self.lineEditSeat = QtWidgets.QLineEdit(Form)
self.lineEditSeat.setObjectName("lineEditSeat")
self.gridLayout.addWidget(self.lineEditSeat, 0, 3, 1, 1)
self.lineEditPort = QtWidgets.QLineEdit(Form)
self.lineEditPort.setObjectName("lineEditPort")
self.gridLayout.addWidget(self.lineEditPort, 1, 3, 1, 1)
self.checkBoxPort = QtWidgets.QCheckBox(Form)
self.checkBoxPort.setObjectName("checkBoxPort")
self.gridLayout.addWidget(self.checkBoxPort, 1, 2, 1, 1)
self.checkBoxLicense = QtWidgets.QCheckBox(Form)
self.checkBoxLicense.setObjectName("checkBoxLicense")
self.gridLayout.addWidget(self.checkBoxLicense, 1, 0, 1, 1)
self.lineEditLicense = QtWidgets.QLineEdit(Form)
self.lineEditLicense.setObjectName("lineEditLicense")
self.gridLayout.addWidget(self.lineEditLicense, 1, 1, 1, 1)
self.pushButtonQuery = QtWidgets.QPushButton(Form)
self.pushButtonQuery.setObjectName("pushButtonQuery")
self.gridLayout.addWidget(self.pushButtonQuery, 2, 0, 1, 4)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.checkBoxName.setText(_translate("Form", "姓名"))
self.checkBoxSeat.setText(_translate("Form", "座位号"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("Form", "编号"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("Form", "姓名"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("Form", "证件号"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("Form", "航班号"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("Form", "航班日期"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("Form", "座位号"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("Form", "登机口"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("Form", "序号"))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(_translate("Form", "出发地"))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(_translate("Form", "目的地"))
self.checkBoxPort.setText(_translate("Form", "登机口"))
self.checkBoxLicense.setText(_translate("Form", "证件号"))
self.pushButtonQuery.setText(_translate("Form", "查询"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())

View file

@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>362</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="checkBoxName">
<property name="text">
<string>姓名</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="checkBoxSeat">
<property name="text">
<string>座位号</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEditName"/>
</item>
<item row="3" column="0" colspan="4">
<widget class="QTableWidget" name="tableWidget">
<column>
<property name="text">
<string>编号</string>
</property>
</column>
<column>
<property name="text">
<string>姓名</string>
</property>
</column>
<column>
<property name="text">
<string>证件号</string>
</property>
</column>
<column>
<property name="text">
<string>航班号</string>
</property>
</column>
<column>
<property name="text">
<string>航班日期</string>
</property>
</column>
<column>
<property name="text">
<string>座位号</string>
</property>
</column>
<column>
<property name="text">
<string>登机口</string>
</property>
</column>
<column>
<property name="text">
<string>序号</string>
</property>
</column>
<column>
<property name="text">
<string>出发地</string>
</property>
</column>
<column>
<property name="text">
<string>目的地</string>
</property>
</column>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="lineEditSeat"/>
</item>
<item row="1" column="3">
<widget class="QLineEdit" name="lineEditPort"/>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="checkBoxPort">
<property name="text">
<string>登机口</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBoxLicense">
<property name="text">
<string>证件号</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineEditLicense"/>
</item>
<item row="2" column="0" colspan="4">
<widget class="QPushButton" name="pushButtonQuery">
<property name="text">
<string>查询</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -0,0 +1,342 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt, pyqtSignal, QPoint
from PyQt5.QtGui import QFont, QEnterEvent, QPainter, QColor, QPen
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel,\
QSpacerItem, QSizePolicy, QPushButton
# Created on 2018年4月30日
# author: Irony
# site: https://github.com/892768447
# email: 892768447@qq.com
# file: FramelessWindow
# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2018 Irony'
__Version__ = 1.0
class TitleBar(QWidget):
# 窗口最小化信号
windowMinimumed = pyqtSignal()
# 窗口最大化信号
windowMaximumed = pyqtSignal()
# 窗口还原信号
windowNormaled = pyqtSignal()
# 窗口关闭信号
windowClosed = pyqtSignal()
# 窗口移动
windowMoved = pyqtSignal(QPoint)
def __init__(self, *args, **kwargs):
super(TitleBar, self).__init__(*args, **kwargs)
# 支持qss设置背景
self.setAttribute(Qt.WA_StyledBackground, True)
self.mPos = None
self.iconSize = 20 # 图标的默认大小
# 设置默认背景颜色,否则由于受到父窗口的影响导致透明
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(palette.Window, QColor(240, 240, 240))
self.setPalette(palette)
# 布局
layout = QHBoxLayout(self, spacing=0)
layout.setContentsMargins(0, 0, 0, 0)
# 窗口图标
self.iconLabel = QLabel(self)
# self.iconLabel.setScaledContents(True)
layout.addWidget(self.iconLabel)
# 窗口标题
self.titleLabel = QLabel(self)
self.titleLabel.setMargin(2)
layout.addWidget(self.titleLabel)
# 中间伸缩条
layout.addSpacerItem(QSpacerItem(
40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
# 利用Webdings字体来显示图标
font = self.font() or QFont()
font.setFamily('Webdings')
# 最小化按钮
self.buttonMinimum = QPushButton(
'0', self, clicked=self.windowMinimumed.emit, font=font, objectName='buttonMinimum')
layout.addWidget(self.buttonMinimum)
# 最大化/还原按钮
self.buttonMaximum = QPushButton(
'1', self, clicked=self.showMaximized, font=font, objectName='buttonMaximum')
layout.addWidget(self.buttonMaximum)
# 关闭按钮
self.buttonClose = QPushButton(
'r', self, clicked=self.windowClosed.emit, font=font, objectName='buttonClose')
layout.addWidget(self.buttonClose)
# 初始高度
self.setHeight()
def showMaximized(self):
if self.buttonMaximum.text() == '1':
# 最大化
self.buttonMaximum.setText('2')
self.windowMaximumed.emit()
else: # 还原
self.buttonMaximum.setText('1')
self.windowNormaled.emit()
def setHeight(self, height=38):
"""设置标题栏高度"""
self.setMinimumHeight(height)
self.setMaximumHeight(height)
# 设置右边按钮的大小
self.buttonMinimum.setMinimumSize(height, height)
self.buttonMinimum.setMaximumSize(height, height)
self.buttonMaximum.setMinimumSize(height, height)
self.buttonMaximum.setMaximumSize(height, height)
self.buttonClose.setMinimumSize(height, height)
self.buttonClose.setMaximumSize(height, height)
def setTitle(self, title):
"""设置标题"""
self.titleLabel.setText(title)
def setIcon(self, icon):
"""设置图标"""
self.iconLabel.setPixmap(icon.pixmap(self.iconSize, self.iconSize))
def setIconSize(self, size):
"""设置图标大小"""
self.iconSize = size
def enterEvent(self, event):
self.setCursor(Qt.ArrowCursor)
super(TitleBar, self).enterEvent(event)
def mouseDoubleClickEvent(self, event):
super(TitleBar, self).mouseDoubleClickEvent(event)
self.showMaximized()
def mousePressEvent(self, event):
"""鼠标点击事件"""
if event.button() == Qt.LeftButton:
self.mPos = event.pos()
event.accept()
def mouseReleaseEvent(self, event):
'''鼠标弹起事件'''
self.mPos = None
event.accept()
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton and self.mPos:
self.windowMoved.emit(self.mapToGlobal(event.pos() - self.mPos))
event.accept()
# 枚举左上右下以及四个定点
Left, Top, Right, Bottom, LeftTop, RightTop, LeftBottom, RightBottom = range(8)
class FramelessWindow(QWidget):
# 四周边距
Margins = 5
def __init__(self, *args, **kwargs):
super(FramelessWindow, self).__init__(*args, **kwargs)
self._pressed = False
self.Direction = None
# 背景透明
self.setAttribute(Qt.WA_TranslucentBackground, True)
# 无边框
self.setWindowFlag(Qt.FramelessWindowHint)
# 鼠标跟踪
self.setMouseTracking(True)
# 布局
layout = QVBoxLayout(self, spacing=0)
# 预留边界用于实现无边框窗口调整大小
layout.setContentsMargins(
self.Margins, self.Margins, self.Margins, self.Margins)
# 标题栏
self.titleBar = TitleBar(self)
layout.addWidget(self.titleBar)
# 信号槽
self.titleBar.windowMinimumed.connect(self.showMinimized)
self.titleBar.windowMaximumed.connect(self.showMaximized)
self.titleBar.windowNormaled.connect(self.showNormal)
self.titleBar.windowClosed.connect(self.close)
self.titleBar.windowMoved.connect(self.move)
self.windowTitleChanged.connect(self.titleBar.setTitle)
self.windowIconChanged.connect(self.titleBar.setIcon)
def setTitleBarHeight(self, height=38):
"""设置标题栏高度"""
self.titleBar.setHeight(height)
def setIconSize(self, size):
"""设置图标的大小"""
self.titleBar.setIconSize(size)
def setWidget(self, widget):
"""设置自己的控件"""
if hasattr(self, '_widget'):
return
self._widget = widget
# 设置默认背景颜色,否则由于受到父窗口的影响导致透明
self._widget.setAutoFillBackground(True)
palette = self._widget.palette()
palette.setColor(palette.Window, QColor(240, 240, 240))
self._widget.setPalette(palette)
self._widget.installEventFilter(self)
self.layout().addWidget(self._widget)
def move(self, pos):
if self.windowState() == Qt.WindowMaximized or self.windowState() == Qt.WindowFullScreen:
# 最大化或者全屏则不允许移动
return
super(FramelessWindow, self).move(pos)
def showMaximized(self):
"""最大化,要去除上下左右边界,如果不去除则边框地方会有空隙"""
super(FramelessWindow, self).showMaximized()
self.layout().setContentsMargins(0, 0, 0, 0)
def showNormal(self):
"""还原,要保留上下左右边界,否则没有边框无法调整"""
super(FramelessWindow, self).showNormal()
self.layout().setContentsMargins(
self.Margins, self.Margins, self.Margins, self.Margins)
def eventFilter(self, obj, event):
"""事件过滤器,用于解决鼠标进入其它控件后还原为标准鼠标样式"""
if isinstance(event, QEnterEvent):
self.setCursor(Qt.ArrowCursor)
return super(FramelessWindow, self).eventFilter(obj, event)
def paintEvent(self, event):
"""由于是全透明背景窗口,重绘事件中绘制透明度为1的难以发现的边框,用于调整窗口大小"""
super(FramelessWindow, self).paintEvent(event)
painter = QPainter(self)
painter.setPen(QPen(QColor(255, 255, 255, 1), 2 * self.Margins))
painter.drawRect(self.rect())
def mousePressEvent(self, event):
"""鼠标点击事件"""
super(FramelessWindow, self).mousePressEvent(event)
if event.button() == Qt.LeftButton:
self._mpos = event.pos()
self._pressed = True
def mouseReleaseEvent(self, event):
'''鼠标弹起事件'''
super(FramelessWindow, self).mouseReleaseEvent(event)
self._pressed = False
self.Direction = None
def mouseMoveEvent(self, event):
"""鼠标移动事件"""
super(FramelessWindow, self).mouseMoveEvent(event)
pos = event.pos()
xPos, yPos = pos.x(), pos.y()
wm, hm = self.width() - self.Margins, self.height() - self.Margins
if self.isMaximized() or self.isFullScreen():
self.Direction = None
self.setCursor(Qt.ArrowCursor)
return
if event.buttons() == Qt.LeftButton and self._pressed:
self._resizeWidget(pos)
return
if xPos <= self.Margins and yPos <= self.Margins:
# 左上角
self.Direction = LeftTop
self.setCursor(Qt.SizeFDiagCursor)
elif wm <= xPos <= self.width() and hm <= yPos <= self.height():
# 右下角
self.Direction = RightBottom
self.setCursor(Qt.SizeFDiagCursor)
elif wm <= xPos and yPos <= self.Margins:
# 右上角
self.Direction = RightTop
self.setCursor(Qt.SizeBDiagCursor)
elif xPos <= self.Margins and hm <= yPos:
# 左下角
self.Direction = LeftBottom
self.setCursor(Qt.SizeBDiagCursor)
elif 0 <= xPos <= self.Margins and self.Margins <= yPos <= hm:
# 左边
self.Direction = Left
self.setCursor(Qt.SizeHorCursor)
elif wm <= xPos <= self.width() and self.Margins <= yPos <= hm:
# 右边
self.Direction = Right
self.setCursor(Qt.SizeHorCursor)
elif self.Margins <= xPos <= wm and 0 <= yPos <= self.Margins:
# 上面
self.Direction = Top
self.setCursor(Qt.SizeVerCursor)
elif self.Margins <= xPos <= wm and hm <= yPos <= self.height():
# 下面
self.Direction = Bottom
self.setCursor(Qt.SizeVerCursor)
def _resizeWidget(self, pos):
"""调整窗口大小"""
if self.Direction == None:
return
mpos = pos - self._mpos
xPos, yPos = mpos.x(), mpos.y()
geometry = self.geometry()
x, y, w, h = geometry.x(), geometry.y(), geometry.width(), geometry.height()
if self.Direction == LeftTop: # 左上角
if w - xPos > self.minimumWidth():
x += xPos
w -= xPos
if h - yPos > self.minimumHeight():
y += yPos
h -= yPos
elif self.Direction == RightBottom: # 右下角
if w + xPos > self.minimumWidth():
w += xPos
self._mpos = pos
if h + yPos > self.minimumHeight():
h += yPos
self._mpos = pos
elif self.Direction == RightTop: # 右上角
if h - yPos > self.minimumHeight():
y += yPos
h -= yPos
if w + xPos > self.minimumWidth():
w += xPos
self._mpos.setX(pos.x())
elif self.Direction == LeftBottom: # 左下角
if w - xPos > self.minimumWidth():
x += xPos
w -= xPos
if h + yPos > self.minimumHeight():
h += yPos
self._mpos.setY(pos.y())
elif self.Direction == Left: # 左边
if w - xPos > self.minimumWidth():
x += xPos
w -= xPos
else:
return
elif self.Direction == Right: # 右边
if w + xPos > self.minimumWidth():
w += xPos
self._mpos = pos
else:
return
elif self.Direction == Top: # 上面
if h - yPos > self.minimumHeight():
y += yPos
h -= yPos
else:
return
elif self.Direction == Bottom: # 下面
if h + yPos > self.minimumHeight():
h += yPos
self._mpos = pos
else:
return
self.setGeometry(x, y, w, h)

Some files were not shown because too many files have changed in this diff Show more