如何在 tkinter 画布中将多个对象移动到一起? [复制]

2024-06-25

我试图用鼠标拖放在画布上移动一些带有文本的矩形。我使用 find_overlapping 选择要移动的矩形。这意味着最初作为类对象 Rect 的一部分创建的文本不会移动。有没有办法修改我的代码以移动类对象中的所有对象,或者使用 find_overlapping 查找类对象 ID?

矩形上的文本可以相同,如示例所示。用随机标签标记类对象中的所有元素以将它们分组在一起是我的第一个想法,但使用 find_ovelapping 检索此类标签信息并不成功。

import tkinter as tk

root=tk.Tk()
PAB=tk.Canvas(width=400, height=400)

#checks if a certain canvas object has a certain tag
def hastag(tag, id):
    if any(tag in i for i in PAB.gettags(id)):return True
    else:return False


class Rect:
    def __init__(self, x1, y1, name):
        rec = PAB.create_rectangle(x1,y1,x1+40,y1+40, fill='#c0c0c0', tag=('movable', name))
        text = PAB.create_text(x1+20,y1+20, text=name)
#mouse click find object to move
def get_it(event):
    delta=5
    global cur_rec
    for i in PAB.find_overlapping(event.x-delta, event.y-delta, event.x+delta, event.y-delta):
        if hastag('movable', i):
            cur_rec = i
    
PAB.bind('<Button-1>', get_it)

#mouse movement moves object
def move_it(event):
    xPos, yPos = event.x, event.y
    xObject, yObject = PAB.coords(cur_rec)[0],PAB.coords(cur_rec)[1]
    PAB.move(cur_rec, xPos-xObject, yPos-yObject)
PAB.bind('<B1-Motion>', move_it)

#test rects
bob = Rect(20,20,'Bob')
rob = Rect(80,80,'Rob')
different_bob = Rect(160,160,'Bob')

PAB.pack()
root.mainloop()

谢谢。如果需要任何澄清,我很乐意提供帮助。


更好的方法是对要一起移动的所有项目使用相同的标签,因此在您的情况下,矩形和文本必须具有相同的标签。

import tkinter as tk

root=tk.Tk()
PAB=tk.Canvas(width=400, height=400, bg="gray")

class Rect:
    def __init__(self, x1, y1, name):

        tag = f"movable{id(self)}"
        rec = PAB.create_rectangle(x1,y1,x1+40,y1+40, fill='#c0c0c0', tag=(tag, ))
        text = PAB.create_text(x1+20,y1+20, text=name, tag=(tag,))

def in_bbox(event, item):  # checks if the mouse click is inside the item
    bbox = PAB.bbox(item)

    return bbox[0] < event.x < bbox[2] and bbox[1] < event.y < bbox[3]
    
#mouse click find object to move
def get_it(event):
    delta=5
    global cur_rec
    cur_rec = PAB.find_closest(event.x, event.y)  # returns the closest object

    if not in_bbox(event, cur_rec):  # if its not in bbox then sets current_rec as None
        cur_rec = None

#mouse movement moves object
def move_it(event):
    if cur_rec:
        xPos, yPos = event.x, event.y
        xObject, yObject = PAB.coords(cur_rec)[0],PAB.coords(cur_rec)[1]
                
        PAB.move(PAB.gettags(cur_rec)[0], xPos-xObject, yPos-yObject) 

PAB.bind('<Button-1>', get_it)
PAB.bind('<B1-Motion>', move_it)
#test rects
bob = Rect(20,20,'Bob')
rob = Rect(80,80,'Rob')
different_bob = Rect(160,160,'Bob')

PAB.pack()
root.mainloop()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 tkinter 画布中将多个对象移动到一起? [复制] 的相关文章

随机推荐

  • 错误:没有编译器提供程序! DI 异常 Angular 2 测试

    使用 npm test 命令执行时 给定的单元测试会抛出错误 它表示存在 DI 异常 并显示错误消息 错误 没有编译器提供程序 import TestComponentBuilder from angular compiler testin
  • 在节点模块文件夹中编辑react npm模块的代码

    是否可以更改 module 文件夹中 npm 模块的代码 我认为这不是推荐的做法 还有其他方法可以实现这一目标吗 目前 我尝试更改模块目录中的代码 但更改似乎并不适用 提前致谢 当然你可以改变包的内容node modules因为它是标准化格
  • 统一的网格组合器

    你好 我正在使用这个人的脚本https www youtube com watch v wYAlky1aZn4 https www youtube com watch v wYAlky1aZn4组合网格 因为游戏运行不流畅时会出现 滞后 或
  • Apple Watch 表 - 前 4 行未出现

    我在添加行时遇到问题WKInterfaceTable在苹果手表上 奇怪的是 无论我做什么 前 4 行都显示为空 我尝试手动添加行并循环 没关系 我相信我的代码很好 因为第五行和其他行看起来都很好 发生的情况如下 进一步滚动 My code
  • 如何用R创建时间散点图?

    数据是一系列日期和时间 date time 2010 01 01 09 04 43 2010 01 01 10 53 59 2010 01 01 10 57 18 2010 01 01 10 59 30 2010 01 01 11 00 4
  • 如何在当前鼠标位置设置工具提示?

    I registered Hotkey Ctrl Space Hotkey message is sent to private void Hotkey press I want to show tooltip Hello at curre
  • 如何在 Swift 中按换行符分割字符串

    我有一个从文本文件中获得的字符串 文本文件 Line 1 Line 2 Line 3 我想将其转换为数组 每行一个数组元素 Line 1 Line 2 Line 3 根据文件的保存方式 字符串可能采用以下形式之一 string Line 1
  • 如何将参数传递给 PyQt 中的回调函数

    我的工具栏中有大约 10 个 QAction 这个数字在运行时会有所不同 它们都将执行相同的操作 但使用不同的参数 我正在考虑将参数作为属性添加到 QAction 对象 然后 QAction 的触发信号也会将对象本身发送到回调函数 以便我可
  • 主/详细信息应用程序中的导航项

    我使用 XCode 的 Master Detail 模板编写了一个 Master Detail 应用程序 启动应用程序后 主视图的导航按钮的标题只是 Master 现在我想重命名该按钮 但不幸的是我不知道如何访问该按钮 在appdelega
  • 为什么 Apache Spark 会读取嵌套结构中不必要的 Parquet 列?

    我的团队正在构建一个 ETL 流程 以使用 Spark 将原始分隔文本文件加载到基于 Parquet 的 数据湖 中 Parquet 列存储的承诺之一是查询将仅读取必要的 列条带 但我们看到意外的列被读取以获取嵌套模式结构 为了进行演示 下
  • 在 Laravel 5.2 中按 id 显示图像文件

    我有一个名为 files 的表 它保存与属性表相关的图像的名称 我试图使这些图像显示为以下关系 这是属性表的一部分 这是表文件及其与属性表的关系 我可以在控制器 PropertyController 的 show 方法中传递什么参数 目前我
  • IE 错误响应 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的 IE
  • Node.js 多线程程序

    我编写了一个 node js 脚本来从交易所获取一些价格 它看起来像这样 async function main async function func var start time performance now for let rout
  • 对 SSPI 的调用失败 GSSAPI 操作失败并出现错误 - 提供了无效的状态代码(SPNEGO 找不到协商机制)

    我正在构建一个 ASP NET Core WebApi 应用程序 它将成为在 Windows 计算机上工作的 WCF 服务应用程序的客户端 这是我的服务客户端类 public class VITServicesClient Services
  • 在node.js中,如何以最轻量级的方式检查给定的代码字符串在语法上是否正确?

    想象一下 我接受用户的一段代码 只想检查给定的字符串是否是有效的 JS 仅从语法角度来看 function checkCode x Logic returns a boolean whether x is syntactically rig
  • Eclipse 中主题预览失败

    我制作了一个简单的用户名 密码对话框 我想在其中应用一个主题 它基本上定义了windowBackground 并且还想预览Eclipse 我看到我的主题与主题组合框中的其他主题一起显示 但选择它会产生以下错误 Missing styles
  • 在mongo聚合中选择* group by

    我正在尝试做一些我认为很简单的事情 假设我在 mongo 中有一系列具有公共键和可变数量属性的记录 我想选择记录中的所有属性并按名称分组 例如 Name George x 5 y 3 Name George z 9 Name Rob x 1
  • React 测试库 waitFor 不工作

    我在用反应测试库 https testing library com docs guide disappearance 2 using waitfor对我的 ReactJS 代码进行单元测试 UI 中有多个异步事件 例如获取数据和单击按钮时
  • 如何获取 Exchange Web 服务中的所有联系人(不仅仅是前几百个)

    我正在使用 Exchange Web 服务来迭代联系人 如下所示 ItemView view new ItemView 500 view PropertySet new PropertySet BasePropertySet IdOnly
  • 如何在 tkinter 画布中将多个对象移动到一起? [复制]

    这个问题在这里已经有答案了 我试图用鼠标拖放在画布上移动一些带有文本的矩形 我使用 find overlapping 选择要移动的矩形 这意味着最初作为类对象 Rect 的一部分创建的文本不会移动 有没有办法修改我的代码以移动类对象中的所有