2017-02-12 137 views
0

在tkinter,python中,我试图创建一个程序,它涉及到在画布上创建一个图形并点击按钮,并且不会创建更多的图形。这里是我的代码:使用Tkinter在第一次点击后只能运行一次的函数?

from tkinter import * 

root = Tk() 
canvas = Canvas(root) # Creating Canvas 
canvas.pack() 

def create(event): 
    x1, y1 = (event.x - 5), (event.y - 5) 
    x2, y2 = (event.x + 5), (event.y + 5)   # Creates Rectangle Where Button Clicked 
    canvas.create_rectangle(x1,y1,x2,y2,fill='red') 

root.bind_all("<Button-1>", create) # Binds Mouse Click Button 


citybg = PhotoImage(file= r"example.png") 
citybgimage = canvas.create_image(50, 50, image=citybg) # Background for Canvas 

我的问题是,如何让矩形只能够创造一次和只有一次,并且不再执行的create功能。希望这个解释得很好,我希望能很好地回答。

+0

'root.bind_all()'将返回先前分配给该事件的函数。保存这个值,然后'bind(“”,previous_value)'当你想恢复它时(可能在'create()'函数中)。 – martineau

回答

2

好了,一个简单的解决方案(但不是漂亮)将添加一个布尔标志,这将是当函数首次运行时设置为True。 然后使用if语句并返回并在创建时不做任何事情,如果为True。

这样的事情(createRan - 是布尔标志):

root = Tk() 
canvas = Canvas(root) # Creating Canvas 
canvas.pack() 
createRan = False 


def create(event): 
    if(createRan): 
     return 
    else: 
     createRan=True 
     x1, y1 = (event.x - 5), (event.y - 5) 
     x2, y2 = (event.x + 5), (event.y + 5)   # Creates Rectangle Where Button Clicked 
     canvas.create_rectangle(x1,y1,x2,y2,fill='red') 
3

使用Boolean检查是否矩形已创建或没有,这样的:

rectangleCreated = False 

def create(event): 
    if rectangleCreated: 
     return 
    x1, y1 = (event.x - 5), (event.y - 5) 
    x2, y2 = (event.x + 5), (event.y + 5) 
    canvas.create_rectangle(x1,y1,x2,y2,fill='red') 
    rectangleCreated = True 
0

我认为你可以在运行功能完成后取消绑定功能。像这样:

def create(event): 
    x1, y1 = (event.x - 5), (event.y - 5) 
    x2, y2 = (event.x + 5), (event.y + 5) # Creates Rectangle Where Button Clicked 
    canvas.create_rectangle(x1,y1,x2,y2,fill='red') 
    root.unbind_all('<Button-1>') #You can later bind <Button-1> to other functions as well 
+0

看起来是最简单实用的解决方案。 :) –