如需求转载,请声明原文链接 微信大众号「ENG八戒」mp.weixin.qq.com/s/X5cqennLr…

本文大约 2562 个字,阅览需花 15 分钟
内容不多,但也花了一些精力
如要交流,欢迎重视我然后评论区留言
谢谢你的点赞保藏共享

​这篇文章属于系列文章《Python 内置界面开发结构 Tkinter入门篇》的第四篇,也是终究一篇,上接《Python 内置界面开发结构 Tkinter入门篇丙》,欢迎重视我的微信大众号「ENG八戒」检查这个系列相关文章,也能够翻到文章底部检查整个系列的文章调集。

完成一个简略的记事本使用

前面说了这么多,用句流行语来概括便是 「散装知识点」。为了串联起来有个全面的领会,下面让咱们一起来完成一个简略的记事本程序吧!

产品界说

作为一个产品的开发来看的话,咱们需求清楚地知道自己到底想要的产品是长什么样子,然后才是完成的进程。

咱们打算做一个根本的记事本,它能够点击按键翻开 TXT 格式的文本文件,把文件内容读取出来显现在修正区,然后在修正区修正了文件内容后,又能够点击其它按键把修正区的内容另存为其它文本文件。

依照上面的功用需求界说,就能够给记事本定个草图啦,长这样

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

能够看到,它需求先有个主窗口

import tkinter as tk
window = tk.Tk()
window.mainloop()

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

然后,应该有个标题栏,上面显现有软件名称 「记事本」

import tkinter as tk
window = tk.Tk()
window.title("记事本")
window.mainloop()

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

从草图来看,它还需求功用按钮区域和文本修正区,能够使用 grid 布局管理器来划分区域。总体能够划分为 1 行 2 列,第 1 列是功用按钮区域,第 2 列是文本修正区;第 1 行第 1 列也便是功用按钮区域,又能够划分为 2 行 1 列,第 1 行是按钮翻开,第 2 行是按钮另存。

好了,这便是咱们这个产品的开始界说。

UI完成

对界面布局做好划分之后,就开始增加控件代码了

import tkinter as tk
window = tk.Tk()
window.title("记事本")
btn_frame = tk.Frame(
    master=window,
    bd=2
    )
btn_open = tk.Button(
    master=btn_frame,
    text="翻开"
    )
btn_save_as = tk.Button(
    master=btn_frame,
    text="另存"
    )
btn_open.grid(row=0, column=0)
btn_save_as.grid(row=1, column=0)
btn_frame.grid(row=0, column=0)
txt_edit = tk.Text(master=window)
txt_edit.grid(row=0, column=1)
window.mainloop()

显现是这样

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

看起来现已和草图很接近了,不过按钮的布局还是需求调整,方位应该处于所属列的顶部,而且按钮太靠边了。还有,窗体在拉伸之后,控件也没有跟从改变。这几个问题怎样修复呢?

为了将按钮置顶,能够对控件 btn_frame 使用上下拉满,sticky 设为 “ns”。

而按钮太靠边,能够通过修正填充属性 padding,比方 padx=5, pady=5 让控件的边框收缩 5 个像素,坚持距离感。

而修正框控件没有跟从窗体一起拉伸,是因为控件 txt_edit 还需求设置所有边框靠着鸿沟,比方 sticky 设为 “nsew” 即可。

看看修正后的代码

import tkinter as tk
window = tk.Tk()
window.title("记事本")
window.rowconfigure(
    0,
    minsize=100,
    weight=1
    )
window.columnconfigure(
    1,
    minsize=100,
    weight=1
    )
btn_frame = tk.Frame(
    master=window,
    bd=2
    )
btn_open = tk.Button(
    master=btn_frame,
    text="翻开"
    )
btn_save_as = tk.Button(
    master=btn_frame,
    text="另存"
    )
btn_open.grid(
    row=0,
    column=0,
    sticky="ew",
    padx=5,
    pady=5
    )
btn_save_as.grid(
    row=1,
    column=0,
    sticky="ew",
    padx=5
    )
btn_frame.grid(
    row=0,
    column=0,
    sticky="ns"
    )
txt_edit = tk.Text(master=window)
txt_edit.grid(
    row=0,
    column=1,
    sticky="nsew"
    )
window.mainloop()

跑起来试一下

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

OK ! UI 界面视觉效果到达预期了。

逻辑功用

下一步便是弥补逻辑功用,让记事天性读写文本文件。

先看怎样完成翻开逻辑。

理一下思路: 点击按钮「翻开」,程序就会弹出选取文件的窗口,选中文件后点击确认就回来选中的文件途径,然后依照文件途径把文件内容读取出来而且显现到修正框中。别的,为了让用户知道终究显现的内容来自哪个文件,所以能够把文件途径增加到窗口的标题栏最前面。看怎样修正代码

...
def open_file():
    file_path = filedialog.askopenfilename(
        filetypes=[
            ("Text files", "*.txt"),
            ("All files", "*.*")
            ]
    )
    if not file_path:
        window.title("无标题 - 记事本")
        return
    window.title(f"{file_path} - 记事本")
    txt_edit.delete("1.0",
                    tk.END)
    with open(
        file_path,
        mode="r",
        encoding="utf-8") as input_file:
        txt_edit.insert(
            tk.END,
            input_file.read()
            )
...
btn_open = tk.Button(
    master=btn_frame,
    text="翻开",
    command=open_file
    )
...

上面代码的修正点是增加了一个响应函数 open_file,这个函数用于翻开文本文件并读取文件内容显现,然后在实例化按钮控件 btn_open 时,把响应函数 open_file 赋值给参数 command 即可。

为了测试记事本的显现文本内容功用,咱们先手动在桌面创立一个文本文件 test.txt,然后输入内容并保存

这是测试文本文件
...

运转一下程序,然后点击「翻开」按钮,选中刚刚创立的文件 test.txt 并翻开

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

可见读取文本内容的目标功用根本达到,再看怎样完成另存逻辑。

理一下思路: 点击按钮「另存」,程序就会弹出选择保存文件的途径的窗口,选中途径后点击确认就回来选中的途径,然后依照途径把修正框中的内容保存为文件。另存后,窗口标题栏也需求相应改变。看怎样修正代码

...
def save_as_file():
    file_path = filedialog.asksaveasfilename(
        defaultextension=".txt",
        filetypes=[
            ("Text files", "*.txt"),
            ("All files", "*.*")
            ]
    )
    if not file_path:
        return
    with open(
        file_path,
        mode="w",
        encoding="utf-8") as output_file:
        output_file.write(txt_edit.get("1.0",
                                        tk.END))
    window.title(f"{file_path} - 记事本")
...
btn_save_as = tk.Button(
    master=btn_frame,
    text="另存",
    command=save_as_file
    )
...

上面代码的修正点是增加了一个响应函数 save_as_file,这个函数用于选择另存文件方位并把修正框内容写入指定方位文件,然后在实例化按钮控件 btn_save_as 时,把响应函数 save_as_file 赋值给参数 command 即可。

为了测试记事本的文件另存功用,咱们先用咱们最新修正的记事本程序翻开上面手动创立的文本文件 test.txt,然后在修正框把内容修正一下

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

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

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

另存结束后,窗口标题内容变成了新文件途径。

好了,一个简略的记事本程序就这样完成了。期望上面的内容能翻开你的思路!

打包布置

关于 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八戒 的荐书活动马上降临,为了鼓励大家多读书,所以会有免费送图书的名额哦!