【问题标题】:How can an object refer to itself despite being lost in memory?尽管丢失在内存中,对象如何引用自己?
【发布时间】:2021-10-04 13:06:58
【问题描述】:

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

看看下面的代码

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),它们的变量名将不再对应,但我想做类似的事情

del_btn = Button(root, text="X", font=("Calbri", 9), command=del_entry(**self/this/me**))

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

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

【问题讨论】:

  • 将这些条目小部件附加到列表中,并将索引作为参数传递给删除函数,然后在函数中将它们从列表中删除,或者更多类似的方法,调用 .destroy() 以便其余的索引保持不变,或者使用字典并删除键,提示:使用lambda i=i 或类似的东西来保持当前循环的索引和东西
  • @Matiiss 是的,但我将如何通过索引?每个按钮都将具有相同的代码行,我将条目小部件添加到和列表中(我也尝试使用字典),但是当将其传递给它时,所有按钮输出都是相同的(因为就像我说的相同的代码行)。有什么我想念的吗?谢谢。
  • 您错过了我告诉您使用lambda variable=variable: 的部分(其中变量可以是您想要的任何名称......)这将允许函数始终使用相同的变量,在这种情况下索引,所以当你调用特定按钮的函数时,它已经“保存”了它的索引,还有两种稍微不同的方法我能想到基本上做同样的事情,但至少弄清楚这一点,如果你不能我会试着写一个答案
  • 另外,我刚刚读到您询问了有关课程的问题,嗯,我不知道这是否会更容易(也不是更难),但我会说它会更好,并且会让事情更有条理,如果你愿意,我也可以尝试写一个这样的例子

标签: python oop tkinter


【解决方案1】:

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

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()

正如我所说,将小部件放在一个列表中,然后保存索引(最好使用字典并保存键,以便可以将它们与它们的实例一起删除,否则你不能从列表中删除它们,因为应该将其他会搞砸的索引更改为您传递给按钮的函数,以便他们“记住”它,我提供了 3 种不同(略微)的方法来做到这一点,一种是使用匿名函数,一种是使用部分, 一是使用普通功能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2012-01-25
    相关资源
    最近更新 更多