python MVC,如何在不按下按钮的情况下自动实现功能运行?

python MVC, how to make the function run automatically without pressing the button?

这是我正在编写的程序的简化版本,并且可以正常工作。 我使用最后一个按钮来测试看我的小说作品,它确实如此。

我需要制作

self.controller.show_orders 

函数 运行 每隔几秒自动运行一次,而不是每隔几秒按一次按钮。

我试着把做按钮的代码拿出来,只有功能,没有运行。

我也试过了

        self.show_orders_on_grid()
    def show_orders_on_grid(self):
        self.controller.show_orders

它也不起作用。

我最后的努力是将 mainloop 放在函数之后,这很有效,我明白为什么。

        for i in range(len(self.model.row_list)):
            self.view.listbox_list[i].delete(0, "end",)
            for element in self.model.row_list[i]:
                self.view.listbox_list[i].insert("end", element)

        self.root.mainloop()
if __name__ == "__main__":
    c = Controller()

你能帮我如何自己制作函数 运行 吗?提前谢谢你。

from datetime import datetime
import time
import os
import tkinter as tk
import sqlite3
from apscheduler.schedulers.background import BackgroundScheduler
import socket
import json
import tkinter as tk

class Model():
    def __init__(self):

        self.row_list = []
        self.path = '/Users/paul/Documents/python/GUI/gui class/ordering 
                     app/4th.db'

        self.get_data_from_sql()
    def get_data_from_sql(self):
        self.conn = sqlite3.connect(self.path)
        self.cursor = self.conn.cursor()
        self.cursor.execute('SELECT * FROM main')
        self.data = self.cursor.fetchall()
        for row in self.data:
            self.row_list.append(row)
        self.conn.commit()


class View(tk.Frame):
    def  __init__(self, parent, controller):
        super().__init__(parent, bd =2, relief = tk.RIDGE)
        self.parent = parent
        self.controller = controller
        self.pack(fill=tk.BOTH, expand=1)

        self.frame_list = []
        self.listbox_list = []
        self.button_list = []


        for r in range(2):
            self.rowconfigure(r, weight=1)
            for c in range(4):
                self.columnconfigure(c, weight=1)
                self.frame=Small_Frame(self)
                self.frame.grid(row = r, column = c, padx=1, pady = 1,  sticky=
                               (tk.N, tk.S, tk.W, tk.E))
                self.frame_list.append(self.frame)


        self.button_list[7].configure(command = self.controller.show_orders)

class Small_Frame(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent, borderwidth=1, relief="groove")
        self.parent = parent
        self.pack()

        self.box = tk.Listbox(self, borderwidth=0)
        self.box.pack()
        self.parent.listbox_list.append(self.box)

        self.button = tk.Button(self, text = "get")
        self.button.pack()
        self.parent.button_list.append(self.button)

class Controller():
    def __init__(self):
        self.root = tk.Tk()
        self.model = Model()
        self.view = View(self.root, self)
        self.root.title("notbook my own try")
        self.root.geometry("1200x650")
        self.root.config(bg="LightBlue4")
        self.root.mainloop()

    def show_orders(self):
        for i in range(len(self.model.row_list)):
            self.view.listbox_list[i].delete(0, "end",)
            for element in self.model.row_list[i]:
                self.view.listbox_list[i].insert("end", element)

if __name__ == "__main__":
    c = Controller()

可以使用after()重复执行show_orders():

class Controller:
    def __init__(self):
        ...
        self.show_orders()
        self.root.mainloop()

    def show_orders(self):
        ...
        # call show_orders every 5 seconds
        self.root.after(5000, self.show_orders)