this is simplified version of a program that I am writing, and as it is, works. I use the last button to test to see my fiction works, and it does.
I need to make the
self.controller.show_orders
function run by itself every few seconds, instead of pressing the button every few seconds.
I tried to take out the codes that made the button, and only have the function, but it does not run.
I also tried
self.show_orders_on_grid()
def show_orders_on_grid(self):
self.controller.show_orders
and it does not work either.
my last effort was to put the mainloop after the function, and that works, which I understand why.
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()
would you please help me how i can make the function run myself? thank you in advance.
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()
You can use after()
to execute show_orders()
repeatedly:
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)