当前位置: 欣欣网 > 码农

Python升级之路( Lv23 ) GUI图形界面编程(6)

2024-02-27码农

Python系列文章目录

第二十三章 GUI图形界面编程之GUI程序编写实践


  • Python系列文章目录

  • GUI程序编写实践

  • 记事本软件开发

  • 画图软件开发


  • 大家好, 我是了不起, 欢迎收看我的冒险之旅

    今天我们将深入学习图形界面编程tkinter, 学习GUI程序的编写

    GUI程序编写实践

    今日冒险片段上

    通过背部之后, 他们现在来到的是位于天帷巨兽前段脊椎部位的第一脊椎. 这里坐落着一个螺旋形远古神殿. 这座神殿历来都是GBK教的圣殿. 在教徒没有被控制之前, 历代教主都是在此居住, 并主持各种祭祀活动. 因此, 他们必须夺回此神殿.

    记事本软件开发

    结合所学 GUI 知识,开发一款模仿 windows 记事本的软件。包含了基本的功能:

    1. 新建文本文件

    2. 保存文件

    3. 修改文件内容

    4. 退出

    5. 各种快捷键处理 6. 修改文本区域背景色

    实操代码

    """
    结合所学 GUI 知识,开发一款模仿 windows 记事本的软件。包含了基本的功能:
    1. 新建文本文件
    2. 保存文件
    3. 修改文件内容
    4. 退出
    5. 各种快捷键处理
    6. 修改文本区域背景色
    """

    from tkinter import Frame, Tk, Menu, Text, INSERT, END
    from tkinter.filedialog import *
    from tkinter.colorchooser import *

    classApplication(Frame):
    def__init__(self, master=None):
    super(Application, self).__init__(master)
    self.master = master
    self.textPad = None# 文本框对象
    self.filename = None# 打开文件的名字
    self.contextMenu = None# 上下文菜单对象
    self.pack()
    self.createWidget()
    defcreateWidget(self):
    """在组件中创建主菜单"""
    menubar = Menu(root)
    """创建子菜单"""
    menuFile = Menu(menubar)
    menuEdit = Menu(menubar)
    menuHelp = Menu(menubar)
    """将子菜单放入主菜单栏"""
    menubar.add_cascade(label="文件(F)", menu=menuFile)
    menubar.add_cascade(label="编辑(E)", menu=menuEdit)
    menubar.add_cascade(label="帮助(H)", menu=menuHelp)
    """添加菜单项"""
    menuFile.add_command(label="新建", accelerator="ctrl+n", command=self.newfile)
    menuFile.add_command(label="打开", accelerator="ctrl+o", command=self.openfile)
    menuFile.add_command(label="保存", accelerator="ctrl+s", command=self.savefile)
    menuFile.add_separator() # 添加分割线
    menuFile.add_command(label="退出", accelerator="ctrl+q", command=self.exit)
    # 将主菜单栏加到根窗口
    root["menu"] = menubar
    # 添加快捷键事件处理
    root.bind("<Control-n>"lambda event: self.newfile())
    root.bind("<Control-o>"lambda event: self.openfile())
    root.bind("<Control-s>"lambda event: self.savefile())
    root.bind("<Control-q>"lambda event: self.exit())
    # 文本编辑区
    self.textpad = Text(root, width=50, height=30)
    self.textpad.pack()
    # 创建上下菜单
    self.contextMenu = Menu(root)
    self.contextMenu.add_command(label="背景颜色", command=self.openAskColor)
    # 为右键绑定事件
    root.bind("<Button-3>",self.createContextMenu)
    defnewfile(self):
    self.textpad.delete('1.0','end') # 把 Text 控件中的内容清空
    self.filename = asksaveasfilename(title='另存为', initialfile='未命名.txt', filetypes=[("文本文档""*.txt")], defaultextension='.txt')
    print(self.filename)
    self.savefile()
    defopenfile(self):
    self.textpad.delete('1.0','end') # 先把 Text 控件中的内容清空
    with askopenfile(title="打开文件"as f:
    self.textpad.insert(INSERT, f.read())
    self.filename = f.name
    print(f.name)
    defsavefile(self):
    with open(self.filename, "w"as f:
    c = self.textpad.get(1.0, END)
    f.write(c)
    defexit(self):
    root.quit()
    defopenAskColor(self):
    s1 = askcolor(color="red", title="选择背景色")
    self.textpad.config(bg=s1[1])
    defcreateContextMenu(self, event):# 菜单在鼠标右键单击的坐标处显示
    self.contextMenu.post(event.x_root, event.y_root)

    if __name__ == '__main__':
    root = Tk()
    root.geometry("450x300+200+300")
    root.title("最初的记事本")
    app = Application(root)
    root.mainloop()







    将 python 程序打包成 exe 文件

    1. 安装 pyinstaller 模块 在 pycharm 中操作: file-->setting-->Project:xxx -->Project interpretor ,再点击+ (加号)

      在新弹窗中输入要下载的第三方模块, 然后点击该模块, 最后点击左下角安装即可

    2. 在 pycharm 的 Terminal 终端输入如下命令: pyinstaller -F xxxx.py 需要进入到当前模块所在目录下

      注意: pyinstaller相关参数如下: 
      --icon=图标路径(pyinstaller 
      -F --icon=my.ico XXXX.py) 
      -F 打包成一个 exe 文件 
      -w 使用窗口,无控制台 
      -c 使用控制台,无窗口 
      -D 创建一个目录,里面包含 exe 以及其他一些依赖性文件

    3. 在项目的 dist 目录下可以看到生成了 exe 文件,直接在 windows 系统中使用即可

    画图软件开发

    开发一款简单的画图软件, 包含如下功能:

    1. 画笔

    2. 矩形/椭圆绘制

    3. 清屏

    4. 橡皮擦

    5. 直线/带箭头的直线

    6. 修改画笔颜色、背景颜色

    实操代码

    """开发绘图软件的菜单"""
    from tkinter import Frame, Canvas, Tk, Button, LAST
    from tkinter.colorchooser import *
    # 窗口的宽度和高度
    win_width = 900
    win_height = 450

    classApplication(Frame):
    def__init__(self, master=None, bgcolor="#000000"):
    super(Application, self).__init__(master)
    self.master = master
    self.bgcolor = bgcolor
    self.x = 0
    self.y = 0
    self.fgcolor = "#ff0000"
    self.lastDraw = 0
    self.startDrawFlag = False
    self.pack()
    self.createWidget()
    defcreateWidget(self):
    # 创建绘图区
    self.drawpad = Canvas(root, width=win_width, height=win_height * 0.9, bg=self.bgcolor)
    self.drawpad.pack()
    # 创建按钮
    btn_start = Button(root, text="开始", name="start")
    btn_start.pack(side="left", padx="10")
    btn_pen = Button(root, text="画笔", name="pen")
    btn_pen.pack(side="left", padx="10")
    btn_rect = Button(root, text="矩形", name="rect")
    btn_rect.pack(side="left", padx="10")
    btn_clear = Button(root, text="清屏", name="clear")
    btn_clear.pack(side="left", padx="10")
    btn_erasor = Button(root, text="橡皮擦", name="erasor")
    btn_erasor.pack(side="left", padx="10")
    btn_line = Button(root, text="直线", name="line")
    btn_line.pack(side="left", padx="10")
    btn_lineArrow = Button(root, text="箭头直线", name="lineArrow")
    btn_lineArrow.pack(side="left", padx="10")
    btn_color = Button(root, text="颜色", name="color")
    btn_color.pack(side="left", padx="10")
    # 事件处理
    btn_pen.bind_ class("Button""<1>", self.eventManager)
    self.drawpad.bind("<ButtonRelease-1>", self.stopDraw)
    # 增加颜色切换的快捷键
    root.bind("<KeyPress-r>", self.kuaijiejian)
    root.bind("<KeyPress-g>", self.kuaijiejian)
    root.bind("<KeyPress-y>", self.kuaijiejian)
    defeventManager(self, event):
    name = event.widget.winfo_name()
    # print(name)
    if name == "line":
    self.drawpad.bind("<B1-Motion>", self.myline)
    elif name == "lineArrow":
    self.drawpad.bind("<B1-Motion>", self.mylineArrow)
    elif name == "rect":
    self.drawpad.bind("<B1-Motion>", self.myRect)
    elif name == "pen":
    self.drawpad.bind("<B1-Motion>", self.myPen)
    elif name == "erasor":
    self.drawpad.bind("<B1-Motion>", self.myErasor)
    elif name == "clear":
    self.drawpad.delete("all")
    elif name == "color":
    c = askcolor(color=self.fgcolor, title="选择画笔颜色")
    # [(255,0,0),"#ff0000"]
    self.fgcolor = c[1]
    defstopDraw(self, event):
    self.startDrawFlag = False
    self.lastDraw = 0
    defstartDraw(self, event):
    self.drawpad.delete(self.lastDraw)
    ifnot self.startDrawFlag:
    self.startDrawFlag = True
    self.x = event.x
    self.y = event.y
    defmyline(self, event):
    self.startDraw(event)
    self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
    defmylineArrow(self, event):
    self.startDraw(event)
    self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)
    defmyRect(self, event):
    self.startDraw(event)
    self.lastDraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)
    defmyPen(self, event):
    self.startDraw(event)
    self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
    self.x = event.x
    self.y = event.y
    defmyErasor(self, event):
    self.startDraw(event)
    self.drawpad.create_rectangle(event.x - 4, event.y - 4, event.x + 4, event.y + 4, fill=self.bgcolor)
    self.x = event.x
    self.y = event.y
    defkuaijiejian(self, event):
    if event.char == "r":
    self.fgcolor = "#ff0000"
    elif event.char == "g":
    self.fgcolor = "#00ff00"
    elif event.char == "y":
    self.fgcolor = "#ffff00"

    if __name__ == "__main__":
    root = Tk()
    root.geometry(str(win_width) + "x" + str(win_height) + "+200+300")
    root.title("你的画图软件")
    app = Application(root)
    root.mainloop()














    将 python 程序打包成 exe 文件

    打包步骤同上面笔记本打包步骤一致, 但需注意如果使用 pyinstaller -F paint_release.py 进行打包, 打包后的程序在运行后会启动一个命令行界面. 因此我们可以在打包时添加 -w , 即 pyinstaller -F -w paint_release.py 通过这种命令打包后, 运行程序时便不会同时打包命令行/控制台

    今日冒险片段下

    进入第一脊椎区域, 这篇区域的怪物明显多了很多. 了不起以及伙伴们也感受到了前方的凶险. 至此, gbk教的强者们也不藏着掖着了, 合力召唤出了精灵王伊莎贝拉的虚影. 这是一种通过吸收召唤者魔力的来将远在异空间的强者精神体召唤出来的技能, 精神体的强弱取决于被召唤者的人数以及魔力水平. 但唯一遗憾的是, 召唤的人必须是gbk教的人. 但仅仅是这样, 这个精灵王的投影便展现出极其强大的力量. 光暗冰火四种属性手到擒来, 而且还有压制领主能力的效果. 就这样, 了不起几乎没费多大力气, 就消灭了吞噬信徒们的黑章鱼, 等级也顺利升至lv24, 在此期间了不起顺势回复体力, 为后面即将到来的恶战做准备.


    Sora最近老火了,Sora 的出现会对短视频、广告、游戏、影视行业等产业格局一定会被重塑,目前 Sora 还没正式开放注册,大家看到的使用体验大部分都来自官网,或者少部分的用户分享。

    为了避免更多读者受骗,我们直接给大家整了一个免费的。

    注意是下面【 Python都知道 】公众号,不是本公众号,点击下方的公众号卡片,然后回复【 sora ,即可获取最新 Sora 的最全资料。


    目前已经分享了,如何申请 Sora 的内测,以及最新关于 Sora 的技术特点,使用教程、变现机遇等等。

    大家如果想领取这份资料,可以点击下方的公众号卡片,然后回复 sora ,即可获取最新 Sora 的最全资料。

    需要提醒大家的是,Sora 目前还没有完全开放,任何市面上付费的一些课程,都请大家谨慎选择。

    可以确定的是:未来 10-20年,一定是 AI 的大风口、大时代,如果错过了公众号、错过了抖音、错过了小红书。

    请一定不要错过 AI +。

    面对浪潮,恐惧只会让我们伫立在原地,被巨浪吞噬。

    要去主动适应它,不被恐惧束缚,动起胳膊动起脚,才不会被淘汰。

    注意是下面【 Python都知道 】公众号,不是本公众号,点击下方的公众号卡片,然后回复 【 sora ,即可获取最新 Sora 的最全资料。