首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个对象如何在内存中丢失的情况下引用自己?

一个对象如何在内存中丢失的情况下引用自己?
EN

Stack Overflow用户
提问于 2021-07-29 03:28:19
回答 1查看 50关注 0票数 0

我正在用Tkinter做一个DBMS,我想有一个删除相应条目(右边的条目)的按钮。计算机如何知道哪个按钮正在发送命令或链接到哪个条目(或者如何链接它们)

看一下下面的代码

代码语言:javascript
复制
def edit_db():
    for i in root.winfo_children():
        i.grid_remove()

    back_btn = Button(root, text='<--', command=home)
    back_btn.place(height=30, width=30, x=4, y=4)

    row_count = 1
    for i in cur.execute("SELECT * FROM students").fetchall():
        
        save_btn = Button(root, text='Save', font=("Calbri", 9))
        if row_count == 1: save_btn.grid(row=row_count, column=1, pady=(45, 3), padx=(5, 10))
        else: save_btn.grid(row=row_count, column=1, pady=3, padx=(5, 10))

        del_btn = Button(root, text="X", font=("Calbri", 9), command=del_entry)
        if row_count == 1: del_btn.grid(row=row_count, column=0, pady=(45, 3), padx=5)
        else: del_btn.grid(row=row_count, column=0, pady=3, padx=(5))

正如您所看到的,它们是多个del_btn (和save_btn),它们的变量名将不再对应,但我希望这样做

代码语言:javascript
复制
del_btn = Button(root, text="X", font=("Calbri", 9), command=del_entry(**self/this/me**))

有什么我能做的吗?我必须在class中完成所有这些吗(我不是一个很好的OOP,所以我不知道这会有什么不同)?或者我遗漏了什么,他们的方法是将每个按钮与数据库中的条目链接起来。

这是我的应用程序的图片,如果它有帮助的话

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-29 14:21:06

以下是解决方案(包括3个选项):

代码语言:javascript
复制
from tkinter import Tk, Button, Label


label_list = []


def destroy_widget(index):
    label_list[index].destroy()


root = Tk()

for i in range(10):
    lbl = Label(root, text=f'Label {i}')
    lbl.grid(row=i, column=0, sticky='nsew')
    label_list.append(lbl)

    Button(root, text=f'Destroy {i}',
           command=lambda index=i: destroy_widget(index)).grid(row=i, column=1, sticky='nsew')
    
    # option using partial (place import at the top)
    # from functools import partial
    # Button(root, text=f'Destroy {i}',
    #        command=lambda: partial(destroy_widget, i).grid(row=i, column=1, sticky='nsew')
    
    # option defining function here (if so then the one at the top isn't needed)
    # def destroy_widget(index=i):
    #     label_list[index].destroy()
    # Button(root, text=f'Destroy {i}',
    #        command=destroy_widget).grid(row=i, column=1, sticky='nsew')

root.mainloop()

正如我所说的,将小部件放在一个列表中,然后保存索引(最好使用字典并保存键,这样它们就可以与它们的实例一起删除,否则您不能从列表中删除它们,因为这会更改其他索引,这会使事情变得一团糟)到您传递给按钮的函数,以便它们“记住”它,我提供了三种不同的(稍微)方法,一种是使用匿名函数,一种是使用partial函数,一种是使用普通函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68566355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档