RSS
热门关键字:
当前位置 : 主页>编程开发>Python>列表

可爱的 Python:Python 中的 TK编程

来源:我要研发网 作者: 时间:1970-01-01 点击:



  David Mertz 用源代码样本以及详细说明介绍了 TK 和Tkinter 封装器(Python GUI库)。为了更便于操作,他演示了曾在以前很多文章中使用 Txt2Html前端程序 GUI移植示例。当然,他认为您会定期阅读其专栏。 字串8

  我想要向您介绍能想像到开始 GUI 编程最简单方法,就是使用 Scriptics TK 和 Tkinter 封装器。我们将与 developerWorks 中 “Python 中 curses 编程” 提到 curses 库进行很多比较。除了 curses 实现文本控制台而 TK 实现 GUI 这一差别之外,这两个库有着惊人相似接口。在使用任何一个库之前,需要基本了解窗口和事件循环,并参考可用窗口小部件。(参考和适量练习。)

字串3

  如同关于 curses 文章,本文仅讨论 Tkinter 本身特性。既然很多 Python 发行版都带有 Tkinter,因此可能无需下载支持库或其它 Python 模块。本文后面 参考资料 指向几个更高级别用户接口窗口小部件集合,但是您可以用 Tkinter 本身做许多事,包括构造自己高级窗口小部件。学习基本 Tkinter 模块将为您引入 TK 思维方式,即使您继续使用更高级窗口小部件集合,这种思维方式仍十分重要。 字串2

  TK 简要描述

字串4

  TK 是与 TCL 语言关系最密切、且被广泛使用图形库,TCL 语言和 TK 都由 John Ousterhout 开发。虽然 TK 于 1991 年作为 X11 库出现,但实际上它从那时起就被移植到每一种流行 GUI。(它与 Python 逐渐拥有“标准”GUI 情形相似。)现在,大多数流行语言和很多小型语言都有 TK 绑定(Tkinter 模块)。 字串2

  在开始之前,我必须承认:我不是瘦小枯干 TK 编程专家。事实上,我大部分 TK 编程经验大约从我写这篇文章三天前才开始。那三天并非没有挑战,但是最后我觉得很地掌握了 Tkinter。我在这里要说是:TK 和 Tkinter 封装器设计得都非常,便于用户操作,并且只是关于 GUI 编程最简单介绍。 字串6

  从测试应用程序开始

字串6

  我们将使用 Txt2Html,这个在以前很多专栏(请参阅 参考资料 )中使用文件格式转换程序,封装器作为测试应用程序。虽然可以用几种方式运行 Txt2Html,但这里封装器却要从命令行运行 Txt2Html。该应用程序以批处理进程形式运行,并带有指出要执行转换各方面特性命令行自变量。(以后,最为用户提供交互式选择屏幕选项,以在执行实际转换之前引导用户逐步选择不同转换选项并提供所选选项可视反馈。) 字串6

  tk_txt2html 基于带有下拉菜单和嵌套子菜单顶部菜单。旁边有详细实现说明,它看起来与在 “Python 中 Curses 编程” 中讨论 curses 版本很相象。虽然 TK 用较少代码可以实现更多功能,但很明显,tk_txt2html 和 curses_txt2html 很相似。例如,在 TK 中,象菜单这样特性可以依靠内置 Tkinter 类实现,而无需从头编写。 字串4


字串2

  除了设置配置选项之外,TK 封装器还包括一个与 TK Text 窗口小部件一起构建滚动帮助框(一个带有 Message 窗口小部件“关于”框)和一个进行 TK 动态几何管理历史窗口。与大多数交互式应用程序一样,封装器用 TK Entry 窗口小部件接受某些用户输入。

字串1

  在进一步讨论代码之前,让我们看一下实际运行中应用程序。 字串6

  学习基本知识 字串1

  实际上,Tkinter 程序只需做三件事: 字串2

  最小 [Tkinter] 程序 字串8

import Tkinter # import the Tkinter module
root = Tkinter.Tk() # create a root window
root.mainloop() # create an event loop

字串6

  这是一个完全有效 Tkinter 程序(不要介意它没有实际用处,因为它甚至不管理 "hello world")。该程序唯一需要做是创建一些容纳其根窗口窗口小部件。这样增强之后,无需程序员进一步干涉,该程序 root .mainloop() 方法调用就可以处理所有用户交互。 字串6

  main() 函数 字串1

  现在,我们看一下 tk_txt2html.py 更现实 main() 函数。请注意,我更喜欢使用 John Grayson import Tkinter 语句,而不是 from Tkinter import (请参阅 参考资料 中所列书籍)。这不是因为我担心名称空间干扰( from ... import 语句通常警告),而是因为我想明确使用 Tkinter 类;我不想冒险将它们与我自己函数和类相混淆)。建议您也这样做,至少在开始时这样做。 字串7

  tk_txt2html main() 函数 字串9

def main():
global root, history_frame, info_line
root = Tkinter.Tk()
root.title('Txt2Html TK Shell')
init_vars()
#-- Create the menu frame, and menus to the menu frame
menu_frame = Tkinter.Frame(root)
menu_frame.pack(fill=Tkinter.X, side=Tkinter.TOP)
menu_frame.tk_menuBar(file_menu(), action_menu(), help_menu())
#-- Create the history frame (to be filled in during runtime)
history_frame = Tkinter.Frame(root)
history_frame.pack(fill=Tkinter.X, side=Tkinter.BOTTOM, pady=2)
#-- Create the info frame and fill with initial contents
info_frame = Tkinter.Frame(root)
info_frame.pack(fill=Tkinter.X, side=Tkinter.BOTTOM)
# first put the column labels in a sub-frame
LEFT, Label = Tkinter.LEFT, Tkinter.Label # shortcut names
label_line = Tkinter.Frame(info_frame, relief=Tkinter.RAISED, borderwidth=1)
label_line.pack(side=Tkinter.TOP, padx=2, pady=1)
Label(label_line, text="Run #", width=5).pack(side=LEFT)
Label(label_line, text="Source:", width=20).pack(side=LEFT)
字串6

Label(label_line, text="Target:", width=20).pack(side=LEFT)
Label(label_line, text="Type:", width=20).pack(side=LEFT)
Label(label_line, text="Proxy Mode:", width=20).pack(side=LEFT)
# then put the "next run" information in a sub-frame
info_line = Tkinter.Frame(info_frame)
info_line.pack(side=Tkinter.TOP, padx=2, pady=1)
update_specs()
#-- Finally, let's actually do all that stuff created above
root.mainloop()
字串5


字串5

  在这个简单 main() 函数中有几件事要注意:

字串6

  每一个窗口小部件都有一个父代。每当创建窗口小部件时,传递给实例创建第一个自变量是新窗口小部件父代。

字串9

  如果有其它窗口小部件创建自变量,将通过名称传递它们。Python 这一特性给我们以指定选项或允许它们取缺省值极大灵活性。 字串5

  有几个窗口小部件实例 (Frame) 是全局变量。可以通过在函数间传递变量来使它们成为本地变量,以便维护代码范围理论纯洁性,但是与它实际用处相比过于麻烦。另外,使这些基本 UI 元素全局化强调了这样一个事实:它们可以在整个函数中使用。但是,要确保对自己全局变量使用良命名规范。(事先给您一个警告,Python 人员看起来讨厌匈牙利符号。)

字串7

  创建完窗口小部件之后,我们调用一个几何图形管理器来让 TK 知道在哪里放置窗口小部件。TK 在计算细节信息时有许多魔力,特别是当调整窗口大小或动态添加窗口小部件时更是如此。但是在任何情况下,都需要让 TK 知道使用哪套咒语。

字串1

  应用几何图形管理

字串7

  TK 提供三个几何图形管理器: .pack() 、 .grid() 和 .place() 。虽然 .place() 可用于精细(换句话说,非常复杂)控制,但 tk_txt2html 只使用头两个。大多数时候,您将使用 .pack() 。

字串7

  当然,可以不带自变量来调用 .pack() 方法。但是如果那样做,窗口小部件可能会在显示屏幕某处结束,您可能也想为 .pack() 提供一些提示。这些提示中最重要是 side 自变量。可能值是 LEFT、RIGHT、TOP 和 BOTTOM(请注意这些是 Tkinter 名称空间中变量)。

字串7

  .pack() 许多魔力来自可以将窗口小部件嵌套这一事实。特别,除了作为其它窗口小部件容器(它有时显示不同类型边界)之外,Frame 窗口小部件几乎不作什么。这样,就可以很方便地在所希望方向排列几个框架,然后在每个框架中添加其它窗口小部件。按照调用框架(以及其它窗口小部件) .pack() 方法顺序来排列它们。因此,如果两个窗口小部件都请求 side=TOP ,则满足先进入请求。 字串2

  tk_txt2html 还偶尔使用 .grid() 。grid 几何图形管理器用可视坐标线覆盖父代窗口小部件。当窗口小部件调用 .grid(row=3, column=4) 时,它请求其父代将它放在第三行第四列上。通过查看父代所有子代请求来计算父代总行数和总列数。 字串4

  别忘了对自己窗口小部件应用几何图形管理器,以免在显示屏幕上看不到它们时后悔莫及。

字串1

  菜单

字串6


字串7

  Tkinter 能轻易生成菜单。虽然我们在这里使用十分简单示例,但是如果愿意,还可以用不同字体、图形、复选框和各种别致子代窗口小部件来填充菜单。在我们示例中,tk_txt2html 菜单全部用我们在上面所见行创建。

字串3

menu_frame.tk_menuBar(file_menu(), action_menu(), help_menu()) 字串8

  这行本身可能有些神秘。大多数必须完成工作位于名为 *_menu() 函数中。让我们看一下最简单示例。

字串2

  创建下拉菜单 字串6

def help_menu():
help_btn = Tkinter.Menubutton(menu_frame, text='Help', underline=0)
help_btn.pack(side=Tkinter.LEFT, padx="2m")
help_btn.menu = Tkinter.Menu(help_btn)
help_btn.menu.add_command(label="How To", underline=0, command=HowTo)
help_btn.menu.add_command(label="About", underline=0, command=About)
help_btn['menu'] = help_btn.menu
return help_btn
字串5

  下拉菜单是将 Menu 小窗口部件作为子代 Menubutton 小窗口部件。 .pack() (或 .grid() 等)将 Menubutton 排列在适当位置。Menu 小窗口部件用 .add_command() 方法添加项。(请注意上面为 Menubutton 目录所作奇怪分配。不要问为什么,跟着我这样做并在您自己代码中也这样做即可。)

字串4

  获得用户输入

字串3

  下面将看到示例演示 Label 小窗口部件 widget 如何显示输入(有关 Text 和 Message 小窗口部件某些示例完整资源,请参阅 参考资料 )。字段输入基本小窗口部件是 Entry。它易于使用,但是如果以前曾使用过 Python raw_input() 或 curses .getstr() ,您将发现技巧略有不同。TK Entry 小窗口部件不返回可分配值。相反,它获取自变量来填充字段对象。例如,下面函数允许用户指定输入文件。

字串6

  接受用户字段输入

字串4

def GetSource():
get_window = Tkinter.Toplevel(root)
get_window.title('Source File?')
Tkinter.Entry(get_window, width=30,
textvariable=source).pack()
Tkinter.Button(get_window, text="Change",
command=lambda: update_specs()).pack()
字串6

  这里有几件事要注意。我们为这个输入创建了一个新 Toplevel 小窗口部件和对话框,并且通过创建一个带有 textvariable 自变量 Entry 小窗口部件指定了输入字段。但是等一下,还有件事! 字串9


字串5

  textvariable 自变量没有指定简单字符串变量。相反,它引用一个 StringVar 对象。在我们示例中,从 main() 调用 init_vars() 函数包含三行。 字串9

source = Tkinter.StringVar()
source.set('txt2html.txt')
字串6

  这创建了一个适用于用户输入对象并为其分配了初始值。每次在与之相链接 Entry 小窗口部件中进行更改时都立即修改该对象。每次在 Entry 小窗口部件中击键、而不是读取终止时,都进行 raw_input() 样式更改。 字串5

  要想获得户输入值,我们使用 StringVar 实例 .get() 方法。例如:

字串5

source_string = source.get()
字串2

  结束语

字串6

  此处所略述技巧以及我们在完整应用程序源代码中使用技巧应该足以使您开始进行 Tkinter 编程了。略微实践之后您就会发现它不难掌握。有一个处是:可以通过 Python 以外很多语言访问 TK 库,因此您使用 Python Tkinter 模块学到大多数知识可以应用到其它语言。 字串1

字串8

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章