<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Python Papers]]></title><description><![CDATA[Learning and Developing in Python]]></description><link>https://www.pythonpapers.com</link><image><url>https://substackcdn.com/image/fetch/$s_!hYhe!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e3c79a3-b014-495b-8ecb-094e0086d5f6_1280x1280.png</url><title>The Python Papers</title><link>https://www.pythonpapers.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 28 Jul 2026 04:26:43 GMT</lastBuildDate><atom:link href="https://www.pythonpapers.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mike Driscoll]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pypapers@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pypapers@substack.com]]></itunes:email><itunes:name><![CDATA[Mike Driscoll]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mike Driscoll]]></itunes:author><googleplay:owner><![CDATA[pypapers@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pypapers@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mike Driscoll]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Python 101 3rd Edition Kickstarter Launch]]></title><description><![CDATA[For years, Python 101 has helped readers take their first steps into programming.]]></description><link>https://www.pythonpapers.com/p/python-101-3rd-edition-kickstarter</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-101-3rd-edition-kickstarter</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 22 Jul 2026 20:05:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HswJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For years, <em>Python 101</em> has helped readers take their first steps into programming. Whether you&#8217;re a complete beginner, a student, or someone looking to learn Python for work or personal projects, the goal has always been the same: make learning Python approachable, practical, and enjoyable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HswJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HswJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 424w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 848w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 1272w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HswJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png" width="715" height="398" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:398,&quot;width&quot;:715,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:305026,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/208111149?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HswJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 424w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 848w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 1272w, https://substackcdn.com/image/fetch/$s_!HswJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77f1fb50-d0c0-4b8e-b920-dfdb8ff5dfdf_715x398.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Python has continued to evolve, and it&#8217;s time for the book to evolve with it. This <a href="https://www.kickstarter.com/projects/driscollis/python-101-3rd-edition">Kickstarter</a> will help fund the writing, editing, production, and publication of the fully updated third edition.</p><h3>Why a Third Edition?</h3><p>Python has changed significantly since the previous edition. New language features, updated best practices, and improvements throughout the ecosystem make this the right time for a comprehensive update.</p><p>The third edition will include:</p><ul><li><p>Updated examples compatible with modern versions of Python</p></li><li><p>New coverage of current Python features and best practices</p></li><li><p>Improved code samples and exercises (when applicable)</p></li><li><p>Corrections and refinements based on reader feedback</p></li></ul><p>The goal isn&#8217;t simply to revise the previous edition&#8212;it&#8217;s to create the best beginner-focused version of <em>Python 101</em> yet.</p><h3>Who Is This Book For?</h3><p>This book is designed for:</p><ul><li><p>Complete beginners with no programming experience</p></li><li><p>Students learning Python</p></li><li><p>Self-taught developers</p></li><li><p>Professionals transitioning into software development</p></li><li><p>Anyone looking for a clear, practical introduction to Python</p></li></ul><p>No prior programming knowledge is required.</p><h3>Why Kickstarter?</h3><p>Kickstarter allows readers to directly support the creation of the book while helping ensure it receives the time and attention needed for a high-quality release.</p><p>Funding will help cover:</p><ul><li><p>Writing</p></li><li><p>Ebook production</p></li><li><p>Print preparation</p></li><li><p>Kickstarter fulfillment and shipping materials</p></li><li><p>Any cover refinements</p></li></ul><p>Most importantly, it allows me to focus on creating the strongest edition possible.</p><h3>Rewards</h3><p>Depending on your pledge level, rewards may include:</p><ul><li><p>DRM-free PDF edition</p></li><li><p>EPUB and Kindle editions</p></li><li><p>Printed paperback</p></li><li><p>Signed copies</p></li><li><p>Early access to chapters during development</p></li><li><p>Exclusive Kickstarter updates</p></li></ul><p>Project updates will be shared throughout the process so backers can follow the book&#8217;s progress.</p><h3>Thank You</h3><p>Whether you back this project or simply share it with others, your support means a great deal.</p><p>Writing technical books is a collaborative effort between authors and readers. Your encouragement has helped make previous editions successful, and I&#8217;m excited to bring an updated <em>Python 101</em> to the next generation of Python learners.</p><p>Thank you for helping make the third edition possible.</p><h2 style="text-align: center;"><a href="https://www.kickstarter.com/projects/driscollis/python-101-3rd-edition">Back the project</a></h2>]]></content:encoded></item><item><title><![CDATA[Adjusting Image Brightness with Python and Pillow]]></title><description><![CDATA[If you have been following this newsletter, you will recall learning about changing an image's contrast and adjusting its color balance with Python.]]></description><link>https://www.pythonpapers.com/p/adjusting-image-brightness-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/adjusting-image-brightness-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 21 Jul 2026 13:11:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NbxY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have been following this newsletter, <span>you will recall learning about&nbsp;</span><a href="https://www.pythonpapers.com/p/changing-image-contrast-with-python"><span>changing an image's contrast&nbsp;</span></a><span>and&nbsp;</span><a href="https://www.pythonpapers.com/p/adjusting-image-color-balance-with"><span>adjusting its color balance&nbsp;</span></a>with Python. Today you will tackle the subject of image brightness!</p><p>Image brightness is a way to measure the intensity or luminosity of an image after it has been captured. Pillow&#8217;s <code>ImageEnhance</code> module allows you to modify the brightness of an image using the <code>Brightness()</code> class. If you use an enhancement factor of <strong>0.0</strong>, Pillow will return a solid black image. When you use an enhancement factor of <strong>1.0</strong>, you will get a copy of the original image returned.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pythonpapers.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Python Papers is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>For this example, you will be using a photo of Silver Falls from the state of Oregon:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NbxY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NbxY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 424w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 848w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 1272w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NbxY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png" width="490" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:490,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:888517,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207911913?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NbxY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 424w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 848w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 1272w, https://substackcdn.com/image/fetch/$s_!NbxY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75c3af32-92d1-488c-b552-2e33c1268ac9_490x726.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>To see how you can adjust the brightness of a photo with Python, open up your code editor and create a new file named </span><code>enhance_brightness.py</code><span>. Now add this code to the file:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WokP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WokP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 424w, https://substackcdn.com/image/fetch/$s_!WokP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 848w, https://substackcdn.com/image/fetch/$s_!WokP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!WokP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WokP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png" width="1334" height="1066" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1066,&quot;width&quot;:1334,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:156331,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207911913?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WokP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 424w, https://substackcdn.com/image/fetch/$s_!WokP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 848w, https://substackcdn.com/image/fetch/$s_!WokP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 1272w, https://substackcdn.com/image/fetch/$s_!WokP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b1ec380-3d6b-4300-9e6d-9b70ea0e64aa_1334x1066.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>In this code, you create an </span><code>enhancer</code><span> object using the </span><code>Brightness()</code><span> class. You use a factor of </span><strong>1.5</strong><span> for this example. When you run this code, you will see that the image has been brightened up considerably:</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vntc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vntc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 424w, https://substackcdn.com/image/fetch/$s_!vntc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 848w, https://substackcdn.com/image/fetch/$s_!vntc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 1272w, https://substackcdn.com/image/fetch/$s_!vntc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vntc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png" width="490" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:490,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:943941,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207911913?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vntc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 424w, https://substackcdn.com/image/fetch/$s_!vntc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 848w, https://substackcdn.com/image/fetch/$s_!vntc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 1272w, https://substackcdn.com/image/fetch/$s_!vntc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50720224-7f2b-4c1e-b7ff-f2d324d4f1b3_490x732.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>If you had used an enhancement factor of </span><strong>2.5</strong><span> as you did in the previous article on image adjustment, the image would have been very blown out. This one is brightened up more than necessary, but is still mostly acceptable. You should try a few different values on this photo or on one of your own.</span></p><h2>Wrapping Up</h2><p>Most cameras that you use today won&#8217;t need a lot of brightness adjustment unless you are taking pictures in a low-light location without a flash. Sometimes those photos can be saved by playing about with different brightness levels.</p><p>Occasionally you will need to adjust a photo&#8217;s brightness if the photo was taken with a bright background, such as a sunrise.</p><p>In either case, Python can help you improve your photos. This is especially true if you happened to take a bunch of photos at that same event and they all need to be tweaked slightly. Python is great for batch jobs such as this.</p><p>Give the Pillow package a try and see what you can do!</p><h2><strong>Want to Learn More?</strong></h2><p><span>You can learn more about what you can do with Python and Pillow in Mike&#8217;s book, </span><strong>Pillow: Image Processing with Python</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2-nu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2-nu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2-nu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg" width="1456" height="1884" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1884,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4205675,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207911913?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2-nu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 424w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 848w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!2-nu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba467793-80fa-4250-a0c4-a3ce5fdfffe3_2550x3300.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><span>Purchase at </span><a href="https://driscollis.gumroad.com/l/pypillow">Gumroad</a><span>, </span><a href="https://leanpub.com/pillow">Leanpub</a><span>, or </span><a href="https://amzn.to/3ZvLfav">Amazon</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pythonpapers.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Python Papers is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[An Intro to Spiel – Creating Presentations in Your Terminal with Python]]></title><description><![CDATA[Have you ever wanted to create a presentation in your computer&#8217;s terminal?]]></description><link>https://www.pythonpapers.com/p/an-intro-to-spiel-creating-presentations</link><guid isPermaLink="false">https://www.pythonpapers.com/p/an-intro-to-spiel-creating-presentations</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 14 Jul 2026 19:22:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eeOS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever wanted to create a presentation in your computer&#8217;s terminal? While this is an uncommon need, a clever open source developer has provided a solution to this problem! The project is called <a href="https://github.com/JoshKarpel/spiel">Spiel</a>, and while it is currently archived, the idea is pretty cool. Spiel uses the <a href="https://github.com/Textualize/rich">Rich</a> package to create the slides for your presentation. Note: while the GitHub page doesn&#8217;t explain why the project is archived, it appears to use a very old version of Textual which cannot be upgraded.</p><p>Let&#8217;s spend a little time learning how this all works.</p><h2>Installing Spiel</h2><p>According to the Spiel GitHub page, you can try Spiel without even installing it if you have docker installed. Here&#8217;s how to try Spiel:</p><p><span>$ docker run -it --rm ghcr.io/joshkarpel/spiel</span></p><p>However, for the purposes of this tutorial, you really should install Spiel. To do that, you will be using pip. Open up your terminal and run the following:</p><p><span>pip install spiel</span></p><p>Feel free to create a Python virtual environment first if you don&#8217;t want to install Spiel into your global Python packages.</p><p>Once you have Spiel installed, you can check that it is working by running the Spiel demo, like this:</p><p><span>spiel demo present</span></p><p>If that works, you are good to go!</p><h2>Creating Your Presentation</h2><p>The documentation gives a good example of how to create a one-slide presentation. Here&#8217;s their example:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eeOS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eeOS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 424w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 848w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 1272w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eeOS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png" width="1284" height="938" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:938,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105895,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207064796?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!eeOS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 424w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 848w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 1272w, https://substackcdn.com/image/fetch/$s_!eeOS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d99c096-304e-44bb-a871-02f379a7a761_1284x938.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>According to the <a href="https://www.spiel.how/slides/">documentation</a>, there are two ways to add slides:</p><ul><li><p>Use the decorator like in the example above</p></li><li><p>Use `<span>deck.add_slides()` and pass in one or more Slide objects</span></p></li></ul><p>Here is a more complete example that creates a couple of custom slides:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3MXd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3MXd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 424w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 848w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3MXd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png" width="1456" height="1223" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1223,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:280881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207064796?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3MXd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 424w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 848w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 1272w, https://substackcdn.com/image/fetch/$s_!3MXd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F720ff7c8-13e3-401e-872b-7d3d3431412c_1876x1576.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you run this code in your terminal, you will see something like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WiP6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WiP6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 424w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 848w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 1272w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WiP6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png" width="1024" height="547" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:547,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15179,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/207064796?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WiP6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 424w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 848w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 1272w, https://substackcdn.com/image/fetch/$s_!WiP6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22e1dc1e-630d-4b80-a183-7c9fa225661b_1024x547.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can move to the next or previous slide using the arrow keys on your keyboard. If you want to exit, press CTRL+C.</p><h2>Wrapping Up</h2><p>Spiel seems like a neat package. It&#8217;s a shame that it is currently archived. Hopefully, the author will reopen it at some point, or someone else will pick up the torch. In the meantime, you can easily use it in a Python virtual environment and give it a try.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.pythonpapers.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Python Papers is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[New Book Release: Python Typing]]></title><description><![CDATA[I am happy to announce that my latest book, Python Typing, is now available on all platforms.]]></description><link>https://www.pythonpapers.com/p/new-book-release-python-typing</link><guid isPermaLink="false">https://www.pythonpapers.com/p/new-book-release-python-typing</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Thu, 09 Jul 2026 14:48:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!P983!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc323a123-f51e-4b67-8a91-f4875d91619f_683x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I am happy to announce that my latest book, <strong>Python Typing</strong>, is now available on all platforms. You can get your copy on <a href="https://driscollis.gumroad.com/l/pytyping">Gumroad</a> or <a href="https://leanpub.com/pythontyping">Leanpub</a> or <a href="https://www.amazon.com/dp/B0H5L5V9YZ">Amazon</a></p><p>Python has had type hinting support since Python 3.5, over TEN years ago! However, Python&#8217;s type annotations have changed repeatedly over the years. In <strong>Python Typing: Type Checking for Python Programmers</strong>, you&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/new-book-release-python-typing">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Changing Image Contrast with Python and Pillow]]></title><description><![CDATA[In the last article, you learned how to adjust an image&#8217;s color balance.]]></description><link>https://www.pythonpapers.com/p/changing-image-contrast-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/changing-image-contrast-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 07 Jul 2026 16:19:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y4IQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb4320a7-9c2a-4d77-ab2d-ed0b0fd11651_842x566.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the last <a href="https://www.pythonpapers.com/p/adjusting-image-color-balance-with">article</a>, you learned how to adjust an image&#8217;s color balance. Today you will learn how to change the contrast in an image.</p><p>Contrast is defined as the difference between dark and light in an image. A high-contrast image will have bright highlights and nice, dark shadows. Colors are usually bold and display texture. A low-contrast image, on the &#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/changing-image-contrast-with-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python eBook and Course Summer Sale]]></title><description><![CDATA[It&#8217;s officially summer, and I am bringing you some HOT Python deals today!]]></description><link>https://www.pythonpapers.com/p/python-ebook-and-course-summer-sale</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-ebook-and-course-summer-sale</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 01 Jul 2026 17:44:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xdqR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1596fb8-ef95-4e05-911e-02989b8bb521_1024x588.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s officially summer, and I am bringing you some HOT Python deals today! Get 33% off almost all my books and courses on Gumroad today using the following <strong>H5N5F7K</strong></p><p>You can start learning the basics of Python with Python 101, or get more targeted learning with my book, Python Logging. If you want to create a user interface, then you might enjoy Creating T&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-ebook-and-course-summer-sale">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Adjusting Image Color Balance with Python]]></title><description><![CDATA[Pillow includes the ImageEnhance A module that contains some classes you can use to enhance your images.]]></description><link>https://www.pythonpapers.com/p/adjusting-image-color-balance-with</link><guid isPermaLink="false">https://www.pythonpapers.com/p/adjusting-image-color-balance-with</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 24 Jun 2026 14:09:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ViN1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7ff77ee-3aee-475f-977f-efa4847dce24_480x648.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Pillow includes the <code>ImageEnhance</code> A module that contains some classes you can use to enhance your images. All of the included classes implement a common interface via the <code>enhance()</code> method. This makes learning how to use <code>ImageEnhance</code> easier.</p><p>You can read more about these classes in the <a href="https://pillow.readthedocs.io/en/3.0.x/reference/ImageEnhance.html">documentation</a>.</p><p>In this article, you will focus only on adjusting an imag&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/adjusting-image-color-balance-with">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Logging - Working with Filters]]></title><description><![CDATA[Python&#8217;s logging module provides support for filters.]]></description><link>https://www.pythonpapers.com/p/python-logging-working-with-filters</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-logging-working-with-filters</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 17 Jun 2026 20:34:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!LGea!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe11fc166-cdae-46d1-8af6-ffec5136bda9_1474x726.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python&#8217;s <code>logging</code> module provides support for filters. You can add a Filter to a <code>Handler</code> or a <code>Logger</code> object for more sophisticated filtering than you can get through log levels.</p><p>Python&#8217;s <a href="https://docs.python.org/3/library/logging.html#filter-objects">documentation</a> gives the following example of how you might use a logging filter:</p><blockquote><p>A filter initialized with &#8216;A.B&#8217; will allow events logged by loggers &#8216;A.B&#8217;, &#8216;A.B.C&#8217;, &#8216;A.B.C&#8230;</p></blockquote>
      <p>
          <a href="https://www.pythonpapers.com/p/python-logging-working-with-filters">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Get TIFF Tag Data with Python]]></title><description><![CDATA[Last week, you learned how to get EXIF metadata from your JPEG files.]]></description><link>https://www.pythonpapers.com/p/how-to-get-tiff-tag-data-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-get-tiff-tag-data-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 09 Jun 2026 20:33:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!u4fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python">Last week</a>, you learned how to get EXIF metadata from your JPEG files. This week, you will learn how to get similar data from the TIFF image format.</p><p>Pillow provides a similar dictionary for TIFF images in its <code>TiffTags</code> module. If you need a TIFF image, you can use this one, which is a cover from one of the author's other books on <strong>ReportLab</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!u4fk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!u4fk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 424w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 848w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1272w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png" width="546" height="762" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:762,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:649831,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonpapers.com/i/201360169?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!u4fk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 424w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 848w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1272w, https://substackcdn.com/image/fetch/$s_!u4fk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c0f6af8-f914-4e94-ae2a-5c5f933af008_546x762.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can create y&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/how-to-get-tiff-tag-data-with-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Get Image EXIF Data with Python]]></title><description><![CDATA[Digital photographs of the JPG filetype include a type of metadata that is known as Exchangeable Image File Format or simply Exif. You can access these tags using the PIL.ExifTags module.]]></description><link>https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 03 Jun 2026 13:40:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3pvb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6cdc1989-7395-4a01-b925-4cd8b3721043_1238x826.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Digital photographs of the JPG filetype include a type of metadata that is known as <strong>Exchangeable Image File Format</strong> or simply <strong>Exif</strong>. You can access these tags using the <code>PIL.ExifTags</code> module.</p><p>You can learn more about this module by checking out its <a href="https://pillow.readthedocs.io/en/stable/reference/ExifTags.html">documentation</a>.</p><p>In this article, you will focus on getting this image metadata using Pillow.</p><h2><strong>Getting Exif Tag Data</strong></h2><p>&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/how-to-get-image-exif-data-with-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Resize a Photo with Python]]></title><description><![CDATA[Sometimes you will find yourself wanting to resize a photo.]]></description><link>https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python</link><guid isPermaLink="false">https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 27 May 2026 14:13:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a4qO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd212f404-b7da-4897-9eeb-41e268c23bd0_1534x1236.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometimes you will find yourself wanting to resize a photo. I usually do this for photos I plan to email or post on a website, since some of my images can be quite large. Normal people use an image editor. I usually do as well, but for fun, I thought I would look into how to do it in Python.</p><p>The quickest way to do this is to use the Pillow package, which&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/how-to-resize-a-photo-with-python">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python 101 - How to Scrape a Website]]></title><description><![CDATA[The Internet is the host of much of the world&#8217;s information, both past and present.]]></description><link>https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 19 May 2026 15:48:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VM3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F912664d7-520c-406e-9ad2-9d837e818fca_2242x1492.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Internet is the host of much of the world&#8217;s information, both past and present. You can find history, news, comics, and much more on the Internet. As a software developer, you might want to gain access to the troves of data that exist on the Internet. Some web pages provide a free or paid <strong>Application Programming Interface (API)</strong> that you can use to p&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-101-how-to-scrape-a-website">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Convert a Photo to Black and White in Python]]></title><description><![CDATA[Black-and-white images aren&#8217;t for everyone.]]></description><link>https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white</link><guid isPermaLink="false">https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 12 May 2026 17:42:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vw_J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02fdb79e-e26e-4665-8b5a-d80742a329d9_1196x810.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Black-and-white images aren&#8217;t for everyone. I personally like to play around with them, as you can sometimes take a boring photo and turn it into something dramatic. I have also rescued a drab photo by turning it black and white. If you want to convert a photo you took to black and white programmatically, the Pillow package has you covered. In this arti&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/convert-a-photo-to-black-and-white">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual-cogs 0.0.5 Released]]></title><description><![CDATA[I always thought it would be fun to create my own open source libraries or applications and distribute them somehow.]]></description><link>https://www.pythonpapers.com/p/textual-cogs-005-released</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-cogs-005-released</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Mon, 04 May 2026 15:21:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sUsQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072b0151-9a55-449c-97ab-8965551e3d16_933x573.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I always thought it would be fun to create my own open source libraries or applications and distribute them somehow. When I started writing my book, <a href="https://driscollis.gumroad.com/l/textual">Creating TUI Applications with Textual and Python</a>, I took the plunge and wrote a helper package called <a href="https://github.com/driscollis/textual-cogs">textual-cogs,</a> which is a collection of reusable dialogs and widgets for Textual. Right now, it is mostl&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-cogs-005-released">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - Modulo List Comprehension]]></title><description><![CDATA[Python list comprehensions are great.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 29 Apr 2026 13:18:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hYhe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e3c79a3-b014-495b-8ecb-094e0086d5f6_1280x1280.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Python list comprehensions are great. The list comprehension is a way to take a Python <code>for</code> loop and make it a one-liner piece of code.</p><p>List comprehensions can include conditional statements that act like filters. They can even contain other list comprehensions, making them difficult to read and comprehend.</p><p>If you don&#8217;t know how to make a list comprehensio&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-modulo-list-comprehension">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[wxPython - Creating a Simple Image Viewer]]></title><description><![CDATA[The first step in creating an application is to come up with an idea.]]></description><link>https://www.pythonpapers.com/p/wxpython-creating-a-simple-image</link><guid isPermaLink="false">https://www.pythonpapers.com/p/wxpython-creating-a-simple-image</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 22 Apr 2026 16:50:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fiSB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1cb3e90f-8911-45b4-bc87-2e40e328bf7e_450x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The first step in creating an application is to come up with an idea. You could try to copy something simple like Microsoft Paint or Notepad. You will quickly find that they aren&#8217;t so easy to emulate as you would think, though! So instead, you will create a simple application that can load and display a photo.</p><p>When it comes to creating a GUI application,&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/wxpython-creating-a-simple-image">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python 101 - How to Create an "exe" for Mac]]></title><description><![CDATA[Each operating system has its own method of installing or running an application.]]></description><link>https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 14 Apr 2026 13:31:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BImZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ac75576-2e03-4f46-851b-e7919789a1d0_1536x3662.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Each operating system has its own method of installing or running an application. On Windows, you run an executable most of the time. Executables have an extension of <code>.exe</code>. Apple&#8217;s Mac software has the concept of applications that use the extension <code>.app</code>. These are technically a bundle of files including a runnable binary. They are kind of like a runnabl&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-101-how-to-create-an-exe-for">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual - An Intro to DOM Queries (Part II)]]></title><description><![CDATA[Last week, you learned the basics of Textual&#8217;s DOM queries.]]></description><link>https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Wed, 08 Apr 2026 17:06:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JVnb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa490a257-e998-4581-9f20-9c0763d1fb36_1446x1340.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, you learned the basics of Textual&#8217;s DOM queries. If you missed it, you can <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part">read the article</a> now!</p><p>In this tutorial you will be learning about the following topics:</p><ul><li><p>The DOMQuery object</p></li><li><p>Getting the first or last widget</p></li><li><p>Query filters</p></li><li><p>Query exclusions</p></li><li><p>Other query methods</p></li></ul><p>Let&#8217;s get started!</p><h2><strong>The DOMQuery Object</strong></h2><p>The <code>DOMQuery</code> object gets returned whenever you &#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part-a6d">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Textual - An Intro to DOM Queries (Part I)]]></title><description><![CDATA[In this article, you will learn how to query the DOM in Textual.]]></description><link>https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part</link><guid isPermaLink="false">https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Tue, 31 Mar 2026 17:54:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!V0VY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8fa373-1808-4e27-983c-76dafa14fb36_1550x1266.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this article, you will learn how to query the DOM in Textual. You will discover that the DOM keeps track of all the widgets in your application. By running queries against the DOM, you can find widgets quickly and update them, too.</p><p>You will be learning the following topics related to the DOM:</p><ul><li><p>The query one method</p></li><li><p>Textual queries</p></li></ul><p>You will learn more in th&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/textual-an-intro-to-dom-queries-part">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Python Pop Quiz - List Popping]]></title><description><![CDATA[The Python list data type is much like an array in other programming languages.]]></description><link>https://www.pythonpapers.com/p/python-pop-quiz-list-popping</link><guid isPermaLink="false">https://www.pythonpapers.com/p/python-pop-quiz-list-popping</guid><dc:creator><![CDATA[Mike Driscoll]]></dc:creator><pubDate>Thu, 26 Mar 2026 15:05:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G3wZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb337ced-09c9-4b31-83e4-90fe1ebb1601_2550x3204.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Python list data type is much like an array in other programming languages. The list includes many different methods. You can get a full listing of those methods like this:</p><pre><code>my_list = []
print(dir(my_list))</code></pre><p>One of those methods is called <code>pop()</code>. You can pass an index of the item you want to pop from the list (if you don&#8217;t, the last item is chosen). That&#8230;</p>
      <p>
          <a href="https://www.pythonpapers.com/p/python-pop-quiz-list-popping">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>