翼度科技»论坛 编程开发 python 查看内容

Python 内置界面开发框架 Tkinter入门篇 丁

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/X5cqennLrq7i1pzBAAqQ2w
  1. 本文大概 2562 个字,阅读需花 15 分钟
  2. 内容不多,但也花了一些精力
  3. 如要交流,欢迎关注我然后评论区留言
  4. 谢谢你的点赞收藏分享
复制代码
​这篇文章属于系列文章《Python 内置界面开发框架 Tkinter入门篇》的第四篇,也是最后一篇,上接《Python 内置界面开发框架 Tkinter入门篇 丙》,欢迎关注我的微信公众号「ENG八戒」查看这个系列相关文章,也可以翻到文章底部查看整个系列的文章集合。
实现一个简单的记事本应用

前面说了这么多,用句流行语来概括就是 「散装知识点」。为了串联起来有个全面的体会,下面让我们一起来实现一个简单的记事本程序吧!
产品定义

作为一个产品的开发来看的话,我们需要清楚地知道自己到底想要的产品是长什么样子,然后才是实现的过程。
我们打算做一个基本的记事本,它可以点击按键打开 TXT 格式的文本文件,把文件内容读取出来显示在编辑区,然后在编辑区修改了文件内容后,又可以点击其它按键把编辑区的内容另存为其它文本文件。
按照上面的功能需求定义,就可以给记事本定个草图啦,长这样

可以看到,它需要先有个主窗口
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.mainloop()
复制代码

然后,应该有个标题栏,上面显示有软件名称 「记事本」
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.title("记事本")
  4. window.mainloop()
复制代码

从草图来看,它还需要功能按钮区域和文本编辑区,可以使用 grid 布局管理器来划分区域。总体可以划分为 1 行 2 列,第 1 列是功能按钮区域,第 2 列是文本编辑区;第 1 行第 1 列也就是功能按钮区域,又可以划分为 2 行 1 列,第 1 行是按钮打开,第 2 行是按钮另存。
好了,这就是我们这个产品的初步定义。
UI实现

对界面布局做好划分之后,就开始添加控件代码了
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.title("记事本")
  4. btn_frame = tk.Frame(
  5.     master=window,
  6.     bd=2
  7.     )
  8. btn_open = tk.Button(
  9.     master=btn_frame,
  10.     text="打开"
  11.     )
  12. btn_save_as = tk.Button(
  13.     master=btn_frame,
  14.     text="另存"
  15.     )
  16. btn_open.grid(row=0, column=0)
  17. btn_save_as.grid(row=1, column=0)
  18. btn_frame.grid(row=0, column=0)
  19. txt_edit = tk.Text(master=window)
  20. txt_edit.grid(row=0, column=1)
  21. window.mainloop()
复制代码
显示是这样

看起来已经和草图很接近了,不过按钮的布局还是需要调整,位置应该处于所属列的顶部,而且按钮太靠边了。还有,窗体在拉伸之后,控件也没有跟随变化。这几个问题怎么修复呢?
为了将按钮置顶,可以对控件 btn_frame 应用上下拉满,sticky 设为 "ns"。
而按钮太靠边,可以通过修改填充属性 padding,比如 padx=5, pady=5 让控件的边框收缩 5 个像素,保持距离感。
而编辑框控件没有跟随窗体一起拉伸,是因为控件 txt_edit 还需要设置所有边框靠着边界,比如 sticky 设为 "nsew" 即可。
看看修改后的代码
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.title("记事本")
  4. window.rowconfigure(
  5.     0,
  6.     minsize=100,
  7.     weight=1
  8.     )
  9. window.columnconfigure(
  10.     1,
  11.     minsize=100,
  12.     weight=1
  13.     )
  14. btn_frame = tk.Frame(
  15.     master=window,
  16.     bd=2
  17.     )
  18. btn_open = tk.Button(
  19.     master=btn_frame,
  20.     text="打开"
  21.     )
  22. btn_save_as = tk.Button(
  23.     master=btn_frame,
  24.     text="另存"
  25.     )
  26. btn_open.grid(
  27.     row=0,
  28.     column=0,
  29.     sticky="ew",
  30.     padx=5,
  31.     pady=5
  32.     )
  33. btn_save_as.grid(
  34.     row=1,
  35.     column=0,
  36.     sticky="ew",
  37.     padx=5
  38.     )
  39. btn_frame.grid(
  40.     row=0,
  41.     column=0,
  42.     sticky="ns"
  43.     )
  44. txt_edit = tk.Text(master=window)
  45. txt_edit.grid(
  46.     row=0,
  47.     column=1,
  48.     sticky="nsew"
  49.     )
  50. window.mainloop()
复制代码
跑起来试一下

OK ! UI 界面视觉效果达到预期了。
逻辑功能

下一步就是补充逻辑功能,让记事本能读写文本文件。
先看怎么实现打开逻辑。
理一下思路: 点击按钮「打开」,程序就会弹出选取文件的窗口,选中文件后点击确定就返回选中的文件路径,然后按照文件路径把文件内容读取出来并且显示到编辑框中。另外,为了让用户知道最终显示的内容来自哪个文件,所以可以把文件路径添加到窗口的标题栏最前面。看怎么修改代码
  1. ...
  2. def open_file():
  3.     file_path = filedialog.askopenfilename(
  4.         filetypes=[
  5.             ("Text files", "*.txt"),
  6.             ("All files", "*.*")
  7.             ]
  8.     )
  9.     if not file_path:
  10.         window.title("无标题 - 记事本")
  11.         return
  12.     window.title(f"{file_path} - 记事本")
  13.     txt_edit.delete("1.0",
  14.                     tk.END)
  15.     with open(
  16.         file_path,
  17.         mode="r",
  18.         encoding="utf-8") as input_file:
  19.         txt_edit.insert(
  20.             tk.END,
  21.             input_file.read()
  22.             )
  23. ...
  24. btn_open = tk.Button(
  25.     master=btn_frame,
  26.     text="打开",
  27.     command=open_file
  28.     )
  29. ...
复制代码
上面代码的修改点是添加了一个响应函数 open_file,这个函数用于打开文本文件并读取文件内容显示,然后在实例化按钮控件 btn_open 时,把响应函数 open_file 赋值给参数 command 即可。
为了测试记事本的显示文本内容功能,我们先手动在桌面创建一个文本文件 test.txt,然后输入内容并保存
  1. 这是测试文本文件
  2. ...
复制代码
运行一下程序,然后点击「打开」按钮,选中刚刚创建的文件 test.txt 并打开

可见读取文本内容的目标功能基本达成,再看怎么实现另存逻辑。
理一下思路: 点击按钮「另存」,程序就会弹出选择保存文件的路径的窗口,选中路径后点击确定就返回选中的路径,然后按照路径把编辑框中的内容保存为文件。另存后,窗口标题栏也需要相应改变。看怎么修改代码
  1. ...
  2. def save_as_file():
  3.     file_path = filedialog.asksaveasfilename(
  4.         defaultextension=".txt",
  5.         filetypes=[
  6.             ("Text files", "*.txt"),
  7.             ("All files", "*.*")
  8.             ]
  9.     )
  10.     if not file_path:
  11.         return
  12.     with open(
  13.         file_path,
  14.         mode="w",
  15.         encoding="utf-8") as output_file:
  16.         output_file.write(txt_edit.get("1.0",
  17.                                         tk.END))
  18.     window.title(f"{file_path} - 记事本")
  19. ...
  20. btn_save_as = tk.Button(
  21.     master=btn_frame,
  22.     text="另存",
  23.     command=save_as_file
  24.     )
  25. ...
复制代码
上面代码的修改点是添加了一个响应函数 save_as_file,这个函数用于选择另存文件位置并把编辑框内容写入指定位置文件,然后在实例化按钮控件 btn_save_as 时,把响应函数 save_as_file 赋值给参数 command 即可。
为了测试记事本的文件另存功能,我们先用我们最新修改的记事本程序打开上面手动创建的文本文件 test.txt,然后在编辑框把内容修改一下

点击「另存」按钮,弹出「另存为」文件窗口,找到保存位置并输入新文件名 test_save_as.txt,最后点击「保存」。

另存完毕后,窗口标题内容变成了新文件路径。
好了,一个简单的记事本程序就这样完成了。希望上面的内容能打开你的思路!
打包部署

关于 python 输出独立可执行应用的介绍,其实和用什么 GUI 框架无关,可直接参考一下我的另一篇文章《Python:界面开发,wx入门篇》里的相关介绍。
由于篇幅受限,系列文章《Python 内置界面开发框架 Tkinter入门篇》分成了下面几个部分,有兴趣的朋友可点击跳转查阅
《Python 内置界面开发框架 Tkinter入门篇 甲》
《Python 内置界面开发框架 Tkinter入门篇 乙》
《Python 内置界面开发框架 Tkinter入门篇 丙》
《Python 内置界面开发框架 Tkinter入门篇 丁》
如需要完整示例代码,可前往 github 仓库获取: git@github.com:ifi-leung/python_gui_tkinter.git
这里预告一下,本公众号 ENG八戒 的荐书活动马上来临,为了鼓励大家多读书,所以会有免费送图书的名额哦!


来源:https://www.cnblogs.com/englyf/p/17125281.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具