如何复制嵌入tkinter画布的龟框内容

2024-09-30 01:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图保存tkinter画布的当前状态,以便以后显示。以下是我尝试使用deepcopy的方法:

from tkinter import *
from copy import deepcopy
root=Tk()
cv=Canvas(root)
cv.pack()
cvcopy=deepcopy(cv)
mainloop()

但是cvcopy=deepcopy(cv)行会产生错误:

^{pr2}$

因为显然你不能只创建一个新的小部件。下面是我用来在turtle屏幕上嵌入和绘制的代码:

cv = tkinter.Canvas(self.root,width=300,height=300)
cv.pack()
t = turtle.RawTurtle(cv)
s = t.getscreen()
def toggledown():
    if t.isdown():
        t.penup()
    else:
        t.pendown()
t.speed(0)
t.ondrag(t.goto)
s.onclick(t.goto)
s.onkey(toggledown, 'space')
s.listen()

有人知道如何复制屏幕,然后再添加到其他地方吗?在


Tags: fromimport屏幕tkinter状态画布rootcv
3条回答

无法复制小部件,但是,如果同时创建相同的小部件,但不调用几何图形管理器,则可以稍后将其添加到屏幕:

from tkinter import *
root = Tk()
cv = Canvas(self.root, width=300, height=300)
cv.pack()
copy = Canvas(otherframe, width=300, height=300)
t = turtle.RawTurtle(cv)
s = t.getscreen()
ct = turtle.RawTurtle(copy)
cs = ct.getscreen()

def toggledown():
    if t.isdown():
            t.penup()
            ct.penup()  #no point testing twice since they're the same
        else:
            t.pendown()
            ct.pendown()

def goto(x, y):
    t.goto(x, y)
    ct.goto(x, y)

Button(self.root, text='Copy', command=copy.pack).pack()
t.speed(0)
ct.speed(0)
t.ondrag(goto)  #the copy will go to the same place
s.onclick(goto)
s.onkey(toggledown, 'space')
s.listen()
mainloop()

在这种情况下,还可以通过为画布创建类来节省时间:

^{pr2}$

这里有一些东西似乎可以完成你想要的。这并不是一个完整的例子,而是一种实现复制目标的方法。在

您的问题中没有任何代码实际上在Canvas上绘制了一些内容,因此我从tutorial中借用了一些代码,我使用了我发现的tkinter来生成一个带有几个小部件的Canvas,以便于说明。它生成一个如下所示的窗口,其中包含一个Button和一个Canvas小部件,其中仅包含三个不同颜色的矩形小部件:

screenshot of program running

下面是演示代码,演示如何迭代Canvas上当前的所有小部件:

from pprint import pprint, pformat
from tkinter import Button, Tk, Canvas, Frame, BOTH

class Example(Frame):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.master.title("Colours")
        self.pack(fill=BOTH, expand=1)

        button = Button(self, text="Copy", command=self.copy_canvas)
        button.pack()

        self.canvas = Canvas(self)
        self.canvas.create_rectangle(30, 10, 120, 80,
                                     outline="#fb0", fill="#fb0")
        self.canvas.create_rectangle(150, 10, 240, 80,
                                     outline="#f50", fill="#f50")
        self.canvas.create_rectangle(270, 10, 370, 80,
                                     outline="#05f", fill="#05f")
        self.canvas.pack(fill=BOTH, expand=1)

    def copy_canvas(self):
        # Iterate through all the items in self.canvas and print each
        # one's type and options (which could be used to recreate it).
        for id in self.canvas.find_all():
            item_type = self.canvas.type(id)
            options = self.canvas.itemconfigure(id)
            formatted_options = pformat(options, indent=4)
            print('id: {}, type: {!r}\n{}'.format(
                    id, item_type, formatted_options))


def main():
    root = Tk()
    ex = Example()
    root.geometry("400x100+300+300")
    root.mainloop()


if __name__ == '__main__':
    main()

当按下复制按钮时,它会打印出以下内容:

^{pr2}$

你不能做什么。小部件不是纯python对象。它们的大部分状态都在嵌入式tcl解释器中。您根本无法复制这样的tkinter小部件。在

简而言之,没有办法复制tkinter小部件。您所能做的最好的方法是使用configure方法来获取小部件的所有配置选项,然后使用相同的选项创建一个新的小部件。即使这样,它也不会存储内部状态,如画布上的图形、文本小部件中的文本等

相关问题 更多 >

    热门问题