當前位置: 妍妍網 > 碼農

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 的最全資料。