uTools-Manuals/docs/python/tkinter.html
2019-04-21 11:50:48 +08:00

107 lines
79 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-tkinter"><h1><span class="yiyi-st" id="yiyi-10">25.1. <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> — Tcl/Tk 的 Python 接口</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/tkinter/__init__.py">Lib/tkinter/__init__.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a>“Tk 接口”)是 Tk GUI 工具包的标准 Python 接口。</span><span class="yiyi-st" id="yiyi-13">在大多数的 Unix 平台,以及 Windows 系统上均可以使用 Tk 和 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a></span><span class="yiyi-st" id="yiyi-14">Tk 不是 Python 的一部分;它在 ActiveState 上被维护。)</span><span class="yiyi-st" id="yiyi-15">你可以通过在命令行中运行 <code class="docutils literal"><span class="pre">python</span> <span class="pre">-m</span> <span class="pre">tkinter</span></code>,来检查你是否已经在系统中正确安装<a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> ; 这将会打开一个窗口,演示一个简单的 Tk 界面。</span></p><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-16">另请参阅</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-17"><a class="reference external" href="https://wiki.python.org/moin/TkInter">Python Tkinter Resources</a></span></dt><dd><span class="yiyi-st" id="yiyi-18">Python Tkinter 指南,提供了大量关于使用 Python 的 Tk 信息和其他 Tk 信息资源的链接。</span></dd><dt><span class="yiyi-st" id="yiyi-19"><a class="reference external" href="http://www.tkdocs.com/">TKDocs</a></span></dt><dd><span class="yiyi-st" id="yiyi-20">大量介绍对于一些控件的界面友好性增强。</span></dd><dt><span class="yiyi-st" id="yiyi-21"><a class="reference external" href="https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html">Tkinter参考Python GUI</a></span></dt><dd><span class="yiyi-st" id="yiyi-22">在线参考材料</span></dd><dt><span class="yiyi-st" id="yiyi-23"><a class="reference external" href="http://effbot.org/tkinterbook/">来自effbot的Tkinter文档</a></span></dt><dd><span class="yiyi-st" id="yiyi-24">effbot.org 提供的 tkinter 在线参考。</span></dd><dt><span class="yiyi-st" id="yiyi-25"><a class="reference external" href="https://www.tcl.tk/man/tcl8.5/">Tcl / Tk 手册</a></span></dt><dd><span class="yiyi-st" id="yiyi-26">最新版本 tcl/tk 的官方手册。</span></dd><dt><span class="yiyi-st" id="yiyi-27"><a class="reference external" href="http://learning-python.com/books/about-pp4e.html">编程Python</a></span></dt><dd><span class="yiyi-st" id="yiyi-28">由 Mark Lutz 所写,很好地含盖了 Tkinter 。</span></dd><dt><span class="yiyi-st" id="yiyi-29"><a class="reference external" href="http://www.amazon.com/Modern-Tkinter-Python-Developers-ebook/dp/B0071QDNLO/">给繁忙的Python开发人员的现代Tkinter</a></span></dt><dd><span class="yiyi-st" id="yiyi-30">由 Mark Rozerman 撰写的关于使用 Python 和 Tkinter 构建有吸引力的现代图形用户界面的书。</span></dd><dt><span class="yiyi-st" id="yiyi-31"><a class="reference external" href="https://www.manning.com/books/python-and-tkinter-programming">Python和Tkinter程序设计</a></span></dt><dd><span class="yiyi-st" id="yiyi-32">这本书由 John Grayson 所写 ISBN 1-884777-81-3</span></dd></dl></div><div class="section" id="tkinter-modules"><h2><span class="yiyi-st" id="yiyi-33">25.1.1. </span><span class="yiyi-st" id="yiyi-34">Tkinter 模块</span></h2><p><span class="yiyi-st" id="yiyi-35">大多数情况下,<a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a>模块有你所需要的一切,但一些附加的模块也会被用到。</span><span class="yiyi-st" id="yiyi-36">Tk 接口位于一个叫做<code class="xref py py-mod docutils literal"><span class="pre">_tkinter</span></code>的二进制模块.</span><span class="yiyi-st" id="yiyi-37">这个模块包含了 Tk的底层接口, 但是不应该让应用程序直接调用它。</span><span class="yiyi-st" id="yiyi-38">它通常是共享库 (或 DLL但在某些情况下可能会静态链接到Python 解释器。</span></p><p><span class="yiyi-st" id="yiyi-39">除了 Tk 接口模块,<a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 还包含了大量的 Python 模块,<code class="xref py py-mod docutils literal"><span class="pre">tkinter.constants</span></code> 是最重要的模块之一。</span><span class="yiyi-st" id="yiyi-40">导入 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 会自动导入 <code class="xref py py-mod docutils literal"><span class="pre">tkinter.constants</span></code>,所以通常为了使用 Tkinter 你所需要做的就是一个简单的导入语句:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tkinter</span>
</code></pre><p><span class="yiyi-st" id="yiyi-41">或者,更常用的做法是:</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">tkinter</span> <span class="k">import</span> <span class="o">*</span>
</code></pre><dl class="class"><dt id="tkinter.Tk"><span class="yiyi-st" id="yiyi-42"> <em class="property">class </em><code class="descclassname">tkinter.</code><code class="descname">Tk</code><span class="sig-paren">(</span><em>screenName=None</em>, <em>baseName=None</em>, <em>className='Tk'</em>, <em>useTk=1</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-43"><a class="reference internal" href="#tkinter.Tk" title="tkinter.Tk"><code class="xref py py-class docutils literal"><span class="pre">Tk</span></code></a> 没有参数被实例化。</span><span class="yiyi-st" id="yiyi-44">这将创建一个顶层的 Tk 窗口,通常是应用程序的主窗口。</span><span class="yiyi-st" id="yiyi-45">每个实例都有其自身相关联的 Tcl 解释器。</span></p></dd></dl><dl class="function"><dt id="tkinter.Tcl"><span class="yiyi-st" id="yiyi-46"> <code class="descclassname">tkinter.</code><code class="descname">Tcl</code><span class="sig-paren">(</span><em>screenName=None</em>, <em>baseName=None</em>, <em>className='Tk'</em>, <em>useTk=0</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-47"><a class="reference internal" href="#tkinter.Tcl" title="tkinter.Tcl"><code class="xref py py-func docutils literal"><span class="pre">Tcl()</span></code></a> 函数是一个工厂函数,创造了一个像那样 <a class="reference internal" href="#tkinter.Tk" title="tkinter.Tk"><code class="xref py py-class docutils literal"><span class="pre">Tk</span></code></a> 类创建的对象除了它不会初始化Tk 子系统。</span><span class="yiyi-st" id="yiyi-48">这个经常很有用,当驱动 Tcl 解释器在一个不希望创建外来顶层窗口的环境中,或一个不能创建的环境 (例如 Unix/Linux 系统没有 X 服务器)。</span><span class="yiyi-st" id="yiyi-49">一个通过 <a class="reference internal" href="#tkinter.Tcl" title="tkinter.Tcl"><code class="xref py py-func docutils literal"><span class="pre">Tcl()</span></code></a> 对象创建的对象,可以通过调用 <code class="xref py py-meth docutils literal"><span class="pre">loadtk()</span></code> 方法是创建一个顶层窗口 (和 Tk 子系统初始化)。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-50">其他提供 Tk 支持的模块包括︰</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-51"><a class="reference internal" href="tkinter.scrolledtext.html#module-tkinter.scrolledtext" title="tkinter.scrolledtext: Text widget with a vertical scroll bar. (Tk)"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.scrolledtext</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-52">包含垂直滚动条的文本部件。</span></dd><dt><span class="yiyi-st" id="yiyi-53"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.colorchooser</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-54">可以让用户选择一种颜色的对话框。</span></dd><dt><span class="yiyi-st" id="yiyi-55"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.commondialog</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-56">在此处列出的其他模块中定义的对话框的的基类。</span></dd><dt><span class="yiyi-st" id="yiyi-57"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.filedialog</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-58">通用对话框允许用户指定要打开或保存的文件。</span></dd><dt><span class="yiyi-st" id="yiyi-59"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.font</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-60">可帮助处理字体的工具。</span></dd><dt><span class="yiyi-st" id="yiyi-61"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.messagebox</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-62">标准 Tk 对话框。</span></dd><dt><span class="yiyi-st" id="yiyi-63"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.simpledialog</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-64">基本对话框和方便的功能。</span></dd><dt><span class="yiyi-st" id="yiyi-65"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.dnd</span></code></span></dt><dd><span class="yiyi-st" id="yiyi-66"><a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a>支持拖放。</span><span class="yiyi-st" id="yiyi-67">这是实验性的,当替换为 Tk DND 时它应当被弃用。</span></dd><dt><span class="yiyi-st" id="yiyi-68"><a class="reference internal" href="turtle.html#module-turtle" title="turtle: An educational framework for simple graphics applications"><code class="xref py py-mod docutils literal"><span class="pre">turtle</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-69">Tk 窗口中的海龟绘图图形。</span></dd></dl></div><div class="section" id="tkinter-life-preserver"><h2><span class="yiyi-st" id="yiyi-70">25.1.2. </span><span class="yiyi-st" id="yiyi-71">Tkinter Life Preserver</span></h2><p><span class="yiyi-st" id="yiyi-72">本节不是为 Tk 或 Tkinter 提供详尽的教程。</span><span class="yiyi-st" id="yiyi-73">相反,它旨在系统性地提供一些指导方向。</span></p><p><span class="yiyi-st" id="yiyi-74">贡献:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-75">Tk 是由 John Ousterhout 在伯克利时写的。</span></li><li><span class="yiyi-st" id="yiyi-76">Tkinter 是由 Steen Lumholt 和 Guido van Rossum 写的。</span></li><li><span class="yiyi-st" id="yiyi-77">这个 Life Preserver 是由弗吉尼亚大学的 Matt Conway 写的。</span></li><li><span class="yiyi-st" id="yiyi-78">HTML 页面和一些自由编辑,是用 Ken Manheimer 的 FrameMaker 版本生成的。</span></li><li><span class="yiyi-st" id="yiyi-79">Fredrik Lundh 详细阐述和修改了类接口描述,使它们能与 Tk 4.2 兼容。</span></li><li><span class="yiyi-st" id="yiyi-80">Mike Clarkson 将文档转换为 LaTeX并编译了参考手册的用户界面一章。</span></li></ul><div class="section" id="how-to-use-this-section"><h3><span class="yiyi-st" id="yiyi-81">25.1.2.1. </span><span class="yiyi-st" id="yiyi-82">如何使用这部分 </span></h3><p><span class="yiyi-st" id="yiyi-83">这部分设计分为两部分:前半部分(大致)涵盖相关资料,后半部分方便键盘输入运行参考。</span></p><p><span class="yiyi-st" id="yiyi-84">当试图回答“如何做XX”的形式的问题时通常最好先找出在纯 Tk 中如何做“XX”然后将其转换回相应的 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 调用。</span><span class="yiyi-st" id="yiyi-85">Python 程序员通常可以通过查看 Tk 文档来猜测正确的 Python 命令。</span><span class="yiyi-st" id="yiyi-86">这意味着,为了使用 Tkinter你将不得不懂一点 Tk。</span><span class="yiyi-st" id="yiyi-87">这个文档不能充当这个角色,所以我们能做的,最好是给你指明已经存在的最好文档。</span><span class="yiyi-st" id="yiyi-88">这是一些提示:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-89">作者强烈建议获取 Tk 手册页的副本。</span><span class="yiyi-st" id="yiyi-90">特别是 <code class="docutils literal"><span class="pre">manN</span></code> 目录中的手册页最有用。</span><span class="yiyi-st" id="yiyi-91"><code class="docutils literal"><span class="pre">man3</span></code> 手册页描述了 Tk 库的 C 接口,因此对于写脚本不是特别有用。</span></li><li><span class="yiyi-st" id="yiyi-92">Addison-Wesley 出版了一本面向初学者介绍 Tcl 和 Tk由 John Ousterhout 写的名为 Tcl and the Tk Toolkit ISBN 0-201-63337-X的书籍。</span><span class="yiyi-st" id="yiyi-93">这本书并不详尽,对于许多细节,它要求参照手册。</span></li><li><span class="yiyi-st" id="yiyi-94"><code class="file docutils literal"><span class="pre">tkinter/__init__.py</span></code> 是最后手段,当找不到其它有效方法的时候,它是一个好的选择。</span></li></ul><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-95">也可以看看</span></p><dl class="last docutils"><dt><span class="yiyi-st" id="yiyi-96"><a class="reference external" href="https://www.tcl.tk/man/tcl8.6/">Tcl / Tk 8.6手册页</a></span></dt><dd><span class="yiyi-st" id="yiyi-97">Tcl/Tk 手册访问 www.tcl.tk。</span></dd><dt><span class="yiyi-st" id="yiyi-98"><a class="reference external" href="http://tcl.activestate.com/">ActiveState Tcl主页</a></span></dt><dd><span class="yiyi-st" id="yiyi-99">Tk/Tcl 开发主要在 ActiveState。</span></dd><dt><span class="yiyi-st" id="yiyi-100"><a class="reference external" href="http://www.amazon.com/exec/obidos/ASIN/020163337X">Tcl和Tk工具包</a></span></dt><dd><span class="yiyi-st" id="yiyi-101">这本书由 Tcl 发明者 John Ousterhout 所写。</span></dd><dt><span class="yiyi-st" id="yiyi-102"><a class="reference external" href="http://www.beedub.com/book/">Tcl和Tk中的实际编程</a></span></dt><dd><span class="yiyi-st" id="yiyi-103">Brent Welchs 的百科书。</span></dd></dl></div></div><div class="section" id="a-simple-hello-world-program"><h3><span class="yiyi-st" id="yiyi-104">25.1.2.2. </span><span class="yiyi-st" id="yiyi-105">一个简单的 Hello World 程序</span></h3><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="k">class</span> <span class="nc">Application</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Frame</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">master</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">master</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">create_widgets</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">create_widgets</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hi_there</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hi_there</span><span class="p">[</span><span class="s2">"text"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Hello World</span><span class="se">\n</span><span class="s2">(click me)"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hi_there</span><span class="p">[</span><span class="s2">"command"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">say_hi</span>
<span class="bp">self</span><span class="o">.</span><span class="n">hi_there</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s2">"top"</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">quit</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s2">"QUIT"</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="s2">"red"</span><span class="p">,</span>
<span class="n">command</span><span class="o">=</span><span class="n">root</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">quit</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s2">"bottom"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">say_hi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"hi there, everyone!"</span><span class="p">)</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Application</span><span class="p">(</span><span class="n">master</span><span class="o">=</span><span class="n">root</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</code></pre></div></div><div class="section" id="a-very-quick-look-at-tcl-tk"><h2><span class="yiyi-st" id="yiyi-106">25.1.3. </span><span class="yiyi-st" id="yiyi-107">快速了解 Tcl/Tk </span></h2><p><span class="yiyi-st" id="yiyi-108">类层次结构看起来很复杂,但在实践中,程序员几乎只是引用层次结构底部的类。</span></p><p><span class="yiyi-st" id="yiyi-109">注:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-110">这些类是为了在一个命名空间下组织某些功能而提供的。</span><span class="yiyi-st" id="yiyi-111">它们不需要单独实例化。</span></li><li><span class="yiyi-st" id="yiyi-112"><a class="reference internal" href="#tkinter.Tk" title="tkinter.Tk"><code class="xref py py-class docutils literal"><span class="pre">Tk</span></code></a> 类仅在应用程序中实例化一次。</span><span class="yiyi-st" id="yiyi-113">程序员不需要显式地实例化一个,只要任何其他类被实例化,系统就创建一个实例。</span></li><li><span class="yiyi-st" id="yiyi-114"><code class="xref py py-class docutils literal"><span class="pre">Widget</span></code> 类并不意味着被实例化,它只是用于子类化来创建“真正的”控件(在 C++ 中,这被称为“抽象类”)。</span></li></ul><p><span class="yiyi-st" id="yiyi-115">为了使用这个参考资料,你可能需要知道如何阅读简短的 Tk 文章,以及如何识别 Tk 命令的各个部分。</span><span class="yiyi-st" id="yiyi-116"><a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 与 Tk 代码的映射关系,请参阅<a class="reference internal" href="#tkinter-basic-mapping"><span>将基本 Tk 映射到 Tkinter </span></a>部分)。</span></p><p><span class="yiyi-st" id="yiyi-117">Tk 脚本是 Tcl 程序。</span><span class="yiyi-st" id="yiyi-118">像所有 Tcl 程序一样Tk 脚本只是用空格分隔标记的列表。</span><span class="yiyi-st" id="yiyi-119">Tk 控件只是它的 <em>class</em><em>options</em> 帮助配置,<em>actions</em> 使它做有用的事情的。</span></p><p><span class="yiyi-st" id="yiyi-120">要在 Tk 中创建一个控件,命令总是以下形式:</span></p><pre><code class="language-python"><span></span><span class="n">classCommand</span> <span class="n">newPathname</span> <span class="n">options</span>
</code></pre><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-121"><em>classCommand</em></span></dt><dd><span class="yiyi-st" id="yiyi-122">表示要创建控件的类型(按钮,标签,菜单...</span></dd><dt><span class="yiyi-st" id="yiyi-123"><em>newPathname</em></span></dt><dd><span class="yiyi-st" id="yiyi-124">表示新建的控件的名称。</span><span class="yiyi-st" id="yiyi-125">Tk 中的所有名称必须是唯一的。</span><span class="yiyi-st" id="yiyi-126">为了减少命名冲突Tk 中的控件使用<em>路径名</em>命名,就像文件系统中的文件一样。</span><span class="yiyi-st" id="yiyi-127">顶级控件,也就是名字是 <em>root</em> 的那个控件,用 <code class="docutils literal"><span class="pre">.</span></code>(句号)导入,</span><span class="yiyi-st" id="yiyi-128">并且和子类之间用句号做分隔。</span><span class="yiyi-st" id="yiyi-129">例如,<code class="docutils literal"><span class="pre">.myApp.controlPanel.okButton</span></code> 可能是某个控件的名称。</span></dd><dt><span class="yiyi-st" id="yiyi-130"><em>选项</em></span></dt><dd><span class="yiyi-st" id="yiyi-131">配置控件的外观,在某些情况下配置其行为。</span><span class="yiyi-st" id="yiyi-132">选项以标志和值的列表的形式出现。</span><span class="yiyi-st" id="yiyi-133">标志以 “ - ” 开头,类似 Unix shell 命令标志,如果值超过一个词,值需要被放在引号中。</span></dd></dl><p><span class="yiyi-st" id="yiyi-134">例如:</span></p><pre><code class="language-python"><span></span><span class="n">button</span> <span class="o">.</span><span class="n">fred</span> <span class="o">-</span><span class="n">fg</span> <span class="n">red</span> <span class="o">-</span><span class="n">text</span> <span class="s2">"hi there"</span>
<span class="o">^</span> <span class="o">^</span> \<span class="n">______________________</span><span class="o">/</span>
<span class="o">|</span> <span class="o">|</span> <span class="o">|</span>
<span class="k">class</span> <span class="nc">new</span> <span class="n">options</span>
<span class="n">command</span> <span class="n">widget</span> <span class="p">(</span><span class="o">-</span><span class="n">opt</span> <span class="n">val</span> <span class="o">-</span><span class="n">opt</span> <span class="n">val</span> <span class="o">...</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-135">创建后,控件的路径名将成为一个新命令。</span><span class="yiyi-st" id="yiyi-136">这个新的<em>控件命令</em>是新控件执行 <em>action</em> 的句柄。</span><span class="yiyi-st" id="yiyi-137">在 C 中,可以表示为 someAction(fredsomeOptions),在 C++ 中,可以表示为 fred.someAction(someOptions),在 Tk 中,表示为:</span></p><pre><code class="language-python"><span></span><span class="o">.</span><span class="n">fred</span> <span class="n">someAction</span> <span class="n">someOptions</span>
</code></pre><p><span class="yiyi-st" id="yiyi-138">请注意,对象名称 <code class="docutils literal"><span class="pre">.fred</span></code> 以点开头。</span></p><p><span class="yiyi-st" id="yiyi-139">如您所料,<em>someAction</em> 值是否合法将取决于控件的类:<code class="docutils literal"><span class="pre">.fred</span> <span class="pre">disable</span></code> 如果 fred 是一个按钮控件fred变灰色是可行的但如果 fred 是一个标签控件Tk 中不支持禁用标签控件)就不能工作了。</span></p><p><span class="yiyi-st" id="yiyi-140"><em>someOptions</em> 的值是否合法与 action 相关。</span><span class="yiyi-st" id="yiyi-141">某些 actions<code class="docutils literal"><span class="pre">disable</span></code>,不需要任何参数,其他的,如文本输入框的 <code class="docutils literal"><span class="pre">delete</span></code> 命令,将需要参数来指定要删除的文本范围。</span></p></div><div class="section" id="mapping-basic-tk-into-tkinter"><h2><span class="yiyi-st" id="yiyi-142">25.1.4. </span><span class="yiyi-st" id="yiyi-143">将基本 Tk 映射到 Tkinter </span></h2><p><span class="yiyi-st" id="yiyi-144">Tk 中的类命令对应于 Tkinter 中的类结构。</span></p><pre><code class="language-python"><span></span><span class="n">button</span> <span class="o">.</span><span class="n">fred</span> <span class="o">=====&gt;</span> <span class="n">fred</span> <span class="o">=</span> <span class="n">Button</span><span class="p">()</span>
</code></pre><p><span class="yiyi-st" id="yiyi-145">Tk 控件所属主体在创建时就已经包含于名称中。</span><span class="yiyi-st" id="yiyi-146">在 Tkinter 中,要明确指定主体。</span></p><pre><code class="language-python"><span></span><span class="n">button</span> <span class="o">.</span><span class="n">panel</span><span class="o">.</span><span class="n">fred</span> <span class="o">=====&gt;</span> <span class="n">fred</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="n">panel</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-147">Tk 配置选项是连字符加标签,后跟值的列表。</span><span class="yiyi-st" id="yiyi-148">在 Tkinter 中,在实例构造中,选项被指定为关键字参数,对于已建立的实例,在字典样式中作为索引,或者设置方法的参数。</span><span class="yiyi-st" id="yiyi-149">有关设置选项,请参见<a class="reference internal" href="#tkinter-setting-options"><span>设置选项</span></a>一节。</span></p><pre><code class="language-python"><span></span><span class="n">button</span> <span class="o">.</span><span class="n">fred</span> <span class="o">-</span><span class="n">fg</span> <span class="n">red</span> <span class="o">=====&gt;</span> <span class="n">fred</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="n">panel</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span>
<span class="o">.</span><span class="n">fred</span> <span class="n">configure</span> <span class="o">-</span><span class="n">fg</span> <span class="n">red</span> <span class="o">=====&gt;</span> <span class="n">fred</span><span class="p">[</span><span class="s2">"fg"</span><span class="p">]</span> <span class="o">=</span> <span class="n">red</span>
<span class="n">OR</span> <span class="o">==&gt;</span> <span class="n">fred</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">fg</span><span class="o">=</span><span class="s2">"red"</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-150">在 Tk 中,要对控件执行一个 action使用控件名称作为命令并跟随一个 action 名称,可能带有参数(选项)。</span><span class="yiyi-st" id="yiyi-151">在 Tkinter 中,用实例调用方法的形式来调用控件的 actions。</span><span class="yiyi-st" id="yiyi-152">已定义可执行的 actions (methods) ,可在 <code class="file docutils literal"><span class="pre">tkinter/__init__.py</span></code> 中查看。</span></p><pre><code class="language-python"><span></span><span class="o">.</span><span class="n">fred</span> <span class="n">invoke</span> <span class="o">=====&gt;</span> <span class="n">fred</span><span class="o">.</span><span class="n">invoke</span><span class="p">()</span>
</code></pre><p><span class="yiyi-st" id="yiyi-153">要给 packer几何管理器增加一个控件你可以调用可带参数的 pack。</span><span class="yiyi-st" id="yiyi-154">在 Tkinter 中Pack 类保留所有这些功能,各种形式的 pack 命令被实现为方法。</span><span class="yiyi-st" id="yiyi-155"><a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 中的所有控件都是从 Packer 中继承的,因此继承了所有 packing 的方法。</span><span class="yiyi-st" id="yiyi-156">有关表单几何管理器的其他信息,请参阅 <a class="reference internal" href="tkinter.tix.html#module-tkinter.tix" title="tkinter.tix: Tk Extension Widgets for Tkinter"><code class="xref py py-mod docutils literal"><span class="pre">tkinter.tix</span></code></a> 模块文档。</span></p><pre><code class="language-python"><span></span><span class="n">pack</span> <span class="o">.</span><span class="n">fred</span> <span class="o">-</span><span class="n">side</span> <span class="n">left</span> <span class="o">=====&gt;</span> <span class="n">fred</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s2">"left"</span><span class="p">)</span>
</code></pre></div><div class="section" id="how-tk-and-tkinter-are-related"><h2><span class="yiyi-st" id="yiyi-157">25.1.5. </span><span class="yiyi-st" id="yiyi-158">Tk 和 Tkinter 如何关联</span></h2><p><span class="yiyi-st" id="yiyi-159">从上到下:</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-160">您的应用程式Python</span></dt><dd><span class="yiyi-st" id="yiyi-161">一个 Python 应用进行一个 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 调用。</span></dd><dt><span class="yiyi-st" id="yiyi-162">tkinterPython 库)</span></dt><dd><span class="yiyi-st" id="yiyi-163">此调用(例如,创建按钮控件)是由 Python 中已经编写的 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 库执行。</span><span class="yiyi-st" id="yiyi-164">这个 Python 函数将解析命令和参数,并将它们转换为一种使它们看起来像是来自一个 Tk 脚本而不是一个 Python 脚本的形式。</span></dd><dt><span class="yiyi-st" id="yiyi-165">_tkinterC</span></dt><dd><span class="yiyi-st" id="yiyi-166">这些命令及其参数将传递到 <code class="xref py py-mod docutils literal"><span class="pre">_tkinter</span></code> 中的 C 函数 - 注意下划线 - 扩展模块。</span></dd><dt><span class="yiyi-st" id="yiyi-167">Tk 控件C 和 Tcl</span></dt><dd><span class="yiyi-st" id="yiyi-168">此 C 函数能够调用其他 C 模块,包括组成 Tk 库的 C 函数。</span><span class="yiyi-st" id="yiyi-169">Tk 在 C 和一些 Tcl 中执行。</span><span class="yiyi-st" id="yiyi-170">Tk 控件的 Tcl 部分用于将某些默认行为绑定到控件,并在导入 Python <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 库时执行一次。</span><span class="yiyi-st" id="yiyi-171">(用户不必看这个阶段)。</span></dd><dt><span class="yiyi-st" id="yiyi-172">TkC</span></dt><dd><span class="yiyi-st" id="yiyi-173">Tk 控件的 Tk 部分执行最终映射到...</span></dd><dt><span class="yiyi-st" id="yiyi-174">XlibC</span></dt><dd><span class="yiyi-st" id="yiyi-175">Xlib 库在屏幕上绘制图形。</span></dd></dl></div><div class="section" id="handy-reference"><h2><span class="yiyi-st" id="yiyi-176">25.1.6. </span><span class="yiyi-st" id="yiyi-177">参考速查</span></h2><div class="section" id="setting-options"><h3><span class="yiyi-st" id="yiyi-178">25.1.6.1. </span><span class="yiyi-st" id="yiyi-179">设置选项</span></h3><p><span class="yiyi-st" id="yiyi-180">选项控制像控件的颜色和边框宽度。</span><span class="yiyi-st" id="yiyi-181">选项可以通过三种方式设置:</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-182">在对象创建时,使用关键字参数</span></dt><dd><div class="first last highlight-python3"><div class="highlight"><pre><span></span><span class="n">fred</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="s2">"red"</span><span class="p">,</span> <span class="n">bg</span><span class="o">=</span><span class="s2">"blue"</span><span class="p">)</span>
</pre></div></div></dd><dt><span class="yiyi-st" id="yiyi-183">创建对象后,像字典索引一样处理选项名称</span></dt><dd><div class="first last highlight-python3"><div class="highlight"><pre><span></span><span class="n">fred</span><span class="p">[</span><span class="s2">"fg"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"red"</span>
<span class="n">fred</span><span class="p">[</span><span class="s2">"bg"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"blue"</span>
</pre></div></div></dd><dt><span class="yiyi-st" id="yiyi-184">在对象创建后使用 config() 方法更新多个设置</span></dt><dd><div class="first last highlight-python3"><div class="highlight"><pre><span></span><span class="n">fred</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">fg</span><span class="o">=</span><span class="s2">"red"</span><span class="p">,</span> <span class="n">bg</span><span class="o">=</span><span class="s2">"blue"</span><span class="p">)</span>
</pre></div></div></dd></dl><p><span class="yiyi-st" id="yiyi-185">有关给定选项及其行为的完整说明,请参阅相关控件的 Tk 手册页。</span></p><p><span class="yiyi-st" id="yiyi-186">请注意,手册页列出了每个控件的“标准选项”和“控件特定选项”。</span><span class="yiyi-st" id="yiyi-187">前者是许多控件常见的选项列表,后者是某些控件特有的选项。</span><span class="yiyi-st" id="yiyi-188">标准选项记录在<em class="manpage">选项3</em>手册页上。</span></p><p><span class="yiyi-st" id="yiyi-189">在本文档中不对标准和特定控件选项进行区分。</span><span class="yiyi-st" id="yiyi-190">某些选项不适用于某些种类的控件。</span><span class="yiyi-st" id="yiyi-191">给定控件是否响应特定选项取决于控件的类;按钮具有 <code class="docutils literal"><span class="pre">command</span></code> 选项,标签就没有。</span></p><p><span class="yiyi-st" id="yiyi-192">给定控件支持的选项在控件手册页中列出, 或者可以在运行时通过调用不带参数的 <code class="xref py py-meth docutils literal"><span class="pre">config()</span></code> 方法或通过调用或通过调用 <code class="xref py py-meth docutils literal"><span class="pre">keys()</span></code> 方法。</span><span class="yiyi-st" id="yiyi-193">这些调用返回的值是一个字典,其关键字是作为字符串的选项的名称(例如,<code class="docutils literal"><span class="pre">'relief'</span></code>),其值是 5 元组。</span></p><p><span class="yiyi-st" id="yiyi-194">某些选项(例如 <code class="docutils literal"><span class="pre">bg</span></code>)是常用选项的同义缩写(<code class="docutils literal"><span class="pre">bg</span></code>是 “background” 的缩写)。</span><span class="yiyi-st" id="yiyi-195">通过传递 <code class="docutils literal"><span class="pre">config()</span></code> 方法简写选项的名称将返回2元组而不是5元组。</span><span class="yiyi-st" id="yiyi-196">传回的2元组将包含同义词的名称和“真实”选项例如<code class="docutils literal"><span class="pre">'bg'</span> <span class="pre">'background'</span></code>)。</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-197">指数</span></th><th class="head"><span class="yiyi-st" id="yiyi-198">含义</span></th><th class="head"><span class="yiyi-st" id="yiyi-199">例子</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-200">0</span></td><td><span class="yiyi-st" id="yiyi-201">选项名称</span></td><td><span class="yiyi-st" id="yiyi-202"><code class="docutils literal"><span class="pre">'relief'</span></code></span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-203">1</span></td><td><span class="yiyi-st" id="yiyi-204">数据库查找的选项名称</span></td><td><span class="yiyi-st" id="yiyi-205"><code class="docutils literal"><span class="pre">'relief'</span></code></span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-206">2</span></td><td><span class="yiyi-st" id="yiyi-207">数据库查找的选项类</span></td><td><span class="yiyi-st" id="yiyi-208"><code class="docutils literal"><span class="pre">'Relief'</span></code></span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-209">3</span></td><td><span class="yiyi-st" id="yiyi-210">默认值</span></td><td><span class="yiyi-st" id="yiyi-211"><code class="docutils literal"><span class="pre">'raised'</span></code></span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-212">4</span></td><td><span class="yiyi-st" id="yiyi-213">当前值</span></td><td><span class="yiyi-st" id="yiyi-214"><code class="docutils literal"><span class="pre">'groove'</span></code></span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-215">例子:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">fred</span><span class="o">.</span><span class="n">config</span><span class="p">())</span>
<span class="go">{'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}</span>
</code></pre><p><span class="yiyi-st" id="yiyi-216">当然,打印的字典将包括所有可用的选项及其值。</span><span class="yiyi-st" id="yiyi-217">这仅仅是作为示例。</span></p></div><div class="section" id="the-packer"><h3><span class="yiyi-st" id="yiyi-218">25.1.6.2. </span><span class="yiyi-st" id="yiyi-219">Packer</span></h3><p id="index-0"><span class="yiyi-st" id="yiyi-220">packer 是 Tk 的几何管理机制之一。</span><span class="yiyi-st" id="yiyi-221">几何管理器用于指定控件在其容器中的定位的相对定位 - 它们的共有<em>主体</em></span><span class="yiyi-st" id="yiyi-222">相比于更复杂的 <em>placer</em>这不太常见我们在这里不涉及packer 采用定性关系规范 - <em>above</em><em>to the left of</em><em>filling</em>等等 - 并且可以确定您的确切位置坐标。</span></p><p><span class="yiyi-st" id="yiyi-223">任何 <em>主体</em> 控件的大小由“从属控件”的大小确定。</span><span class="yiyi-st" id="yiyi-224">packer 用于控制从属控件在所属主体内部出现的位置。</span><span class="yiyi-st" id="yiyi-225">您可以将控件封装成 frames再将 frames 封装成其他 frames以便实现所需的布局。</span><span class="yiyi-st" id="yiyi-226">此外,一旦被封装会被动态地调整以适应配置的增量变化。</span></p><p><span class="yiyi-st" id="yiyi-227">请注意,如果不通过几何管理器指定了控件的几何位置,控件将不会出现。</span><span class="yiyi-st" id="yiyi-228">初学者经常会忘记说明控件的几何位置,然后会因创建了控件而控件并没有显示而困惑。</span><span class="yiyi-st" id="yiyi-229">只有设置了控件的几何位置,控件才会出现,例如,为它添加 packer 的 <code class="xref py py-meth docutils literal"><span class="pre">pack()</span></code> 方法。</span></p><p><span class="yiyi-st" id="yiyi-230">pack() 方法可以使用 关键字选项/值 的键值对来控制控件在其容器中显示的位置,以及调整主应用程序窗口大小时的行为方式。</span><span class="yiyi-st" id="yiyi-231">这里有些例子:</span></p><pre><code class="language-python"><span></span><span class="n">fred</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span> <span class="c1"># defaults to side = "top"</span>
<span class="n">fred</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">side</span><span class="o">=</span><span class="s2">"left"</span><span class="p">)</span>
<span class="n">fred</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="n">expand</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</code></pre></div><div class="section" id="packer-options"><h3><span class="yiyi-st" id="yiyi-232">25.1.6.3. </span><span class="yiyi-st" id="yiyi-233">Packer 选项</span></h3><p><span class="yiyi-st" id="yiyi-234">有关 packer 的更多信息及其选项,请参阅手册页和 John Ousterhout 的书的第183页。</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-235">anchor</span></dt><dd><span class="yiyi-st" id="yiyi-236">Anchor 类型。</span><span class="yiyi-st" id="yiyi-237">标示放在 packer 中每个从控件的位置。</span></dd><dt><span class="yiyi-st" id="yiyi-238">expand可拉伸</span></dt><dd><span class="yiyi-st" id="yiyi-239">布尔, <code class="docutils literal"><span class="pre">0</span></code><code class="docutils literal"><span class="pre">1</span></code>.</span></dd><dt><span class="yiyi-st" id="yiyi-240">fill填充</span></dt><dd><span class="yiyi-st" id="yiyi-241">有效值: <code class="docutils literal"><span class="pre">'x'</span></code> <code class="docutils literal"><span class="pre">'y'</span></code><code class="docutils literal"><span class="pre">'both'</span></code> <code class="docutils literal"><span class="pre">'none'</span></code>.</span></dd><dt><span class="yiyi-st" id="yiyi-242">ipadx 和 ipady</span></dt><dd><span class="yiyi-st" id="yiyi-243">距离 - 在从属控件的每一侧指定内边距。</span></dd><dt><span class="yiyi-st" id="yiyi-244">padx和pady</span></dt><dd><span class="yiyi-st" id="yiyi-245">距离 - 在从属控件的每一侧指定外边距。</span></dd><dt><span class="yiyi-st" id="yiyi-246">side方向</span></dt><dd><span class="yiyi-st" id="yiyi-247">有效值为: <code class="docutils literal"><span class="pre">'left'</span></code> <code class="docutils literal"><span class="pre">'right'</span></code> <code class="docutils literal"><span class="pre">'top'</span></code> <code class="docutils literal"><span class="pre">'bottom'</span></code></span></dd></dl></div><div class="section" id="coupling-widget-variables"><h3><span class="yiyi-st" id="yiyi-248">25.1.6.4. </span><span class="yiyi-st" id="yiyi-249">耦合控件变量</span></h3><p><span class="yiyi-st" id="yiyi-250">一些控件(如文本输入控件)的当前值设置可以通过使用特殊选项直接连接到应用程序变量。</span><span class="yiyi-st" id="yiyi-251">这些选项是 <code class="docutils literal"><span class="pre">variable</span></code><code class="docutils literal"><span class="pre">textvariable</span></code> <code class="docutils literal"><span class="pre">onvalue</span></code><code class="docutils literal"><span class="pre">offvalue</span></code><code class="docutils literal"><span class="pre">value</span></code></span><span class="yiyi-st" id="yiyi-252">此连接都是这样的工作方式:如果变量因任何原因更改,则其连接的控件将更新以反映新值。</span></p><p><span class="yiyi-st" id="yiyi-253">不幸的是,在当前实现的 <a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 中,不可能通过 <code class="docutils literal"><span class="pre">variable</span></code><code class="docutils literal"><span class="pre">textvariable</span></code> 选项将任意的 Python 变量提交给控件。</span><span class="yiyi-st" id="yiyi-254">唯一适用于这种变量是从<a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a>中定义的变量类中子类化的变量。</span></p><p><span class="yiyi-st" id="yiyi-255">有很多已经定义的有用子类变量:<code class="xref py py-class docutils literal"><span class="pre">StringVar</span></code><code class="xref py py-class docutils literal"><span class="pre">IntVar</span></code><code class="xref py py-class docutils literal"><span class="pre">DoubleVar</span></code><code class="xref py py-class docutils literal"><span class="pre">BooleanVar</span></code></span><span class="yiyi-st" id="yiyi-256">要读取这样一个变量的当前值,调用 <code class="xref py py-meth docutils literal"><span class="pre">get()</span></code> 方法,改变它的值,调用 <code class="xref py py-meth docutils literal"><span class="pre">set()</span></code> 方法。</span><span class="yiyi-st" id="yiyi-257">如果你遵循这个协议,控件将始终跟踪变量的值,您不用自己进一步干预。</span></p><p><span class="yiyi-st" id="yiyi-258">例如:</span></p><pre><code class="language-python"><span></span><span class="k">class</span> <span class="nc">App</span><span class="p">(</span><span class="n">Frame</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">master</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">master</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entrythingy</span> <span class="o">=</span> <span class="n">Entry</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entrythingy</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="c1"># here is the application variable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">contents</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">()</span>
<span class="c1"># set it to some value</span>
<span class="bp">self</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"this is a variable"</span><span class="p">)</span>
<span class="c1"># tell the entry widget to watch this variable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entrythingy</span><span class="p">[</span><span class="s2">"textvariable"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">contents</span>
<span class="c1"># and here we get a callback when the user hits return.</span>
<span class="c1"># we will have the program print out the value of the</span>
<span class="c1"># application variable when the user hits return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">entrythingy</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'&lt;Key-Return&gt;'</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">print_contents</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">print_contents</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"hi. contents of entry is now ----&gt;"</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">contents</span><span class="o">.</span><span class="n">get</span><span class="p">())</span>
</code></pre></div><div class="section" id="the-window-manager"><h3><span class="yiyi-st" id="yiyi-259">25.1.6.5. </span><span class="yiyi-st" id="yiyi-260">窗口管理器</span></h3><p id="index-1"><span class="yiyi-st" id="yiyi-261">在 Tk 中,有一个实用程序命令,<code class="docutils literal"><span class="pre">wm</span></code>,用于与窗口管理器交互。</span><span class="yiyi-st" id="yiyi-262"><code class="docutils literal"><span class="pre">wm</span></code> 命令的选项允许您控制诸如标题,位置,图标位图等内容。</span><span class="yiyi-st" id="yiyi-263"><a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a> 中,这些命令已以 <code class="xref py py-class docutils literal"><span class="pre">Wm</span></code> 类的方法实现。</span><span class="yiyi-st" id="yiyi-264">顶级控件是从 <code class="xref py py-class docutils literal"><span class="pre">Wm</span></code> 类继承的,因此可以直接调用 <code class="xref py py-class docutils literal"><span class="pre">Wm</span></code> 方法。</span></p><p><span class="yiyi-st" id="yiyi-265">要获取包含给定控件的顶级窗口,您通常只能参考控件的主体。</span><span class="yiyi-st" id="yiyi-266">当然,如果控件已经被封装在 frame 中,则主体将不表示顶层窗口。</span><span class="yiyi-st" id="yiyi-267">要获取任意控件的顶级窗口,可以调用 <code class="xref py py-meth docutils literal"><span class="pre">_root()</span></code> 方法。</span><span class="yiyi-st" id="yiyi-268">此方法以下划线开始,表示此函数是实现的一部分,而不是 Tk 功能的接口。</span></p><p><span class="yiyi-st" id="yiyi-269">以下是一些典型用法的例子:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tkinter</span> <span class="k">as</span> <span class="nn">tk</span>
<span class="k">class</span> <span class="nc">App</span><span class="p">(</span><span class="n">tk</span><span class="o">.</span><span class="n">Frame</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">master</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">master</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
<span class="c1"># create the application</span>
<span class="n">myapp</span> <span class="o">=</span> <span class="n">App</span><span class="p">()</span>
<span class="c1">#</span>
<span class="c1"># here are method calls to the window manager class</span>
<span class="c1">#</span>
<span class="n">myapp</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s2">"My Do-Nothing Application"</span><span class="p">)</span>
<span class="n">myapp</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">maxsize</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">400</span><span class="p">)</span>
<span class="c1"># start the program</span>
<span class="n">myapp</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</code></pre></div><div class="section" id="tk-option-data-types"><h3><span class="yiyi-st" id="yiyi-270">25.1.6.6. </span><span class="yiyi-st" id="yiyi-271">Tk 选项数据类型</span></h3><dl class="docutils" id="index-2"><dt><span class="yiyi-st" id="yiyi-272">anchor</span></dt><dd><span class="yiyi-st" id="yiyi-273">有效值是位置点:<code class="docutils literal"><span class="pre">"n"</span></code><code class="docutils literal"><span class="pre">"ne"</span></code><code class="docutils literal"><span class="pre">"e"</span></code><code class="docutils literal"><span class="pre">"se"</span></code><code class="docutils literal"><span class="pre">"s"</span></code><code class="docutils literal"><span class="pre">"sw"</span></code><code class="docutils literal"><span class="pre">"w"</span></code><code class="docutils literal"><span class="pre">"nw"</span></code><code class="docutils literal"><span class="pre">"center"</span></code></span></dd><dt><span class="yiyi-st" id="yiyi-274">bitmap位图</span></dt><dd><span class="yiyi-st" id="yiyi-275">有八个内置的已命名位图:<code class="docutils literal"><span class="pre">'error'</span></code><code class="docutils literal"><span class="pre">'gray25'</span></code><code class="docutils literal"><span class="pre">'gray50'</span></code><code class="docutils literal"><span class="pre">'hourglass'</span></code><code class="docutils literal"><span class="pre">'info'</span></code><code class="docutils literal"><span class="pre">'questhead'</span></code><code class="docutils literal"><span class="pre">'question'</span></code><code class="docutils literal"><span class="pre">'warning'</span></code></span><span class="yiyi-st" id="yiyi-276">要指定X位图文件名给出文件的完整路径前面加上 <code class="docutils literal"><span class="pre">@</span></code>,如<code class="docutils literal"><span class="pre">"@/usr/contrib/bitmap/gumby.bit"</span></code></span></dd><dt><span class="yiyi-st" id="yiyi-277">boolean布尔</span></dt><dd><span class="yiyi-st" id="yiyi-278">您可以传递整数 0 或 1 或字符串 <code class="docutils literal"><span class="pre">“yes”</span></code><code class="docutils literal"><span class="pre">“no”</span></code></span></dd><dt><span class="yiyi-st" id="yiyi-279">callback回调</span></dt><dd><p class="first"><span class="yiyi-st" id="yiyi-280">回调函数可以是任何的没有参数的函数。</span><span class="yiyi-st" id="yiyi-281">例如:</span></p><div class="last highlight-python3"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">print_it</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"hi there"</span><span class="p">)</span>
<span class="n">fred</span><span class="p">[</span><span class="s2">"command"</span><span class="p">]</span> <span class="o">=</span> <span class="n">print_it</span>
</pre></div></div></dd><dt><span class="yiyi-st" id="yiyi-282">color颜色</span></dt><dd><span class="yiyi-st" id="yiyi-283">Colors can be given as the names of X colors in the rgb.txt file, or as strings representing RGB values in 4 bit: <code class="docutils literal"><span class="pre">"#RGB"</span></code>, 8 bit: <code class="docutils literal"><span class="pre">"#RRGGBB"</span></code>, 12 bit” <code class="docutils literal"><span class="pre">"#RRRGGGBBB"</span></code>, or 16 bit <code class="docutils literal"><span class="pre">"#RRRRGGGGBBBB"</span></code> ranges, where R,G,B here represent any legal hex digit. </span><span class="yiyi-st" id="yiyi-284">有关详细信息请参阅Ousterhout的书的第160页。</span></dd><dt><span class="yiyi-st" id="yiyi-285">cursor光标</span></dt><dd><span class="yiyi-st" id="yiyi-286">可以使用<code class="file docutils literal"><span class="pre">cursorfont.h</span></code>的标准X游标名称而不使用<code class="docutils literal"><span class="pre">XC_</span></code>前缀。</span><span class="yiyi-st" id="yiyi-287">例如,要获取手形光标(<code class="xref py py-const docutils literal"><span class="pre">XC_hand2</span></code>),请使用字符串<code class="docutils literal"><span class="pre">"hand2"</span></code></span><span class="yiyi-st" id="yiyi-288">您还可以指定自己的位图和掩码文件。</span><span class="yiyi-st" id="yiyi-289">参见Ousterhout的书的第179页。</span></dd><dt><span class="yiyi-st" id="yiyi-290">distance距离</span></dt><dd><span class="yiyi-st" id="yiyi-291">屏幕距离可以指定像素或绝对距离。</span><span class="yiyi-st" id="yiyi-292">像素以数字和绝对距离作为字符串,尾随字符表示单位:<code class="docutils literal"><span class="pre">c</span></code>表示厘米,<code class="docutils literal"><span class="pre">i</span></code>表示英寸,<code class="docutils literal"><span class="pre">m</span></code>表示毫米,<code class="docutils literal"><span class="pre">p</span></code></span><span class="yiyi-st" id="yiyi-293">For example, 3.5 inches is expressed as <code class="docutils literal"><span class="pre">"3.5i"</span></code>.</span></dd><dt><span class="yiyi-st" id="yiyi-294">font字体</span></dt><dd><span class="yiyi-st" id="yiyi-295">Tk使用列表字体名称格式例如<code class="docutils literal"><span class="pre">{courier</span> <span class="pre">10</span> <span class="pre">bold}</span></code></span><span class="yiyi-st" id="yiyi-296">具有正数的字体大小以点数测量;具有负数的尺寸以像素测量。</span></dd><dt><span class="yiyi-st" id="yiyi-297">geometry几何大小</span></dt><dd><span class="yiyi-st" id="yiyi-298">这是一种形式为<code class="docutils literal"><span class="pre">widthxheight</span></code>的字符串,其中对于大多数小部件(以显示文本的小部件的字符为单位),宽度和高度以像素为单位。</span><span class="yiyi-st" id="yiyi-299">例如:<code class="docutils literal"><span class="pre">fred [“geometry”]</span> <span class="pre">=</span> <span class="pre">“200x100”</span></code></span></dd><dt><span class="yiyi-st" id="yiyi-300">justify对齐方式</span></dt><dd><span class="yiyi-st" id="yiyi-301">有效值是:<code class="docutils literal"><span class="pre">"left"</span></code><code class="docutils literal"><span class="pre">"center"</span></code><code class="docutils literal"><span class="pre">"right"</span></code><code class="docutils literal"><span class="pre">"fill"</span></code></span></dd><dt><span class="yiyi-st" id="yiyi-302">region区域</span></dt><dd><span class="yiyi-st" id="yiyi-303">这是一个具有四个空格分隔元素的字符串,每个元素都是一个合法距离(见上文)。</span><span class="yiyi-st" id="yiyi-304">例如:<code class="docutils literal"><span class="pre">“2</span> <span class="pre">3</span> <span class="pre">4</span> <span class="pre">5”</span></code><code class="docutils literal"><span class="pre">“3i</span> <span class="pre">2i</span> <span class="pre">4.5i</span> <span class="pre">2i”</span></code><code class="docutils literal"><span class="pre">“3c</span> <span class="pre">2c</span> <span class="pre">4c</span> <span class="pre">10.43c“</span></code>均为有效的区域。</span></dd><dt><span class="yiyi-st" id="yiyi-305">relief</span></dt><dd><span class="yiyi-st" id="yiyi-306">确定窗口小部件的边框样式。</span><span class="yiyi-st" id="yiyi-307">有效的值有:<code class="docutils literal"><span class="pre">"raised"</span></code>, <code class="docutils literal"><span class="pre">"sunken"</span></code>, <code class="docutils literal"><span class="pre">"flat"</span></code>, <code class="docutils literal"><span class="pre">"groove"</span></code><code class="docutils literal"><span class="pre">"ridge"</span></code>.</span></dd><dt><span class="yiyi-st" id="yiyi-308">scrollcommand</span></dt><dd><span class="yiyi-st" id="yiyi-309">这几乎总是一些滚动条小部件的<code class="xref py py-meth docutils literal"><span class="pre">set()</span></code>方法但可以是任何接受单个参数的widget方法。</span></dd><dt><span class="yiyi-st" id="yiyi-310">wrap:</span></dt><dd><span class="yiyi-st" id="yiyi-311">必须为以下之一:<code class="docutils literal"><span class="pre">"none"</span></code><code class="docutils literal"><span class="pre">"char"</span></code><code class="docutils literal"><span class="pre">"word"</span></code></span></dd></dl></div><div class="section" id="bindings-and-events"><h3><span class="yiyi-st" id="yiyi-312">25.1.6.7. </span><span class="yiyi-st" id="yiyi-313">绑定和事件</span></h3><p id="index-3"><span class="yiyi-st" id="yiyi-314">widget命令的bind方法允许您监视某些事件并在发生事件类型时触发回调函数。</span><span class="yiyi-st" id="yiyi-315">绑定方法的形式是:</span></p><pre><code class="language-python"><span></span><span class="k">def</span> <span class="nf">bind</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sequence</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">add</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
</code></pre><p><span class="yiyi-st" id="yiyi-316">参数依次为:</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-317">sequence</span></dt><dd><span class="yiyi-st" id="yiyi-318">是表示事件的目标类型的字符串。</span><span class="yiyi-st" id="yiyi-319">有关详细信息请参阅John Ousterhout的书的bind手册页和第201页</span></dd><dt><span class="yiyi-st" id="yiyi-320">func</span></dt><dd><span class="yiyi-st" id="yiyi-321">是一个Python函数使用一个参数在事件发生时调用。</span><span class="yiyi-st" id="yiyi-322">事件实例将作为参数传递。</span><span class="yiyi-st" id="yiyi-323">(以这种方式部署的函数通常称为<em>回调函数</em>。)</span></dd><dt><span class="yiyi-st" id="yiyi-324">add</span></dt><dd><span class="yiyi-st" id="yiyi-325">可选参数,<code class="docutils literal"><span class="pre">''</span></code><code class="docutils literal"><span class="pre">'+'</span></code></span><span class="yiyi-st" id="yiyi-326">传递空字符串表示此绑定将替换此事件关联的任何其他绑定。</span><span class="yiyi-st" id="yiyi-327">传递<code class="docutils literal"><span class="pre">'+'</span></code>意味着此函数将添加到绑定到此事件类型的函数列表。</span></dd></dl><p><span class="yiyi-st" id="yiyi-328">例如:</span></p><pre><code class="language-python"><span></span><span class="k">def</span> <span class="nf">turn_red</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">event</span><span class="o">.</span><span class="n">widget</span><span class="p">[</span><span class="s2">"activeforeground"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"red"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">button</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"&lt;Enter&gt;"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">turn_red</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-329">注意如何在<code class="docutils literal"><span class="pre">turn_red()</span></code>回调中访问事件的窗口小部件字段。</span><span class="yiyi-st" id="yiyi-330">此字段包含捕获X事件的窗口小部件。</span><span class="yiyi-st" id="yiyi-331">下表列出了您可以访问的其他事件字段及其在Tk中的表示方式这在引用Tk手册页时很有用。</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-332">Tk</span></th><th class="head"><span class="yiyi-st" id="yiyi-333">Tkinter事件字段</span></th><th class="head"><span class="yiyi-st" id="yiyi-334">Tk</span></th><th class="head"><span class="yiyi-st" id="yiyi-335">Tkinter事件字段</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-336">F</span></td><td><span class="yiyi-st" id="yiyi-337">焦点</span></td><td><span class="yiyi-st" id="yiyi-338">%一个</span></td><td><span class="yiyi-st" id="yiyi-339">char</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-340">H</span></td><td><span class="yiyi-st" id="yiyi-341">高度</span></td><td><span class="yiyi-st" id="yiyi-342">E</span></td><td><span class="yiyi-st" id="yiyi-343">send_event</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-344">k</span></td><td><span class="yiyi-st" id="yiyi-345">关键代码</span></td><td><span class="yiyi-st" id="yiyi-346">K</span></td><td><span class="yiyi-st" id="yiyi-347">keysym</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-348">s</span></td><td><span class="yiyi-st" id="yiyi-349"></span></td><td><span class="yiyi-st" id="yiyi-350">N</span></td><td><span class="yiyi-st" id="yiyi-351">keysym_num</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-352">t</span></td><td><span class="yiyi-st" id="yiyi-353">时间</span></td><td><span class="yiyi-st" id="yiyi-354">T</span></td><td><span class="yiyi-st" id="yiyi-355">类型</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-356">w</span></td><td><span class="yiyi-st" id="yiyi-357">宽度</span></td><td><span class="yiyi-st" id="yiyi-358">W</span></td><td><span class="yiyi-st" id="yiyi-359">窗口小部件</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-360">X</span></td><td><span class="yiyi-st" id="yiyi-361">X</span></td><td><span class="yiyi-st" id="yiyi-362">X</span></td><td><span class="yiyi-st" id="yiyi-363">x_root</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-364">y</span></td><td><span class="yiyi-st" id="yiyi-365">y</span></td><td><span class="yiyi-st" id="yiyi-366">Y</span></td><td><span class="yiyi-st" id="yiyi-367">y_root</span></td></tr></tbody></table></div><div class="section" id="the-index-parameter"><h3><span class="yiyi-st" id="yiyi-368">25.1.6.8. </span><span class="yiyi-st" id="yiyi-369">索引参数</span></h3><p><span class="yiyi-st" id="yiyi-370">许多小部件需要传递“索引”参数。</span><span class="yiyi-st" id="yiyi-371">这些用于指向文本窗口小部件中的特定位置或者指向Entry小部件中的特定字符或指向菜单窗口小部件中的特定菜单项。</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-372">条目窗口小部件索引(索引,视图索引等)</span></dt><dd><span class="yiyi-st" id="yiyi-373">条目小部件具有指向正在显示的文本中的字符位置的选项。</span><span class="yiyi-st" id="yiyi-374">您可以使用这些<a class="reference internal" href="#module-tkinter" title="tkinter: Interface to Tcl/Tk for graphical user interfaces"><code class="xref py py-mod docutils literal"><span class="pre">tkinter</span></code></a>函数在文本小部件中访问这些特殊点:</span></dd><dt><span class="yiyi-st" id="yiyi-375">文本小部件索引</span></dt><dd><span class="yiyi-st" id="yiyi-376">Text小部件的索引符号非常丰富最好在Tk手册页中进行描述。</span></dd><dt><span class="yiyi-st" id="yiyi-377">菜单索引menu.invoke()menu.entryconfig()等)</span></dt><dd><p class="first"><span class="yiyi-st" id="yiyi-378">菜单的一些选项和方法操纵特定的菜单项。</span><span class="yiyi-st" id="yiyi-379">每当选项或参数需要菜单索引时,您可以传入:</span></p><ul class="last simple"><li><span class="yiyi-st" id="yiyi-380">一个整数指的是窗口小部件中条目的数字位置从顶部开始从0开始</span></li><li><span class="yiyi-st" id="yiyi-381">字符串<code class="docutils literal"><span class="pre">"active"</span></code>,其指当前在光标下的菜单位置;</span></li><li><span class="yiyi-st" id="yiyi-382">字符串<code class="docutils literal"><span class="pre">"last"</span></code>,表示最后一个菜单项;</span></li><li><span class="yiyi-st" id="yiyi-383"><code class="docutils literal"><span class="pre">@</span></code>前面的整数,如<code class="docutils literal"><span class="pre">@6</span></code>其中整数被解释为菜单坐标系中的y像素坐标</span></li><li><span class="yiyi-st" id="yiyi-384">字符串<code class="docutils literal"><span class="pre">"none"</span></code>这表示根本没有菜单项最常用于menu.activate()来停用所有条目,最后,</span></li><li><span class="yiyi-st" id="yiyi-385">从菜单顶部到底部扫描的与菜单条目的标签匹配的文本字符串。</span><span class="yiyi-st" id="yiyi-386">注意,在所有其他之后考虑该索引类型,这意味着标记为<code class="docutils literal"><span class="pre">last</span></code><code class="docutils literal"><span class="pre">active</span></code><code class="docutils literal"><span class="pre">none</span></code>的菜单项的匹配可以被解释作为上述字面值,而不是。</span></li></ul></dd></dl></div><div class="section" id="images"><h3><span class="yiyi-st" id="yiyi-387">25.1.6.9. </span><span class="yiyi-st" id="yiyi-388">Images</span></h3><p><span class="yiyi-st" id="yiyi-389">位图/像素映射图像可以通过<code class="xref py py-class docutils literal"><span class="pre">tkinter.Image</span></code>的子类创建:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-390"><code class="xref py py-class docutils literal"><span class="pre">BitmapImage</span></code>可用于X11位图数据。</span></li><li><span class="yiyi-st" id="yiyi-391"><code class="xref py py-class docutils literal"><span class="pre">PhotoImage</span></code>可用于GIF和PPM / PGM颜色位图。</span></li></ul><p><span class="yiyi-st" id="yiyi-392">通过<code class="docutils literal"><span class="pre">file</span></code><code class="docutils literal"><span class="pre">data</span></code>选项(其他选项也可用)创建任一类型的图像。</span></p><p><span class="yiyi-st" id="yiyi-393">然后,图像对象可以用于某些窗口小部件支持<code class="docutils literal"><span class="pre">image</span></code>选项的任何位置。</span><span class="yiyi-st" id="yiyi-394">标签,按钮,菜单)。</span><span class="yiyi-st" id="yiyi-395">在这些情况下Tk不会保留对图像的引用。</span><span class="yiyi-st" id="yiyi-396">当对图像对象的最后一个Python引用被删除时图像数据也被删除并且Tk将在图像被使用的任何地方显示一个空框。</span></p></div></div><div class="section" id="file-handlers"><h2><span class="yiyi-st" id="yiyi-397">25.1.7. </span><span class="yiyi-st" id="yiyi-398">File Handlers</span></h2><p><span class="yiyi-st" id="yiyi-399">Tk允许您注册和取消注册一个回调函数当在文件描述器上可能有I / O时它将从Tk mainloop中调用。</span><span class="yiyi-st" id="yiyi-400">每个文件只能注册一个处理程序描述器。</span><span class="yiyi-st" id="yiyi-401">示例代码:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">tkinter</span>
<span class="n">widget</span> <span class="o">=</span> <span class="n">tkinter</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">tkinter</span><span class="o">.</span><span class="n">READABLE</span> <span class="o">|</span> <span class="n">tkinter</span><span class="o">.</span><span class="n">WRITABLE</span>
<span class="n">widget</span><span class="o">.</span><span class="n">tk</span><span class="o">.</span><span class="n">createfilehandler</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
<span class="o">...</span>
<span class="n">widget</span><span class="o">.</span><span class="n">tk</span><span class="o">.</span><span class="n">deletefilehandler</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-402">此功能在Windows上不可用。</span></p><p><span class="yiyi-st" id="yiyi-403">Since you dont know how many bytes are available for reading, you may not want to use the <a class="reference internal" href="io.html#io.BufferedIOBase" title="io.BufferedIOBase"><code class="xref py py-class docutils literal"><span class="pre">BufferedIOBase</span></code></a> or <a class="reference internal" href="io.html#io.TextIOBase" title="io.TextIOBase"><code class="xref py py-class docutils literal"><span class="pre">TextIOBase</span></code></a> <a class="reference internal" href="io.html#io.BufferedIOBase.read" title="io.BufferedIOBase.read"><code class="xref py py-meth docutils literal"><span class="pre">read()</span></code></a> or <a class="reference internal" href="io.html#io.IOBase.readline" title="io.IOBase.readline"><code class="xref py py-meth docutils literal"><span class="pre">readline()</span></code></a> methods, since these will insist on reading a predefined number of bytes. </span><span class="yiyi-st" id="yiyi-404">对于套接字,<a class="reference internal" href="socket.html#socket.socket.recv" title="socket.socket.recv"><code class="xref py py-meth docutils literal"><span class="pre">recv()</span></code></a><a class="reference internal" href="socket.html#socket.socket.recvfrom" title="socket.socket.recvfrom"><code class="xref py py-meth docutils literal"><span class="pre">recvfrom()</span></code></a>方法将正常工作;对于其他文件,请使用原始读取或<code class="docutils literal"><span class="pre">os.readfile.fileno()</span> <span class="pre">maxbytecount</span></code></span></p><dl class="method"><dt id="tkinter.Widget.tk.createfilehandler"><span class="yiyi-st" id="yiyi-405"> <code class="descclassname">Widget.tk.</code><code class="descname">createfilehandler</code><span class="sig-paren">(</span><em>file</em>, <em>mask</em>, <em>func</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-406">注册文件处理程序回调函数<em>func</em></span><span class="yiyi-st" id="yiyi-407"><em>文件</em>参数可以是具有<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法(例如文件或套接字对象)的对象,也可以是整型文件描述器。</span><span class="yiyi-st" id="yiyi-408"><em>掩码</em>参数是以下三个常量中任何一个的ORed组合。</span><span class="yiyi-st" id="yiyi-409">回调的调用如下:</span></p><pre><code class="language-python"><span></span><span class="n">callback</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">mask</span><span class="p">)</span>
</code></pre></dd></dl><dl class="method"><dt id="tkinter.Widget.tk.deletefilehandler"><span class="yiyi-st" id="yiyi-410"> <code class="descclassname">Widget.tk.</code><code class="descname">deletefilehandler</code><span class="sig-paren">(</span><em>file</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-411">取消注册文件处理程序。</span></p></dd></dl><dl class="data"><dt id="tkinter.READABLE"><span class="yiyi-st" id="yiyi-412"> <code class="descclassname">tkinter.</code><code class="descname">READABLE</code></span></dt><dt id="tkinter.WRITABLE"><span class="yiyi-st" id="yiyi-413"> <code class="descclassname">tkinter.</code><code class="descname">WRITABLE</code></span></dt><dt id="tkinter.EXCEPTION"><span class="yiyi-st" id="yiyi-414"> <code class="descclassname">tkinter.</code><code class="descname">EXCEPTION</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-415"><em>掩码</em>参数中使用的常量。</span></p></dd></dl></div></div></div>