python MVC, как заставить функцию запускаться автоматически без нажатия кнопки? - PullRequest
0 голосов
/ 16 февраля 2020

это упрощенная версия программы, которую я пишу, и как она работает. Я использую последнюю кнопку для проверки своих художественных произведений, и она работает.

Мне нужно, чтобы функция

self.controller.show_orders 

запускалась сама по себе каждые несколько секунд вместо нажатия кнопки каждые несколько секунд.

Я пытался убрать коды, которые сделали кнопку, и только иметь функцию, но она не работает.

Я также пытался

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

, и он тоже не работает.

Моим последним усилием было поставить mainl oop после функции, и это работает, что я понимаю почему.

        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()

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...