回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个tkinter接口,需要每5分钟自动刷新一次。到目前为止还没有问题,你只需要做如下事情:</p>
<pre><code>root.after(300000, function_to_run, args_of_fun_to_run)
</code></pre>
<p>问题是我必须在“无限”的时间内这样做。这种情况下,图形用户界面将运行在一台连接到电视的电脑上,在我的办公室24/7显示一些信息。这项工作大约8小时,然后我得到以下错误:</p>
<p><img src="https://i.stack.imgur.com/XcCug.png" alt="enter image description here"/></p>
<p>现在,我知道回溯一直到我的一个自定义模块中使用matplotlib的一行。我的自定义模块没有使用任何循环,因此我知道错误不是直接来自其中一个模块(如果我错了,请纠正我),因此必须是我无限次地重复函数。这是我主要功能的代码:</p>
<pre><code>from tkinter import *
from tkinter import ttk
import logging
import datetime
import sys
sys.path.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(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:")
</code></pre>
<p>我可以在这里修改什么来避免这个错误??</p>
<p>谢谢!</p>
<p><strong>编辑:</strong></p>
<p>正如许多人所建议的,我已经将主循环调用移到主函数之外。我代码的最后几行现在看起来是这样的:</p>
<pre><code>try:
maininterface(28, 23.5, 6)
root.mainloop()
except:
logging.exception("Oops:")
</code></pre>
<p>root.after调用仍保留在函数内部。像这样运行后,5分钟后关闭。有人知道为什么不调用主循环吗?</p>