【问题标题】:Replacing contents of Tkinter widgets替换 Tkinter 小部件的内容
【发布时间】:2019-05-25 00:24:18
【问题描述】:

我正在尝试开发一个类似 Twitter 的客户端来掌握 tkinter 的窍门。我从存储在 sqlite 数据库中的推文中每屏显示 7 条推文。一行在标签中有名称、屏幕名称和创建日期。下面是一个带有推文文本的文本框。当用户按下下一个或上一个按钮时,我想显示文件中的下一个或上一个 7 条推文。不知道如何清除以前的数据并使用新数据进行更新。那是因为我希望小部件的创建是动态的,如下面的代码所示。因此,没有办法解决我的名字的特定小部件。

 if tweetStr:
    while i <  listLen:   
        print(i)
        user_name = tweetStr[i]['name']
        screen_name = tweetStr[i]['screen_name']
        created = tweetStr[i]['created_at']
        tweet_text = (tweetStr[i]['short_text'] if not tweetStr[i]['long_text'] else tweetStr[i]['long_text'] )

        top_space = tk.Text(f, width= 100, height=1)
        top_space.grid(column = 0, row = start_row,columnspan=6, sticky="nsew")
        top_space.configure(background='lightblue')

        ttk.Label(f, text=user_name).grid(column=0, row=start_row+1,sticky='w')
        ttk.Label(f, text=screen_name).grid(column=1, row=start_row+1,sticky='w')
        ttk.Label(f, text=created).grid(column=2, row=start_row+1,sticky='w')

        t = tk.Text(f, width= 100, height=3, wrap='word')
        t.grid(column = 0, row = start_row+2,columnspan=6, sticky="nsew")
        #t.insert(INSERT, "Begin " + "This is a test " * 800 + " END" + '\n\n')
        t.insert(tk.INSERT, tweet_text)

        i += 1
        start_row += 6

【问题讨论】:

    标签: python tkinter ttk


    【解决方案1】:

    对于文本小部件,使用 delete 方法删除现有文本,然后使用 insert 添加新信息。避免一直销毁和重新创建小部件。创建一次,然后使用 Text.insert 和 Label.configure 更新其内容。 我也会避免使用while 循环,而是使用after 调用方法,直到您处理完所有内容。紧密循环会阻止处理事件,直到您完成整个循环,同时使用 after 将循环的每次迭代与事件处理分开。

    【讨论】:

    • 请注意,标签和文本框是在循环中创建的,不能通过变量名寻址,因此我看不到如何使用 delete 方法。我只看到两个选项,而且看起来都不错——希望还有第三个。将所有动态生成的小部件放在一个命名的框架中并删除该框架,或者创建7组小部件全部分配给变量名。
    • 这就是类的用途。创建一个基于 Frame 小部件的类来管理您的小部件集合。将子小部件 ID 保留为成员。基本上将其作为复合小部件进行管理,以简化主程序代码。
    【解决方案2】:

    结果证明解决方案相当简单。

     for widget in f.winfo_children():
           if isinstance(widget, tk.Text):
                widget.delete('1.0', "end")
           elif isinstance(widget,ttk.Label):
                widget['text'] = ''    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多