Как показать данные в модуле tkinter динамически-Python - PullRequest
0 голосов
/ 28 октября 2018

Я новичок в создании графического интерфейса в Python с использованием Tkinter.Я нашел скрипт в переполнении стека, который дает графический интерфейс, в котором я могу добавить данные вручную.Я попытался добавить данные динамически, таким образом автоматизируя весь процесс, используя следующий код:

def insert_data(self):
            """
            Insertion method.
            """
            for l in range(10):
                time.sleep(3)
                print(i)
                self.treeview.insert('', 'end', text="Item_"+str(self.i)+str(l), values=(self.dose_entry.get()+" mg", self.modified_entry.get()))
            # Increment counter
            self.i = self.i + 1 

Этот фрагмент вставки данных дает правильный вывод и даже показывает данные в графическом интерфейсе.Но данные, вставленные в графический интерфейс, отображаются после выполнения цикла for.Чтобы быть более сложным.: print(i) в вышеупомянутом для печати цикла от 0 до 9 в IDLE, но во время этого выполнения данные, показанные в IDLE, не появляются одновременно в GUI.Он печатает данные в режиме IDLE до тех пор, пока цикл не завершится, и графический интерфейс не покажет никаких данных, пока цикл не будет завершен, а затем он показывает все числа одновременно.

Я хочу показать данные в графическом интерфейсе какпечатает в IDLE, т. е. для каждой итерации данные должны быть видны в графическом интерфейсе, как они печатаются в IDLE.Пример: в первой итерации для i = 0 print (i) выведет «0». Я хочу показать его в графическом интерфейсе, так как он печатает в IDLE.Вот мой код:

import tkinter
from tkinter import ttk
import urllib
import requests 
import time

class Begueradj(tkinter.Frame):
    '''
    classdocs
    '''  
    def __init__(self, parent):
        '''
        Constructor
        '''
        tkinter.Frame.__init__(self, parent)
        self.parent=parent
        self.initialize_user_interface()

    def initialize_user_interface(self):
        """Draw a user interface allowing the user to type
        items and insert them into the treeview
        """
        self.parent.title("Canvas Test")       
        self.parent.grid_rowconfigure(0,weight=1)
        self.parent.grid_columnconfigure(0,weight=1)
        self.parent.config(background="lavender")


        # Define the different GUI widgets
        self.dose_label = tkinter.Label(self.parent, text = "Dose:")
        self.dose_entry = tkinter.Entry(self.parent)
        self.dose_label.grid(row = 0, column = 0, sticky = tkinter.W)
        self.dose_entry.grid(row = 0, column = 1)

        self.modified_label = tkinter.Label(self.parent, text = "Date Modified:")
        self.modified_entry = tkinter.Entry(self.parent)
        self.modified_label.grid(row = 1, column = 0, sticky = tkinter.W)
        self.modified_entry.grid(row = 1, column = 1)

        self.submit_button = tkinter.Button(self.parent, text = "Insert", command = self.insert_data)
        self.submit_button.grid(row = 2, column = 1, sticky = tkinter.W)
        self.exit_button = tkinter.Button(self.parent, text = "Exit", command = self.parent.quit)
        self.exit_button.grid(row = 0, column = 3)

        # Set the treeview
        self.tree = ttk.Treeview( self.parent, columns=('Dose', 'Modification date'))
        self.tree.heading('#0', text='Item')
        self.tree.heading('#1', text='Dose')
        self.tree.heading('#2', text='Modification Date')
        self.tree.column('#1', stretch=tkinter.YES)
        self.tree.column('#2', stretch=tkinter.YES)
        self.tree.column('#0', stretch=tkinter.YES)
        self.tree.grid(row=4, columnspan=4, sticky='nsew')
        self.treeview = self.tree
        # Initialize the counter
        self.i = 0


    def insert_data(self):
        """
        Insertion method.
        """
        for l in range(10):
            time.sleep(3)
            print(l)
            self.treeview.insert('', 'end', text="Item_"+str(l), values=(self.dose_entry.get()+" mg", self.modified_entry.get()))
        # Increment counter
        self.i = self.i + 1

def main():
    root=tkinter.Tk()
    d=Begueradj(root)
    root.mainloop()

if __name__=="__main__":
    main()

1 Ответ

0 голосов
/ 28 октября 2018

При использовании time.sleep(3) выполнение приостанавливается, а также любые обновления в графическом интерфейсе.Задачи обновления графического интерфейса находятся в очереди, и они будут обработаны, как только у приложения будет время.И нет времени, чтобы сэкономить, пока не закончится цикл.

Для принудительного обновления древовидной структуры вы можете вставить строку:

self.treeview.update_idletasks()   # Force widget update

после добавления элемента древовидной структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...