python 视频播放 拖动_如何在python窗口应用程序中实现拖动功能(或缩放)?

本文介绍了如何在Python的海龟画图中实现拖动和缩放功能。通过子类化turtle RawTurtle,创建了一个带有bbox属性的MyTurtle类,实时更新边界框。当海龟移动超出屏幕范围时,根据bbox调整屏幕大小,从而实现拖动和自适应缩放的效果。
摘要由CSDN通过智能技术生成

有几种方法可以做到这一点,我有需要前一段时间,不幸的是,我不认为有一个非常简单的方法。但是,可以使用以下命令显式设置画布的大小(如果画布大于所示大小,则会添加滚动条):screen.screensize(width, height)

这通常作用于海龟屏幕而不是海龟本身,因此要获得屏幕,您需要调用:t.getscreen()

有一种更复杂但更有效的方法,你可以将海龟分为子类来跟踪它的边界框(在每个轴上移动到的最远点),然后根据它更新屏幕大小,但它的投资更多,如果有人问我,我会发布详细信息。

编辑:添加子类化方法的详细信息

首先我们对海龟进行子类化,这样它就有一个名为bbox的属性,这是一个列表,每次我们移动海龟时都会更新它。class MyTurtle(turtle.RawTurtle): # here we subclass the turtle to allow us to call statusbar updates after each movement

def __init__(self, canvas):

turtle.RawTurtle.__init__(self, canvas)

self.bbox = [0,0,0,0]

def _update_bbox(self): # keep a record of the furthers points visited

pos = self.position()

if pos[0] < self.bbox[0]:

self.bbox[0] = pos[0]

elif pos[0] > self.bbox[2]:

self.bbox[2] = pos[0]

if pos[1] < self.bbox[1]:

self.bbox[1] = pos[1]

elif pos[1] > self.bbox[3]:

self.bbox[3] = pos[1]

def forward(self, *args):

turtle.RawTurtle.forward(self, *args)

self._update_bbox()

def backward(self, *args):

turtle.RawTurtle.backward(self, *args)

self._update_bbox()

def right(self, *args):

turtle.RawTurtle.right(self, *args)

self._update_bbox()

def left(self, *args):

turtle.RawTurtle.left(self, *args)

self._update_bbox()

def goto(self, *args):

turtle.RawTurtle.goto(self, *args)

self._update_bbox()

def setx(self, *args):

turtle.RawTurtle.setx(self, *args)

self._update_bbox()

def sety(self, *args):

turtle.RawTurtle.sety(self, *args)

self._update_bbox()

def setheading(self, *args):

turtle.RawTurtle.setheading(self, *args)

self._update_bbox()

def home(self, *args):

turtle.RawTurtle.home(self, *args)

self._update_bbox()

然后我们为海龟制作一张画布:cv = turtle.ScrolledCanvas(root)

然后我们把画布变成一个高领毛衣:screen = turtle.TurtleScreen(cv)

我们在屏幕上创建一个海龟:turt = MyTurtle(screen)

现在乌龟可以作为普通乌龟使用(移动、颜色、形状、速度等)

如果乌龟超出了屏幕的界限,你可以调用:min_x, min_y, max_x, max_y = turt.bbox # get the furthest points the turtle has been

width = max((0-min_x),(max_x)) * 2 + 100 # work out what the maximum distance from 0,0 is for each axis

height = max((0-min_y),(max_y)) * 2 + 100 # the 100 here gives us some padding between the edge and whats drawn

screen.screensize(width, height)

请注意,上面的代码对源代码的重新调整大小与screen方法所允许的大小相同,但是,如果深入研究并将bbox应用于画布本身,则可以使其仅围绕画布上的项重新调整大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值