Python Tkinter:作为滑块的迷你画布窗口

Python Tkinter:作为滑块的迷你画布窗口,python,tkinter,canvas,Python,Tkinter,Canvas,我是新来的。我想用光标和一个小窗口控制图像的移动: 我尝试了这段代码,但结果并不是我想要的 import tkinter as tk from io import BytesIO import requests from PIL import Image , ImageTk def full_dimensions(imag_fs): top = tk.Toplevel(root) img = tk.Label(top, image=imag_fs) img.pack

我是新来的。我想用光标和一个小窗口控制图像的移动:

我尝试了这段代码,但结果并不是我想要的

import tkinter as tk
from io import BytesIO
import requests
from PIL import Image , ImageTk


def full_dimensions(imag_fs):
    top = tk.Toplevel(root)
    img = tk.Label(top, image=imag_fs)
    img.pack()


def get_image():
    _url = 'https://i.imgur.com/4m7AHVu.gif'
    _img = requests.get(_url)
    if _img.status_code == 200:
        _content = BytesIO(_img.content)
    else:
        _content = 'error.gif'
    print('image loaded')
    return _content


root = tk.Tk()

_content =  get_image()   
_x = Image.open(_content)
imag_fs = ImageTk.PhotoImage(_x)
_x.thumbnail((100, 100), Image.ANTIALIAS)

imag = ImageTk.PhotoImage(_x)
img = tk.Button(root, image=imag, command=lambda: full_dimensions(imag_fs))
img.grid(column=3, row=1)

root.mainloop()
我测试了一个窗口,但当我导入一个图像时,我无法控制它

import tkinter as tk

main_window = tk.Tk()


def check_hand_enter():
    canvas.config(cursor="hand1")


def check_hand_leave():
    canvas.config(cursor="")


canvas = tk.Canvas(width=200, height=200)
tag_name = "polygon"

canvas.create_polygon((25, 25), (25, 100), (125, 100), (125, 25), outline='black', fill="", tag=tag_name)

canvas.tag_bind(tag_name, "<Enter>", lambda event: check_hand_enter())
canvas.tag_bind(tag_name, "<Leave>", lambda event: check_hand_leave())

canvas.pack()
main_window.mainloop()
将tkinter作为tk导入
主窗口=tk.tk()
def check_hand_enter():
canvas.config(cursor=“hand1”)
def检查手离开()
canvas.config(cursor=”“)
canvas=tk.canvas(宽度=200,高度=200)
tag_name=“多边形”
画布。创建多边形((25,25)、(25,100)、(125,100)、(125,25),outline='black',fill=,tag=tag\u name)
canvas.tag\u bind(tag\u name,“,lambda事件:check\u hand\u enter())
canvas.tag\u bind(tag\u name,“,lambda事件:check\u hand\u leave())
canvas.pack()
main_window.mainloop()

下面是我如何做到这一点的(一个简单的例子):

#导入所有必要的模块和类
从tkinter导入Tk、画布、框架
从PIL导入图像,ImageTk
导入请求
#检查文件是否存在,如果不存在请下载,如果无法下载,请退出程序
尝试:
open('space.jpg')
除FileNotFoundError外:
url='1〕https://images5.alphacoders.com/866/866360.jpg'
img=requests.get(url)
如果img.status_code==200:
以open('space.jpg','wb')作为文件:
file.write(img.content)
打印('未找到文件。已下载必要的文件')
其他:
打印('未找到文件。无法下载必要的文件')
退出()
类可移动图像(帧):
定义初始化(自身,父级):
帧。\uuuu初始化(自,父)
self.parent=parent
#存储运动信息的字典
self.start_coords={'x':0,'y':0,'move':False}
#存储运动信息的字典
self.start\u coords\u main={'x':0,'y':0,'move':False}
#加载图像
self.image=image.open('space.jpg')
#将图像设置为其相应的变量,以便以后可以引用它们
#调整较小图像的大小以适应导航窗口
self.main_image=ImageTk.PhotoImage(self.image)
self.nav_image=ImageTk.PhotoImage(self.image.resize((200100),image.antialas))
#创建画布以存储较大的图像
self.main_canvas=canvas(self,宽度=700,高度=500,高亮厚度=0)
self.main_canvas.pack()
#将图像放在画布上
self.main\u image\u id=self.main\u canvas.create\u image((0,0),image=self.main\u image,anchor='nw',tags='main\u image')
#创建用于导航的较小画布
self.nav_canvas=canvas(self.main_canvas,宽度=200,高度=100,高光厚度=0)
#将较小的画布作为窗口添加到主画布
self.main_canvas.create_window((500400),window=self.nav_canvas,anchor='nw',tags='nav_canvas')
#将调整大小的图像添加到导航画布
self.nav_canvas.create_image((0,0),image=self.nav_image,anchor='nw')
#创建一个矩形以指示图像的当前视图
self.nav_box=self.nav_canvas.create_矩形((0,0,70,50),outline='white'))
#绑定函数
self.main\u canvas.bind(“”,self.set\u start\u coords\u main)
self.main\u canvas.bind(“”,self.move\u coords\u main)
#绑定函数
self.nav\u canvas.bind(“”,self.set\u start\u coords)
self.nav_canvas.bind(“”,self.move_coords)
#函数用于设置起始坐标,以便以后可以引用它们,还可以设置框是否可以移动
def设置\启动\协调(自身、事件):
x1,y1,x2,y2=自导航画布坐标(自导航框)
如果x1200:
x=130
如果y<0:
y=0
如果y+50>100:
y=50
self.nav_canvas.coords(self.nav_框,x,y,x+70,y+50)
self.main\u canvas.coords(self.main\u image\u id,-x*10,-y*10)
#函数用于设置起始坐标,以便以后可以引用它们,还可以设置框是否可以移动
def set_start_coords_main(自身、事件):
x1,y1,x2,y2=self.main\u canvas.bbox('main\u image'))
如果x10:
x=0
如果y<-500:
y=-500
如果y>0:
y=0
自导航画布坐标(自导航框,-x/10,-y/10,-x/10+70,-y/10+50)
self.main\u canvas.coords(self.main\u image\u id,x,y)
#基本Tk()实例,然后是root.mainloop()
root=Tk()
MovableImage(root.pack)()
#主回路
root.mainloop()