<p>您似乎对GUI程序的工作方式有一个基本的误解。你不应该创建自己的while循环。Tkinter(和其他GUI工具包)有一个需要运行的自定义while循环。你知道吗</p>
<p>原因是,为了让GUI工作,它需要能够处理事件。即使是像在另一个窗口移动时重新绘制窗口这样简单的事情,也是对事件的响应。你知道吗</p>
<p>在Tkinter中,这个事件处理器是<code>mainloop</code>。如果<code>mainloop</code>没有运行(在调用它之前,如果您的程序正在休眠,如果您有自己的长时间运行的代码正在执行,…),它就不能处理事件。如果它不能处理事件,那么它就不能更新屏幕。你知道吗</p>
<p>你可以把<code>mainloop</code>看作是一个无限循环,看起来像这样:</p>
<pre><code>while the_app_is_running:
event = wait_for_next_event()
process_event(event)
</code></pre>
<p>注意:实际上您并没有编写上面的代码,但打个比方,调用<code>mainloop</code>就是这么做的。你知道吗</p>
<p>在您的情况下,似乎希望显示每分钟更新一次。通过利用这个事件循环,很容易做到这一点。事件循环已经在运行,所以您需要做的就是告诉它每分钟醒来一次并更新其数据。您可以使用<code>after</code>方法来实现这一点。给这个方法一个要调用的函数名和一个延迟,它将在延迟之后调用这个函数。它通过在事件队列中放置一个基于时间的事件来实现。你知道吗</p>
<p>第一步是用所有小部件设置显示。例如:</p>
<pre><code>app = Tk()
...
dollar_label = Label(app, text="")
pound_label = Label(app, text="")
...
</code></pre>
<p>下一步是创建一个函数,用您想要的值填充所有标签。从创建标签开始,在一个单独的步骤中执行此操作非常重要,因为您希望能够每分钟都执行此操作。你知道吗</p>
<pre><code>def refresh_display():
# First, get the new data
currency = ...
commodity = ...
...
# next, update the widgets
dollar_label.configure(text="Dollar: %s" % currency["dollar"]
pound_label.configure(text="Pound: %s" % currency["pound"]
...
</code></pre>
<p>最后,您希望每分钟都调用这个函数。您可以编写一个调用<code>refresh_display</code>函数的函数,然后将自己安排在60秒内再次运行:</p>
<pre><code>def call_every_60_seconds():
refresh_display()
app.after(60000, call_every_60_seconds)
</code></pre>
<p>最后一步是在启动主循环之前,通过调用此函数一次来启动更新。这将用初始值更新显示,然后每分钟启动一次计划。你知道吗</p>
<pre><code>call_every_60_seconds()
app.mainloop()
</code></pre>
<p>这是你必须做的基本工作。这很简单,只需要对代码进行一点组织。你知道吗</p>