1. 程式人生 > 其它 >基於tkinter的gui程式設計基礎學習筆記

基於tkinter的gui程式設計基礎學習筆記

基於tkinter的gui程式設計基礎學習筆記,做小軟體必備基礎知識

基於tkinter的gui程式設計基礎學習筆記

知識點程式碼,上傳百度網盤
專案一:記事本
專案二:畫圖軟體

記事本

from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
from tkinter.colorchooser import *


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # super()代表父類定義
        self.master = master
        self.pack()
        self.createWidget()

    def createWidget(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)

        # 新增選單項 accelerator(加速器,快捷鍵)
        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=70, height=22)
        self.textpad.pack()

        # 建立上下文選單,右鍵單擊出現的選單
        self.contextMenu = Menu(root)
        self.contextMenu.add_command(label='背景顏色', command=self.openAskColor)

        root.bind('<Button-3>', self.createContextMenu)

    def newfile(self):
        self.filename = asksaveasfilename(title='另存為', initialfile='未命名.txt', filetypes=[('文字文件', '.txt')],
                                          defaultextension='.txt')
        self.savefile()

    def openfile(self):
        self.textpad.delete(1.0, END)  # 清空text
        with askopenfile(title='開啟文字檔案', mode='r') as f:
            self.textpad.insert(INSERT, f.read())
            self.filename = f.name

    def savefile(self):
        with open(self.filename, 'w')as f:
            c = self.textpad.get(1.0, END)
            f.write(c)

    def exit(self):
        root.quit()

    def test(self):
        pass

    def openAskColor(self):
        s1 = askcolor(color='red',title='選擇背景顏色')
        self.textpad.config(bg=s1[1])

    # 在滑鼠位置顯示選單
    def createContextMenu(self, event):
        self.contextMenu.post(event.x_root, event.y_root)


if __name__ == '__main__':
    root = Tk()
    root.title('面相物件方法')
    root.geometry('500x300+500+300')
    app = Application(master=root)
    root.mainloop()

畫圖軟體

from tkinter.filedialog import *
from tkinter.colorchooser import *

win_width = 900
win_height = 450


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # super()代表父類定義
        self.master = master
        self.bgcolor = '#000000'
        self.x = 0
        self.y = 0
        self.fgcolor = '#ff0000'
        self.lastDraw = 0  # 表示最後繪製的圖形id
        self.startDrawFlag = False  # 是否第一次畫
        self.pack()
        self.createWidget()

    def createWidget(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_oval = Button(root, text='圓形', name='oval')
        btn_oval.pack(side='left', padx=10)
        btn_clear = Button(root, text='清屏', name='clear')
        btn_clear.pack(side='left', padx=10)
        btn_earsor = Button(root, text='橡皮擦', name='erasor')
        btn_earsor.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)

    def eventManager(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 == 'oval':
            self.drawpad.bind('<B1-Motion>', self.myOval)
        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='選擇畫筆顏色')
            self.fgcolor = c[1]

    def stopDraw(self, event):
        self.startDrawFlag = False
        self.lastDraw = 0

    def myline(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)

    def mylineArrow(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)

    def myRect(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)

    def myOval(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_oval(self.x, self.y, event.x, event.y, outline=self.fgcolor)

    def myPen(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
        self.x = event.x
        self.y = event.y

    def myErasor(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.drawpad.create_rectangle(event.x - 10, event.y - 10, event.x + 10, event.y + 10, fill=self.bgcolor)
        self.x = event.x
        self.y = event.y

    def kuaijiejian(self, event):
        print(event.char)
        if event.char == 'r':
            self.fgcolor = '#ff0000'
        if event.char == 'g':
            self.fgcolor = '#00ff00'
        if event.char == 'y':
            self.fgcolor = '#ffff00'


if __name__ == '__main__':
    root = Tk()
    root.title('畫圖軟體專案')
    root.geometry(str(win_width) + 'x' + str(win_height) + '+300+180')
    app = Application(master=root)
    root.mainloop()

``````python
from tkinter.filedialog import *
from tkinter.colorchooser import *

win_width = 900
win_height = 450


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # super()代表父類定義
        self.master = master
        self.bgcolor = '#000000'
        self.x = 0
        self.y = 0
        self.fgcolor = '#ff0000'
        self.lastDraw = 0  # 表示最後繪製的圖形id
        self.startDrawFlag = False  # 是否第一次畫
        self.pack()
        self.createWidget()

    def createWidget(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_oval = Button(root, text='圓形', name='oval')
        btn_oval.pack(side='left', padx=10)
        btn_clear = Button(root, text='清屏', name='clear')
        btn_clear.pack(side='left', padx=10)
        btn_earsor = Button(root, text='橡皮擦', name='erasor')
        btn_earsor.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)

    def eventManager(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 == 'oval':
            self.drawpad.bind('<B1-Motion>', self.myOval)
        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='選擇畫筆顏色')
            self.fgcolor = c[1]

    def stopDraw(self, event):
        self.startDrawFlag = False
        self.lastDraw = 0

    def myline(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)

    def mylineArrow(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)

    def myRect(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_rectangle(self.x, self.y, event.x, event.y, outline=self.fgcolor)

    def myOval(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.lastDraw = self.drawpad.create_oval(self.x, self.y, event.x, event.y, outline=self.fgcolor)

    def myPen(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)
        self.x = event.x
        self.y = event.y

    def myErasor(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        # self.lastDraw 表示最後繪製的圖形id
        self.drawpad.create_rectangle(event.x - 10, event.y - 10, event.x + 10, event.y + 10, fill=self.bgcolor)
        self.x = event.x
        self.y = event.y

    def kuaijiejian(self, event):
        print(event.char)
        if event.char == 'r':
            self.fgcolor = '#ff0000'
        if event.char == 'g':
            self.fgcolor = '#00ff00'
        if event.char == 'y':
            self.fgcolor = '#ffff00'


if __name__ == '__main__':
    root = Tk()
    root.title('畫圖軟體專案')
    root.geometry(str(win_width) + 'x' + str(win_height) + '+300+180')
    app = Application(master=root)
    root.mainloop()

學習程式碼

連結:https://pan.baidu.com/s/1WC5Se6MOMCfJSyDGMmBJrw

提取碼:3x1y

版權宣告:本文為博主原創文章,轉載請附上博文連結!