通过python的tkinter实现canvas简单移动
实验任务:用多个按钮或者按钮+文本框实现不同物体(椭圆,长方形,扇形,线条)的各个方向的运动(东西南北)
代码
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('my window')
##窗口尺寸
window.geometry('400x350')
#新建画布
canvas=tk.Canvas(window,bg='blue',height=200,width=400)
#画线
x0,y0,x1,y1=60,60,90,90
line=canvas.create_line(x0,y0,x1,y1,fill="yellow")
#画⚪
oval=canvas.create_oval(x0,y0,x1,y1,fill='red')
#画一个扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90,fill="yellow")
#画一个矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20,fill="green")
canvas.pack()
dict = {"0":oval,"1":arc,"2":rect,"3":line}
def moveitdown():
pic = dict.get(choose_string.get())
length = choose_place.get()
if pic and length:
length = int(length)
canvas.move(pic,0,length)
else:
tk.messagebox.showerror(message='错误!请输入长度和图形!')
def moveitleft():
pic = dict.get(choose_string.get())
length = choose_place.get()
if pic and length:
length = int(length)
canvas.move(pic,-length,0)
else:
tk.messagebox.showerror(message='错误!请输入长度和图形!')
def moveitright():
pic = dict.get(choose_string.get())
length = choose_place.get()
if pic and length:
length = int(length)
canvas.move(pic,length,0)
else:
tk.messagebox.showerror(message='错误!请输入长度和图形!')
def moveitup():
pic = dict.get(choose_string.get())
length = choose_place.get()
if pic and length:
length = int(length)
canvas.move(pic,0,-length)
else:
tk.messagebox.showerror(message='错误!请输入长度和图形!')
#创建一个Button
tk.Label(window,text='圆(0),扇形(1),矩形(2),线条(3)').place(x=10,y=210)
tk.Label(window,text="请输入你想要选择的图形:").place(x=10,y=235)
choose_string = tk.StringVar(master=window)
choose_entry = tk.Entry(window, textvariable=choose_string,width=3)
choose_entry.place(x=170,y=235)
tk.Label(window,text='请输入你要移动的距离(px):').place(x=10,y=260)
choose_place = tk.StringVar(master=window)
length_entry = tk.Entry(window, textvariable=choose_place,width=5)
length_entry.place(x=170,y=260)
down=tk.Button(window,text='向下移动',command=moveitdown)
down.place(x=30,y=290)
l=tk.Button(window,text='向左移动',command=moveitleft)
l.place(x=100,y=290)
r=tk.Button(window,text='向右移动',command=moveitright)
r.place(x=170,y=290)
up=tk.Button(window,text='向上移动',command=moveitup)
up.place(x=240,y=290)
##显示出来
window.mainloop()
改进
将多个movieit函数合并为一个,将entry改为listbox,将键盘操作AWSD实现上下左右移动绑定到函数moveit。
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('my window')
##窗口尺寸
window.geometry('400x500')
#新建画布
canvas=tk.Canvas(window,bg='blue',height=200,width=400)
#画线
x0,y0,x1,y1=60,60,90,90
line=canvas.create_line(x0,y0,x1,y1,fill="yellow")
#画⚪
oval=canvas.create_oval(x0,y0,x1*2,y1*2,fill='red')
#画一个扇形
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90,fill="yellow")
#画一个矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20,fill="green")
canvas.pack()
dict = {'圆形':oval,'扇形':arc,'矩形':rect,'线条':line}
def moveit(event,num,length):
pic = list.curselection()
if length == '':
print("length为空")
choose_place.set("3")
length = "3"
if pic:
pic = dict.get(list.get(pic))
length = int(length)
if num==1: #1代表下移
canvas.move(pic, 0, length)
elif num==2: #2代表左移
canvas.move(pic, -length, 0)
elif num==3: #3代表右移
canvas.move(pic, length,0)
elif num==4: #4代表上移
canvas.move(pic, 0, -length)
else:
tk.messagebox.showerror(message='错误!请选择图形!')
# 选择图形
tk.Label(window,text="请输入你想要选择的图形:").place(x=10,y=220)
list = tk.Listbox(window,selectmode=tk.BROWSE)
for key in dict:
list.insert("end", key)
list.place(x=10,y=250)
# 选择距离,默认3
tk.Label(window,text='请输入你要一次性移动的距离(px):').place(x=160,y=220)
choose_place = tk.StringVar()
choose_place.set("3")
length_entry = tk.Entry(window, textvariable=choose_place,width=4)
length_entry.place(x=350,y=220)
# 实现上下左右移动手动按键
down=tk.Button(window,text='向下移动',command=lambda: moveit(window,1,choose_place.get()))
down.place(x=250,y=350)
l=tk.Button(window,text='向左移动',command=lambda: moveit(window,2,choose_place.get()))
l.place(x=170,y= 325)
r=tk.Button(window,text='向右移动',command=lambda: moveit(window,3,choose_place.get()))
r.place(x=330,y=325)
up=tk.Button(window,text='向上移动',command=lambda: moveit(window,4,choose_place.get()))
up.place(x=250,y=290)
# 实现键盘操作绑定
window.bind("<KeyPress-s>", lambda event:moveit(event, num=1, length=choose_place.get()))
window.bind("<KeyPress-a>", lambda event:moveit(event, num=2, length=choose_place.get()))
window.bind("<KeyPress-d>", lambda event:moveit(event, num=3, length=choose_place.get()))
window.bind("<KeyPress-w>",lambda event:moveit(event, num=4, length=choose_place.get()))
window.mainloop()