1.建立畫布
①畫布初始化
import tkinter
import tkinter.simpledialog
import tkinter.filedialog
import tkinter.colorchooser
app = tkinter.Tk()
app.title('My Paint')
app['width'] = 800
app['height'] = 600
#控制是否允許畫圖的變量,1:允許,0:不允許
yesno = tkinter.IntVar(value=0)
#控制畫圖類型的變量,1:曲線,2:直線,3:矩形,4:文本,5:橡皮
what = tkinter.IntVar(value=1)
#記錄滑鼠位置的變量
X = tkinter.IntVar(value=0)
Y = tkinter.IntVar(value=0)
#前景色
foreColor = '#000000'
backColor = '#FFFFFF'
#建立畫布
image = tkinter.PhotoImage()
canvas = tkinter.Canvas(app, bg=foreColor,width=800, height=600)
canvas.create_image(800, 600, image=image)
②添加操作
#滑鼠左鍵單擊,允許畫圖
def onLeftButtonDown(event):
yesno.set(1)
X.set(event.x)
Y.set(event.y)
if what.get()==4:
canvas.create_text(event.x, event.y, text=text)
canvas.bind('<Button-1>', onLeftButtonDown)
#記錄最後繪制圖形的id
lastDraw = 0
#按住滑鼠左鍵移動,畫圖
def onLeftButtonMove(event):
global lastDraw
if yesno.get()==0:
return
if what.get()==1:
#使用目前選擇的前景色繪制曲線
canvas.create_line(X.get(), Y.get(), event.x, event.y, fill=foreColor)
X.set(event.x)
Y.set(event.y)
elif what.get()==2:
#繪制直線,先删除剛剛畫過的直線,再畫一條新的直線
#global lastDraw
try:
canvas.delete(lastDraw)
except Exception as e:
pass
lastDraw = canvas.create_line(X.get(), Y.get(), event.x, event.y,
fill=foreColor)
elif what.get()==3:
#繪制矩形,先删除剛剛畫過的矩形,再畫一個新的矩形
#global lastDraw
try:
canvas.delete(lastDraw)
except Exception as e:
pass
lastDraw = canvas.create_rectangle(X.get(), Y.get(), event.x, event.y,
fill=backColor, outline=foreColor)
elif what.get()==5:
#橡皮,使用背景色填充10*10的矩形區域
canvas.create_rectangle(event.x-5, event.y-5, event.x+5, event.y+5,
outline=backColor, fill=backColor)
canvas.bind('<B1-Motion>', onLeftButtonMove)
#滑鼠左鍵擡起,不允許畫圖
def onLeftButtonUp(event):
if what.get()==2:
#繪制直線
canvas.create_line(X.get(), Y.get(), event.x, event.y, fill=foreColor)
elif what.get()==3:
#繪制矩形
canvas.create_rectangle(X.get(), Y.get(), event.x, event.y,fill=backColor, outline=foreColor)
yesno.set(0)
global lastDraw
lastDraw = 0
canvas.bind('<ButtonRelease-1>', onLeftButtonUp)
#建立菜單
menu = tkinter.Menu(app, tearoff=0)
#打開圖像檔案
def Open():
filename = tkinter.filedialog.askopenfilename(title='Open Image',filetypes=[('image', '*.jpg *.png *.gif')])
if filename:
global image
image = tkinter.PhotoImage(file=filename)
canvas.create_image(80, 80, image=image)
menu.add_command(label='Open', command=Open)
#添加菜單,清除
def Clear():
for item in canvas.find_all():
canvas.delete(item)
menu.add_command(label='Clear', command=Clear)
#添加分割線
menu.add_separator()
#建立子菜單,用來選擇繪圖類型
menuType = tkinter.Menu(menu, tearoff=0)
def drawCurve():
what.set(1)
print(what.get())
menuType.add_command(label='Curve', command=drawCurve)
def drawLine():
what.set(2)
menuType.add_command(label='Line', command=drawLine)
def drawRectangle():
what.set(3)
menuType.add_command(label='Rectangle', command=drawRectangle)
def drawText():
global text
text = tkinter.simpledialog.askstring(title='Input what you want to draw',prompt='')
what.set(4)
menuType.add_command(label='Text', command=drawText)
menuType.add_separator()
#選擇前景色
def chooseForeColor():
global foreColor
foreColor = tkinter.colorchooser.askcolor()[1]
menuType.add_command(label='Choose Foreground Color', command=chooseForeColor)
#選擇背景色
def chooseBackColor():
global backColor
backColor = tkinter.colorchooser.askcolor()[1]
menuType.add_command(label='Choose Background Color', command=chooseBackColor)
#橡皮
def onErase():
what.set(5)
menuType.add_command(label='Erase', command=onErase)
menu.add_cascade(label='Type', menu=menuType)
#滑鼠右鍵擡起,彈出菜單
def onRightButtonUp(event):
menu.post(event.x_root, event.y_root)
canvas.bind('<ButtonRelease-3>', onRightButtonUp)
canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
2.電子時鐘
①鬧鐘初始化
import tkinter
import threading
import datetime
import time
app = tkinter.Tk()
app.overrideredirect(True) #不顯示标題欄
app.attributes('-alpha', 0.9) #半透明
app.attributes('-topmost', 1) #總是在頂端
app.geometry('110x25+100+100') #初始大小與位置
labelDateTime = tkinter.Label(app)
labelDateTime.pack(fill=tkinter.BOTH, expand=tkinter.YES)
labelDateTime.configure(bg = 'gray')
X = tkinter.IntVar(value=0) #記錄滑鼠左鍵按下的位置
Y = tkinter.IntVar(value=0)
canMove = tkinter.IntVar(value=0) #視窗是否可拖動
still = tkinter.IntVar(value=1) #是否仍在運作
def onLeftButtonDown(event):
app.attributes('-alpha', 0.4) #開始拖動時增加透明度
X.set(event.x) #滑鼠左鍵按下,記錄目前位置
Y.set(event.y)
canMove.set(1) #并标記視窗可拖動
labelDateTime.bind('<Button-1>', onLeftButtonDown)
def onLeftButtonUp(event):
app.attributes('-alpha', 0.9) #停止拖動時恢複透明度
canMove.set(0) #滑鼠左鍵擡起,标記視窗不可拖動
labelDateTime.bind('<ButtonRelease-1>', onLeftButtonUp)
def onLeftButtonMove(event):
if canMove.get()==0:
return
newX = app.winfo_x()+(event.x-X.get())
newY = app.winfo_y()+(event.y-Y.get())
g = '110x25+'+str(newX)+'+'+str(newY)
app.geometry(g) #修改視窗的位置
labelDateTime.bind('<B1-Motion>', onLeftButtonMove)
def onRightButtonDown(event):
still.set(0)
t.join(0.2)
app.destroy() #關閉視窗
labelDateTime.bind('<Button-3>', onRightButtonDown)
def nowDateTime():
while still.get()==1:
now = datetime.datetime.now()
s = str(now.year)+'-'+str(now.month)+'-'+str(now.day)+' '
s = s+str(now.hour)+':'+str(now.minute)+':'+str(now.second)
labelDateTime['text'] = s #顯示目前時間
time.sleep(0.2)
t = threading.Thread(target=nowDateTime)
t.daemon = True
t.start()