【问题标题】:Get a variable from a function从函数中获取变量
【发布时间】:2017-06-23 04:24:01
【问题描述】:

在这段代码中,我想知道如何获取rect 变量并在Delete 方法中使用它,就像我尝试过的那样。它目前出现错误。

from tkinter import *

def createRect(event):
    rect = w.create_rectangle(50, 25, 150, 75, fill="blue")
    return rect

def Start(event):
    print("Single Clicked")
    createRect(event)

def Delete(event):
    i = createRect(event)
    print("Double Clicked")
    w.delete(i.rect)

root = Tk()
w = Canvas(root, width=200, height=100)
w.pack()
frame = Button(root, text="delete/make")
frame.bind("<Double-1>", Delete)
frame.bind("<Button-1>", Start)
frame.pack()
root.mainloop()

【问题讨论】:

  • rect 已经加入了Delete 函数。我想你只需要这样做,w.delete(i)...试试吧!!
  • 做一个参数传递给删除函数,不要依赖全局变量。
  • 没有。由于这些函数是无状态的,因此此处无法进行参数。我认为需要一个全球性的。
  • 当我只使用 'w.delete(i)' 时,没有错误,但 rect var 不会像调用 'w.delete(i)' 时那样从页面上消失.
  • 会出现什么错误?

标签: python function tkinter tkinter-canvas


【解决方案1】:

一般来说,我建议不要使用全局变量,因为您无法控制谁可以修改它们以及如何修改它们。但在这种情况下,主循环正在调用您的 StartDelete 函数。您可以创建一个容器对象并在您的方法中使用它。

class MyRect:
   def __init__(self):
       self.rect = None
       self.isSet = False

然后,在您的 tkinter 代码中,您可以像这样使用它:

myrect = MyRect()

def Start(event):
    if not myrect.isSet:
        print("Single Clicked")
        myrect.rect = createRect(event)
        myrect.isSet = True

def Delete(event):
    if myrect.isSet:
       print("Double Clicked")
       w.delete(myrect.rect)
       myrect.rect = None
       myrect.isSet = False

您还可以处理用户双击或单击按钮 1 的次数,而不是这种方式。

如果您喜欢冒险,您可以添加 __setattr____getattr__ 方法来控制在您不应该修改 rect 实例时会发生什么。

【讨论】:

  • 完成。但我不能投票,因为我刚刚加入堆栈溢出,还没有足够的声誉。
  • @danielmcgregor 不用担心。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多