gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:46:30 24 4
gpt4 key购买 nike

我正在Python中使用 turtle 图形做一些简单的分形绘图,并且遇到了 turtle 绘制超出应用程序框架的情况。 我希望能够在窗口内拖动 View ,以便将其置于我正在绘制的分形的不同部分的中心,或者放大或缩小以操作 View 。

Python 有这样的模块吗?我对 python 比较陌生,因为我主要使用 Java 进行编程,并且可以想到很多使用 Java 和 JFrame 等的方法。我对简单 python 实现的研究没有结果:(并且我不想重新发明轮子,如果有一个简单的解决方案可用〜尽管如此,所有方法都值得赞赏。如果我错过了此网站上回答我的问题的另一个线程,请发表评论。

这是我的分形代码,供感兴趣的人使用。

import turtle

t = turtle.Turtle()
t.color("white")
t.backward(450)
t.color("red")

def f2(length, depth):
if depth == 0:
t.forward(length)
else:
f2(length/2, depth -1)
t.left(135)
f2(length/8, depth -1)
t.right(90)
f2(length/8, depth -1)
t.right(90)
f2(length/8, depth -1)
t.right(90)
f2(length/8, depth -1)
t.left(135)
f2(length/2, depth -1)


f2(400, 4)

最佳答案

有几种方法可以做到这一点,我不久前有需要,不幸的是我认为没有一种非常简单的方法。但您可以使用以下方法显式设置 Canvas 的大小(如果大于显示的大小,则会添加滚动条):

screen.screensize(width, height)

这通常作用于 turtle 屏幕而不是 turtle 本身,因此要获取屏幕,您需要调用:

t.getscreen()

有一种更复杂但更有效的方法,您可以对 turtle 进行子类化以跟踪其边界框(每个轴中行驶到的最远点),然后根据该方法更新屏幕尺寸,但它更受喜爱,我如果询问,将发布详细信息。

编辑:添加子类化方法的详细信息首先,我们对 turtle 进行子类化,使其具有一个名为 bbox 的属性,这是一个列表,每次我们移动 turtle 时都会更新该列表。

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()

然后我们创建一个 Canvas 供 turtle 进行操作:

cv = turtle.ScrolledCanvas(root)

然后我们将 Canvas 变成 turtle 屏:

screen = turtle.TurtleScreen(cv)

我们在屏幕上创建一只 turtle :

turt = MyTurtle(screen)

现在 turtle 可以像普通 turtle 一样使用(移动、颜色、形状、速度等)如果 turtle 超出了屏幕范围,您可以调用:

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 应用于 Canvas 本身,则可以使其仅围绕 Canvas 上的项目调整大小。

关于python - 如何在 python 窗口应用程序中实现拖动功能(或缩放)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29276229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com