Tkinter与我的主循环一起管理我的事件循环

我一直在慢慢学习Tkinter和面向对象的编程,但是我已经将自己编程与此有关。请原谅我对这一观点缺乏批判性思考,但是我已经问过我认识的每个人,谁比我更了解python,所以我们不能在这里找到可行的解决方案。

我有一个正在运行的gui应用程序,它允许用户输入股票代码,为每个代码创建新标签,然后定期更新每个标签。(有点像一个非常基本的电子商务应用程序之类的东西)。我发现没有gui做到这一点真的很容易,因为我可以说:

while True:

sPrice = get_stock_price(s)

print sPrice

但是我已经将我的get_stock_price(s)函数绑定到了一个按钮,该按钮产生了一个子框架和其中包含的标签。我遇到的问题是标签不会更新。一位朋友建议添加仅用于更新标签的另一种方法,但是我知道如何不断更新标签的唯一方法是

while True:

# get new price

# update the label

# time.sleep(~1 minute?)

这会使我的GUI窗口永久冻结并旋转。我一直在阅读与该特定情况相关的所有其他线程,并且看到了许多不同的建议。不要在您的主线程中调用sleep,不要使用root.update,不要使用事件,不要调用root.something.after(500,function)并且我已经尝试实现。我剩下的是一个弗兰肯斯坦代码,仍然可以检索我的股票价值,但不会更新它们,还有一些我不知道如何更新或在代码中调用的方法。

我所希望的是(可能很长,我知道。很抱歉!)我做错了什么的解释,以及有关如何解决它的建议。我真的想亲自理解和解决该问题,但是只要能解释它们,代码解决方案就很棒。

提前非常感谢!!!

PS:到目前为止,这是我的代码:

from Tkinter import *

import urllib

import re

import time

class MyApp(object):

def __init__(self, parent):

self.myParent = parent

self.myContainer1 = Frame(parent)

self.myContainer1.pack()

self.createWidgets()

button1 = Button(self.myContainer1, command = self.addStockToTrack)

self.myContainer1.bind("<Return>", self.addStockToTrack)

button1.configure(text = "Add Symbol")

button1.pack()

def createWidgets(self):

# title name

root.title("Stock App")

# creates a frame inside myContainer1

self.widgetFrame = Frame(self.myContainer1)

self.widgetFrame.pack()

# User enters stock symbol here:

self.symbol = Entry(self.widgetFrame)

self.symbol.pack()

self.symbol.focus_set()

def addStockToTrack(self):

s = self.symbol.get()

labelName = str(s) + "Label"

self.symbol.delete(0, END)

stockPrice = get_quote(s)

self.labelName = Label(self.myContainer1, text = s.upper() + ": " + str(stockPrice))

self.labelName.pack()

self.myContainer1.after(500, self.get_quote)

def updateStock(self):

while True:

labelName = str(s) + "Label"

stockPrice = get_quote(s)

self.labelName = Label(self.myContainer1, text = s.upper() + ": " + str(stockPrice))

self.labelName.pack()

time.sleep(10)

def get_quote(symbol):

base_url = 'http://finance.google.com/finance?q='

content = urllib.urlopen(base_url + symbol).read()

m = re.search('id="ref_\d*_l".*?>(.*?)<', content)

if m:

quote = m.group(1)

else:

quote = 'Not found: ' + symbol

return quote

root = Tk()

myapp = MyApp(root)

root.mainloop()

回答:

您已经在运行一个无限循环,因此您不应该尝试添加另一个循环。相反,您可以使用该after方法使函数被如此频繁地重复调用。在您的情况下,您可以替换为:

def updateStock(self):

while True:

labelName = str(s) + "Label"

stockPrice = get_quote(s)

self.labelName = Label(self.myContainer1, text = s.upper() + ": " + str(stockPrice))

self.labelName.pack()

time.sleep(10)

… 有了这个:

def updateStock(self):

labelName = str(s) + "Label"

stockPrice = get_quote()

self.labelName = Label(self.myContainer1, text = s.upper() + ": " + str(stockPrice))

self.labelName.pack()

self.after(10000, self.updateStock)

这将得到报价,添加标签,然后安排自己在10秒(10,000毫秒)内再次被调用。

但是,我怀疑您想每10秒创建一个新标签吗?最终,窗口将充满标签。相反,您可以创建一次标签,然后在每次迭代中更新标签。例如,self.label在init中创建一次,然后在循环中可以执行以下操作:

self.labelName.configure(text=s.upper() + ": " + str(stockPrice))

以上是 Tkinter与我的主循环一起管理我的事件循环 的全部内容, 来源链接: utcz.com/qa/405026.html

回到顶部