Python3.x:tkinter(ttk)停止显示widg

2024-09-30 00:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我一直在尝试用tkinter制作一些基本的图形用户界面(不要把它和tkinter混淆),但我遇到了一个问题,我无法找到解决方案,也无法在万能的谷歌上找到任何东西。。。 我有一个小型的SQLite数据库,在我的电脑上有一个目录表。我想把所有的目录路径画成一个标签,并在标签旁边添加一个“rempve”按钮。该按钮应该能够从数据库中删除目录,也可以从GUI中删除它。我还有一个“添加”按钮,可以在其中向数据库添加目录,这个新目录应该显示在GUI中。这是我的基本布局:

---------------
| ADD         |
|dir1   REMOVE|
|dir2   REMOVE|
---------------

我使用gridlayout来显示按钮和标签。大多数事情都是有效的,所有与数据库相关的东西都有效。当启动GUI时,当前目录和“删除”按钮也会很好地显示出来。但是。。。当使用'remove'按钮时,目录不会从GUI中消失,即使它不再在数据库中,重新启动GUI当然会修复它。添加标签有效。。。但我不确定我做得是否正确…
我怎样才能用新信息重新绘制GUI呢? 这是我的GUI代码:

^{pr2}$

Tags: 路径目录add数据库sqlitetkintergui标签
1条回答
网友
1楼 · 发布于 2024-09-30 00:25:49

如果您希望在每次添加或删除某些内容时重新绘制GUI,则需要在创建新的小部件之前首先销毁所有旧的小部件。例如:

def draw(self, db):
    # first, delete any existing widgets
    for child in self.frame.winfo_children():
        child.destroy()
    # next, redraw all the widgets
    paths = db.getPaths()
for path in paths:
        ...

你有另一个bug,这就是你使用lambda的方式。当它与问题中的代码保持一致时,所有回调都将看到相同的值。通过将该值指定为lambda的关键字参数,您将获得正确的值:

^{pr2}$

与实际问题无关,我不认为您需要传递db。假设您只使用一个数据库,我建议您在GUI构造函数中执行self.db = db。这将使您的代码更易于维护,因为您的方法签名将被简化。在

最后,当您删除一个项目时,确实没有必要完全重新绘制GUI。一次只能删除一个标签和按钮。这需要您花更多的时间来考虑如何在程序中管理数据。例如,如果保留对每个标签和按钮的引用,则可以在从数据库中删除路径时将其删除。您的removeDir函数可能类似于:

def removeDir(self, pid):
    label, button = self.widgets(pid)
    label.destroy()
    button.destroy()

相关问题 更多 >

    热门问题