基於tkinter的gui程式設計基礎學習筆記
阿新 • • 發佈:2021-07-19
基於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
版權宣告:本文為博主原創文章,轉載請附上博文連結!