替换Tkinter小部件的内容

2024-05-04 20:50:54 发布

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

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

 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

Tags: textnametopcolumnspacescreenstarttweets
2条回答

对于文本小部件,使用delete方法删除现有文本,然后使用insert添加新信息。避免一直销毁和重新创建小部件。创建它们一次,然后使用Text.insert和Label.configure更新它们的内容。 我也会避免while循环,而是在处理完所有内容之前使用after调用方法。紧循环防止在完成整个循环之前处理事件,而使用after则使用事件处理中断循环的每个迭代

结果证明,解决办法相当简单

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

相关问题 更多 >