python - Python中的放大和缩小功能
问题描述
我正在尝试在 python 中使用放大、缩小功能。我之前曾尝试使用该功能在海龟、画布等中放大一条线,但似乎没有任何效果,而不是缩放,代码要么增加或减少线的长度。我想放大该行以在该行上添加文本,以便当用户放大该行时,他/她可以看到文本。这是我要更改的代码。
from tkinter import *
root = Tk()
Label(root).pack()
canvas = Canvas(root, width=400, height=400)
canvas.pack(fill=BOTH, expand=1)
widget = Button(None, text='zoomin-out')
widget.pack()
canvas.create_line(175,175,225,225)
def zoomin(event):
d = event.delta
if d < 0:
amt=0.9
else:
amt=1.1
canvas.scale(ALL, 200,200, amt, amt)
widget.bind('<Button-1>', zoomin)
def zoomout(event):
d = event.delta
if d >0:
amt=1.1
else:
amt=0.7
canvas.scale(ALL, 200,200 , amt, amt)
widget.bind('<Double-1>', zoomout)
widget.mainloop()
root.mainloop()
解决方案
有两个问题。首先,当您将Button-1
和Double-1
事件添加到 Button 小部件时,双击会触发这两个事件。它们最终相互抵消,因此只有单击才能按预期工作。
其次,正如我在这个 SO answer中指出的那样,某些元素(如文本)不会缩放,它们将保持固定。您需要手动缩放字体以模拟文本缩放。
下面是按照上述代码对您的代码进行的修改。而不是有问题的单击和双击,我已经对其进行了更改,以便在按钮上的左键和右键单击导致画布放大或缩小:
from tkinter import *
EXAMPLE_TEXT = "Left or Right click button to zoom in/out"
FONT_NAME = "Helvetica"
font_size = 12
def zoom(amount):
global font_size
canvas.scale(ALL, 200, 200, amount, amount)
font_size *= amount
canvas.itemconfigure(text_item, font=(FONT_NAME, int(font_size)))
root = Tk()
canvas = Canvas(root, width=400, height=400)
canvas.pack(fill=BOTH, expand=1)
text_item = canvas.create_text(200, 200, font=(FONT_NAME, font_size), text=EXAMPLE_TEXT)
canvas.create_oval(50, 50, 350, 350)
widget = Button(root, text='zoom in/out')
widget.pack()
widget.bind('<Button-1>', lambda e: zoom(1.1))
widget.bind('<Button-2>', lambda e: zoom(0.7))
root.mainloop()
如果您注释掉以 开头的行canvas.itemconfigure(...)
,您会看到圆圈继续放大和缩小,但文本保持固定大小。
推荐阅读
- python - psycopg2 - UndefinedColumn:关系的列“日期时间”“
“ 不存在 - algorithm - 在不接触阴影正方形的情况下通过网格
- python - 如何从serializer.data Django Rest Framework返回空查询集
- python-3.x - 在嵌套字典中循环
- html - WooCommerce 热收据打印显示 HTML 标签
- reactjs - 在 React 中使用 If 语句
- amazon-web-services - ECS Fargate 在从 SQS 接收消息时如何在可用任务之间分配流量?
- php - 如何覆盖 function.php 中的 WooCommerce 总运费?
- javascript - 如何在 iframe 中提醒而不在 iframe 之外放置代码?
- java - findFragmentById 是否接受 FrameLayout 而不是 Fragment?