tutorial.html
来自「perl教程」· HTML 代码 · 共 566 行 · 第 1/4 页
HTML
566 行
<span class="string">-command</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">g_destroy</span><span class="operator">;</span> <span class="operator">},</span>
<span class="operator">);</span>
<span class="variable">$b</span><span class="operator">-></span><span class="variable">g_pack</span><span class="operator">;</span>
<span class="variable">Tkx::MainLoop</span><span class="operator">()</span>
</pre>
<p>By loading the Tkx module we make the <code>Tkx::widget</code> class
available and create the main window (the widget called <code>.</code>). Next
we instantiate a new <code>Tkx::widget</code> object wrapping the main window.
It is customary to name this object <code>$mw</code>.</p>
<p>To create a new button child widget we call <code>$mw->new_button</code>
method. Constructor methods are always prefixed with <code>new_</code>. The rest
of the method name is the name of the Tk widget to create; i.e. "button"
in this case. Arguments are passed as before.</p>
<p>Calling a "g_" method will invoke the corresponding Tk command with the
widget path as argument. In the code above we destroy the main window
by calling <code>$mw->g_destroy</code> and we pack the button in the main
window by invoking <code>$b->g_pack</code>.</p>
<p>In the end we need to invoke the MainLoop as before.</p>
<p>For trivial programs like the one above using <code>Tkx::widget</code> wrappers
does not appear to be a win, but as the application grows and the Tk
path names get longer it surely is.</p>
<p>
</p>
<h2><a name="hello_world_expanded">Hello World expanded</a></h2>
<p>In order to introduce a few more Tkx features, we now present a
slightly expanded version of the previous Hello World program. This
time we added line numbers to the program so that it is easier to
reference back to its statements:</p>
<pre>
<span class="number">1</span> <span class="keyword">use</span> <span class="variable">strict</span><span class="operator">;</span>
<span class="number">2</span> <span class="keyword">use</span> <span class="variable">Tkx</span><span class="operator">;</span>
<span class="number">3</span>
<span class="number">4</span> <span class="keyword">my</span> <span class="variable">$mw</span> <span class="operator">=</span> <span class="variable">Tkx::widget</span><span class="operator">-></span><span class="variable">new</span><span class="operator">(</span><span class="string">"."</span><span class="operator">);</span>
<span class="number">5</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">g_wm_title</span><span class="operator">(</span><span class="string">"Hello, world"</span><span class="operator">);</span>
<span class="number">6</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">g_wm_minsize</span><span class="operator">(</span><span class="number">300</span><span class="operator">,</span> <span class="number">200</span><span class="operator">);</span>
<span class="number">7</span>
<span class="number">8</span> <span class="keyword">my</span> <span class="variable">$b</span><span class="operator">;</span>
<span class="number">9</span> <span class="variable">$b</span> <span class="operator">=</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">new_button</span><span class="operator">(</span>
<span class="number">10</span> <span class="operator">-</span><span class="string">text</span> <span class="operator">=></span> <span class="string">"Hello, world"</span><span class="operator">,</span>
<span class="number">11</span> <span class="operator">-</span><span class="string">command</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
<span class="number">12</span> <span class="variable">$b</span><span class="operator">-></span><span class="variable">m_configure</span><span class="operator">(</span>
<span class="number">13</span> <span class="operator">-</span><span class="string">text</span> <span class="operator">=></span> <span class="string">"Goodbye, cruel world"</span><span class="operator">,</span>
<span class="number">14</span> <span class="operator">);</span>
<span class="number">15</span> <span class="variable">Tkx::after</span><span class="operator">(</span><span class="number">1500</span><span class="operator">,</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">g_destroy</span> <span class="operator">});</span>
<span class="number">16</span> <span class="operator">},</span>
<span class="number">17</span> <span class="operator">);</span>
<span class="number">18</span> <span class="variable">$b</span><span class="operator">-></span><span class="variable">g_pack</span><span class="operator">(</span>
<span class="number">19</span> <span class="operator">-</span><span class="string">padx</span> <span class="operator">=></span> <span class="number">10</span><span class="operator">,</span>
<span class="number">20</span> <span class="operator">-</span><span class="string">pady</span> <span class="operator">=></span> <span class="number">10</span><span class="operator">,</span>
<span class="number">21</span> <span class="operator">);</span>
<span class="number">22</span>
<span class="number">23</span> <span class="variable">Tkx::tk___messageBox</span><span class="operator">(</span>
<span class="number">24</span> <span class="operator">-</span><span class="string">parent</span> <span class="operator">=></span> <span class="variable">$mw</span><span class="operator">,</span>
<span class="number">25</span> <span class="operator">-</span><span class="string">icon</span> <span class="operator">=></span> <span class="string">"info"</span><span class="operator">,</span>
<span class="number">26</span> <span class="operator">-</span><span class="string">title</span> <span class="operator">=></span> <span class="string">"Tip of the Day"</span><span class="operator">,</span>
<span class="number">27</span> <span class="operator">-</span><span class="string">message</span> <span class="operator">=></span> <span class="string">"Please be nice!"</span><span class="operator">,</span>
<span class="number">28</span> <span class="operator">);</span>
<span class="number">29</span>
<span class="number">30</span> <span class="variable">Tkx::MainLoop</span><span class="operator">()</span>
</pre>
<p>The first thing we added is the <code>use strict</code> statement, simply
because that's a good idea in general.</p>
<p>In line 5 and 6 we set up some window manager attributes of the main
application window. What is noteworthy here is that we use underscore
in the g_ method names where Tcl would use space between words. Same
rules apply to the function names in the <code>Tkx::</code> namespace directly.
We could alternatively have modified the window attributes with:</p>
<pre>
<span class="variable">Tkx::wm_title</span><span class="operator">(</span><span class="variable">$mw</span><span class="operator">,</span> <span class="string">"Hello, world"</span><span class="operator">);</span>
<span class="variable">Tkx::wm_minsize</span><span class="operator">(</span><span class="variable">$mw</span><span class="operator">,</span> <span class="number">300</span><span class="operator">,</span> <span class="number">200</span><span class="operator">);</span>
</pre>
<p>which in Tcl would have been:</p>
<pre>
wm title . "Hello, world"
wm minsize . 300 200</pre>
<p>The rule is: A single underscore on the Perl side turns into space on
the Tcl side.</p>
<p>In line 11 to 16 we have expanded the button callback to change the
text of button and then wait 1.5 seconds before we shut down the
application. In addition to the "g_" methods described in the
previous section, <code>Tkx::widget</code> also provide "m_" methods which are
forwarded as Tcl subcommands of the current widget. The most commonly
used subcommand is "configure" that is used to change the attributes
of a widget as we do in line 12. Since we now reference $b from the
callback, we had to declare the variable upfront in line 8 instead of
declaring it together with the assignment as we did previously. In
line 15 we schedule for the window to be destroyed after a delay of
1500 ms. The delay is needed so that the new button text is actually
show before the window goes away.</p>
<p>Btw, the "m_" method prefix is actually optional, so you might prefer
just to leave it out.</p>
<p>Padding around buttons is usually a good idea as we now do in line 18.</p>
<p>In line 23 we invoke the messageBox command to pop up a useful
reminder to our user. But what's up with the "tk___" prefix? In the
Tcl docs you will find that the name of this command is actually
"tk_messageBox". Remember the previous rule that an underscore in
Tkx:: names turn into a space on the Tcl side? If you try to call
<code>Tkx::tk_messageBox()</code> you will get an error telling you:</p>
<pre>
bad option "messageBox": must be appname, caret, scaling,
useinputmethods, or windowingsystem</pre>
<p>What happens is that Tkx invoked the "tk messageBox" command, but the
Tcl "tk" command only take the subcommands listed in the error message
above and refuse to do anything about "messageBox". In order to
invoke Tcl commands with underscore their name, you need to <em>triple</em>
the underscore on the Perl side, which gives us
<code>Tkx::tk___messageBox()</code>. Double underscores in names have yet another
meaning that we will tell you about in the next section.</p>
<p>
</p>
<h2><a name="setting_up_a_menu_line">Setting up a menu line</a></h2>
<p>Most real GUI application will need a menu line at the top of the
application window or screen. The following runnable program shows
how a minimal menu can be set up with Tkx:</p>
<pre>
<span class="number">1</span> <span class="comment">#!/usr/bin/perl -w</span>
<span class="number">2</span>
<span class="number">3</span> <span class="keyword">use</span> <span class="variable">strict</span><span class="operator">;</span>
<span class="number">4</span> <span class="keyword">use</span> <span class="variable">Tkx</span><span class="operator">;</span>
<span class="number">5</span>
<span class="number">6</span> <span class="keyword">our</span> <span class="variable">$VERSION</span> <span class="operator">=</span> <span class="string">"1.00"</span><span class="operator">;</span>
<span class="number">7</span>
<span class="number">8</span> <span class="operator">(</span><span class="keyword">my</span> <span class="variable">$progname</span> <span class="operator">=</span> <span class="variable">$0</span><span class="operator">)</span> <span class="operator">=~</span> <span class="regex">s,.*[\\/],,</span><span class="operator">;</span>
<span class="number">9</span> <span class="keyword">my</span> <span class="variable">$IS_AQUA</span> <span class="operator">=</span> <span class="variable">Tkx::tk_windowingsystem</span><span class="operator">()</span> <span class="keyword">eq</span> <span class="string">"aqua"</span><span class="operator">;</span>
<span class="number">10</span>
<span class="number">11</span> <span class="variable">Tkx::package_require</span><span class="operator">(</span><span class="string">"style"</span><span class="operator">);</span>
<span class="number">12</span> <span class="variable">Tkx::style__use</span><span class="operator">(</span><span class="string">"as"</span><span class="operator">,</span> <span class="string">-priority</span> <span class="operator">=></span> <span class="number">70</span><span class="operator">);</span>
<span class="number">13</span>
<span class="number">14</span> <span class="keyword">my</span> <span class="variable">$mw</span> <span class="operator">=</span> <span class="variable">Tkx::widget</span><span class="operator">-></span><span class="variable">new</span><span class="operator">(</span><span class="string">"."</span><span class="operator">);</span>
<span class="number">15</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">configure</span><span class="operator">(</span><span class="string">-menu</span> <span class="operator">=></span> <span class="variable">mk_menu</span><span class="operator">(</span><span class="variable">$mw</span><span class="operator">));</span>
<span class="number">16</span>
<span class="number">17</span> <span class="variable">Tkx::MainLoop</span><span class="operator">();</span>
<span class="number">18</span> <span class="keyword">exit</span><span class="operator">;</span>
<span class="number">19</span>
<span class="number">20</span> <span class="keyword">sub</span><span class="variable"> mk_menu </span><span class="operator">{</span>
<span class="number">21</span> <span class="keyword">my</span> <span class="variable">$mw</span> <span class="operator">=</span> <span class="keyword">shift</span><span class="operator">;</span>
<span class="number">22</span> <span class="keyword">my</span> <span class="variable">$menu</span> <span class="operator">=</span> <span class="variable">$mw</span><span class="operator">-></span><span class="variable">new_menu</span><span class="operator">;</span>
<span class="number">23</span>
<span class="number">24</span> <span class="keyword">my</span> <span class="variable">$file</span> <span class="operator">=</span> <span class="variable">$menu</span><span class="operator">-></span><span class="variable">new_menu</span><span class="operator">(</span>
<span class="number">25</span> <span class="operator">-</span><span class="string">tearoff</span> <span class="operator">=></span> <span class="number">0</span><span class="operator">,</span>
<span class="number">26</span> <span class="operator">);</span>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?