mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
107 lines
79 KiB
HTML
107 lines
79 KiB
HTML
<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 Welch’s 的百科书。</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(fred,someOptions),在 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">=====></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">=====></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">=====></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">=====></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">==></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">=====></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">=====></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">tkinter(Python 库)</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">_tkinter(C)</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">Tk(C)</span></dt><dd><span class="yiyi-st" id="yiyi-173">Tk 控件的 Tk 部分执行最终映射到...</span></dd><dt><span class="yiyi-st" id="yiyi-174">Xlib(C)</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">>>> </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">'<Key-Return>'</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 ---->"</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">"<Enter>"</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 don’t 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.read(file.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> |