【问题标题】:Tkinter : Make canvas draggableTkinter:使画布可拖动
【发布时间】:2016-07-15 08:34:22
【问题描述】:

我正在创建一个项目,该项目涉及在画布上制作RawTurtle。我想知道如果绘图不在屏幕上我会怎么做。谁能告诉我如何使 Tkinter Canvas 小部件可拖动?

from tkinter import *
root = Tk()
c = Canvas(root)
t = RawTurtle(c)

....# What can i do to have a drag function
root.mainloop()

【问题讨论】:

  • 当您说可拖动时,我认为您的意思是可平移,因为您可以在画布内平移而不是在屏幕上移动画布。在这种情况下,请查看画布的绑定,特别是 "<B1>""B1-motion>"

标签: python canvas tkinter drag


【解决方案1】:

这是 python 3 的答案,但是更改导入,它应该可以在 python 2 上正常工作

#!python3

import tkinter as tk
import turtle

def run_turtles(*args):
    for t, d in args:
        t.circle(200, d)
    root.after_idle(run_turtles, *args)

def scroll_start(event):
    screen.scan_mark(event.x, event.y)

def scroll_move(event):
    screen.scan_dragto(event.x, event.y, gain=1)

root = tk.Tk()
root.geometry("700x700")
root.withdraw()

frame = tk.Frame(bg='black')
frame.pack(fill='both', expand=True)
tk.Label(frame, text=u'Hello', bg='grey', fg='white').pack(fill='x')

screen = turtle.ScrolledCanvas(frame)
screen.pack(fill="both", expand=True)


turtle1 = turtle.RawTurtle(screen)
turtle2 = turtle.RawTurtle(screen)

screen.bind("<ButtonPress-1>", scroll_start)
screen.bind("<B1-Motion>", scroll_move)

turtle1.ht(); turtle1.pu()
turtle1.left(90); turtle1.fd(200); turtle1.lt(90)
turtle1.st(); turtle1.pd()

turtle2.ht(); turtle2.pu()
turtle2.fd(200); turtle2.lt(90)
turtle2.st(); turtle2.pd()

root.deiconify()

run_turtles((turtle1, 3), (turtle2, 4))

root.mainloop()

值得注意的是:

  1. 由于某种原因,一旦添加了海龟,画布绑定就会停止工作,最好的解决方法是在添加海龟后添加绑定。或者,您可以改为绑定到顶部窗口。
  2. 画布只能平移到其滚动区域的边缘,如果要进一步平移,则需要将其放大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2022-11-16
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多