用tkinter的canvas实现物体简单移动

通过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()
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的tkinter库的canvas组件来实现图片裁剪。以下是一个基本的示例代码: ```python import tkinter as tk from PIL import Image, ImageTk class ImageCropper: def __init__(self, image_path): self.root = tk.Tk() self.canvas = tk.Canvas(self.root, width=500, height=500) self.canvas.pack() self.image = Image.open(image_path) self.tk_image = ImageTk.PhotoImage(self.image) self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image) self.rect = None self.start_x = None self.start_y = None self.end_x = None self.end_y = None self.canvas.bind("<Button-1>", self.on_button_press) self.canvas.bind("<B1-Motion>", self.on_move_press) self.canvas.bind("<ButtonRelease-1>", self.on_button_release) self.root.mainloop() def on_button_press(self, event): self.start_x = event.x self.start_y = event.y if not self.rect: self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, 1, 1, outline='red', width=3) def on_move_press(self, event): if self.rect: self.end_x = event.x self.end_y = event.y self.canvas.coords(self.rect, self.start_x, self.start_y, self.end_x, self.end_y) def on_button_release(self, event): if self.rect: self.image = self.image.crop((self.start_x, self.start_y, self.end_x, self.end_y)) self.tk_image = ImageTk.PhotoImage(self.image) self.canvas.delete(self.rect) self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image) if __name__ == '__main__': cropper = ImageCropper('image.jpg') ``` 在这个示例代码中,我们首先创建了一个名为ImageCropper的类,它接收一个图像路径作为参数。我们创建了一个tkintercanvas组件,并将图像加载到canvas中。 我们还定义了一个on_button_press方法,用于在鼠标左键按下时创建一个矩形。on_move_press方法用于跟踪鼠标移动,从而更新矩形的位置和大小。最后,on_button_release方法用于在鼠标释放时裁剪图像,删除矩形并更新canvas中的图像。 在main函数中,我们实例化ImageCropper类并传递要裁剪的图像路径。运行程序后,我们可以使用鼠标选择要裁剪的区域,然后按下鼠标左键并拖动以选择区域。释放鼠标左键后,程序将裁剪图像并更新canvas中的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值