【问题标题】:How stop sketch in tkinter canvas如何在 tkinter 画布中停止草图
【发布时间】:2018-10-02 05:09:59
【问题描述】:

我在这里有几行代码在tkinter canvas 中画了一个圆圈,但我想做的是将草图停止到它开始的位置,所以我使用睡眠,但我在它到达的地方停止草图继续。

所以我写了这个函数

def stop_extent():

    canvas.create_arc(0, 0, 0, 0, extent=0, outline="red", tags=("arc",))
    extent = float(canvas.itemcget("arc", "extent"))
    extent = extent + 5.0
    canvas.itemconfigure("arc", extent=extent)
    canvas.after(100, stop_extent)

并将所有值设置为0,但它仍然没有停止它并且标签也没有配置。

import tkinter as tk
import time



def change_extent():
    l.config(text="sketch in progress...")

    canvas.create_arc(350, 100, 220, 220, extent=0, outline="yellow", tags=("arc",))
    extent = float(canvas.itemcget("arc", "extent"))
    extent = extent + 5.0
    canvas.itemconfigure("arc", extent=extent)
    canvas.after(100, change_extent)



def stop_extent():
    l.config(text="sketch stopped...")
    time.sleep(10)
    l.config(text="sketch stopped...")


root = tk.Tk()
root.geometry("600x400")

canvas = tk.Canvas(root, width=200, height=200, background="dodger blue")
canvas.pack(fill="both", expand=True)


l = tk.Label(canvas, bg="dodger blue",  fg="white")
l.place(x=250, y=20)


b= tk.Button(canvas, text="Start sketch", command=change_extent, width=25, fg='dodger blue')
b.place(x=220, y=330)


b= tk.Button(canvas, text="stop sketch", command=stop_extent, width=25, fg='dodger blue')
b.place(x=220, y=370)


root.mainloop()

【问题讨论】:

    标签: python-3.x tkinter tkinter-canvas


    【解决方案1】:

    可以在change_extent方法中跟踪canvas.after产生的回调,在stop_extent方法中用canvas.after_cancel取消;在下面的示例中,我使用一个全局变量stop 来演示它。

    在 GUI 应用程序中使用 time.sleep 通常是个坏主意。

    您也不需要在每次要修改其范围时重新创建弧,但这超出了您的问题范围。

    import tkinter as tk
    import time
    
    
    def change_extent():
        global stop
        l.config(text="sketch in progress...")
        extent = float(canvas.itemcget(arc_item, "extent"))
        canvas.itemconfigure("arc", extent=extent+5)
        stop = canvas.after(100, change_extent)
    
    
    def stop_extent():
        l.config(text="sketch stopped...")
        print(stop)
        canvas.after_cancel(stop)
        canvas.itemconfigure("arc", extent=0)   # <- reset to straight line start
    
    
    
    stop = None
    root = tk.Tk()
    root.geometry("600x400")
    
    canvas = tk.Canvas(root, width=200, height=200, background="dodger blue")
    canvas.pack(fill="both", expand=True)
    
    arc_item = canvas.create_arc(350, 100, 220, 220, extent=0, outline="yellow", tags=("arc",))
    
    
    l = tk.Label(canvas, bg="dodger blue",  fg="white")
    l.place(x=250, y=20)
    
    
    b= tk.Button(canvas, text="Start sketch", command=change_extent, width=25, fg='dodger blue')
    b.place(x=220, y=330)
    
    
    b= tk.Button(canvas, text="stop sketch", command=stop_extent, width=25, fg='dodger blue')
    b.place(x=220, y=370)
    
    
    root.mainloop()
    

    【讨论】:

    • 谢谢,但我希望草图回到开始用直线绘制的点。
    • 我更新了重置弧的答案。如果这是您想要的,请告诉我。
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多