【发布时间】:2015-03-31 19:32:03
【问题描述】:
我有一个 tkinter 界面,需要每 5 分钟自动刷新一次。到目前为止没有问题,您只需要执行以下操作:
root.after(300000, function_to_run, args_of_fun_to_run)
问题是我必须在“无限”时间内这样做。场景是 GUI 将在连接到电视的 PC 上运行,并在我的办公室 24/7 全天候显示一些信息。这工作了大约 8 小时,然后我收到以下错误:
现在,我知道回溯一直到我使用 matplotlib 的自定义模块中的一行。我的自定义模块都没有使用任何循环,所以我知道错误不是直接来自其中一个(如果我错了,请纠正我),所以它必须是我无限次重复该函数。这是我的主要功能的代码:
from tkinter import *
from tkinter import ttk
import logging
import datetime
import sys
sys.path.append(r'C:\Users\me\Desktop\seprated sla screens')
import sla_main as sla
import main_frame as mf
import sla_grid as sg
import incoming_volume as iv
import outgoing_volume as ov
import read_forecast as fc
import get_headers as hd
import vol_graph as vg
import out_graph as og
import add_graph as ag
import sla_reduction_email as sre
###################################
###################################
###################################
###################################
runs = 0
def maininterface(f_size, pic_x, pic_y):
global runs
global root
start = str(datetime.datetime.now().date()) + ' ' + str(datetime.timedelta(hours=6))
screen = sla.slamain(start)
if runs == 0:
root = mf.mainframe(f_size)
sg.sla_grid(screen, f_size, root)
file = open('titles in queue.txt', 'r')
in_q = file.read()
file.close
ttk.Label(root, text=in_q, anchor=CENTER, width=15, font=('times', f_size, 'bold')).grid(column=6, row=2, sticky=E)
if runs > 0:
###################################
#deletes all rows before making the calculations
for label in root.grid_slaves():
if int(label.grid_info()["row"]) > 1:
label.grid_forget()
sg.sla_grid(screen, f_size, root)
file = open('titles in queue.txt', 'r')
in_q = file.read()
file.close
ttk.Label(root, text=in_q, anchor=CENTER, width=15, font=('times', f_size, 'bold')).grid(column=6, row=2, sticky=E)
###################################
#all this part is just info for the graph and the graph
incoming = iv.incomingvolume(start)
outgoing = ov.outgoingvolume(start)
forecast = fc.readforecast()
headers = hd.getheaders()
vg.volgraph(forecast, incoming, headers, pic_x, pic_y)
#og.outgraph(forecast, outgoing, headers, pic_x, pic_y)
ag.addgraph("vol_graph.png", root, 1)
#ag.addgraph("out_graph.png", root, 2)
runs = runs + 1
globals().update(locals())
print(str(datetime.datetime.now()))
root.after(300000, maininterface, f_size, pic_x, pic_y)
root.mainloop()
logging.basicConfig(level=logging.DEBUG, filename='error_log.txt')
try:
maininterface(28, 23.5, 6)
except:
logging.exception("Oops:")
我可以在这里修改什么来避免这个错误??
谢谢!
编辑:
正如许多人所建议的,我已将 mainloop 调用移到 main 函数之外。我的代码的最后几行现在看起来像这样:
try:
maininterface(28, 23.5, 6)
root.mainloop()
except:
logging.exception("Oops:")
root.after 调用保留在函数内部。像这样运行后,它会在 5 分钟后关闭。有谁知道为什么没有调用主循环?
【问题讨论】:
-
在函数外调用主循环。
-
可能与您的问题无关,但
file.close没有做任何事情。你需要file.close()。 -
@MalikBrahimi,如果这是答案,请将其作为答案发布。
-
如果它在 5 分钟后关闭,则
mainloop正在运行,并且某些原因导致主窗口被破坏。 -
我没有例外,我的代码 O.o 中的任何地方都没有类似于 root.destroy() 的内容
标签: python python-3.x tkinter