私はゆっくりと Tkinter とオブジェクト指向プログラミングを学んできましたが、これで隅に追いやられてしまいました。これに関する私の批判的思考の欠如を許してください。しかし、私よりもPythonをよく知っている知っているすべての人に尋ねましたが、ここで実用的な解決策にたどり着くことができません.
ユーザーが株式記号を入力し、各記号の新しいラベルを作成し、各ラベルを定期的に更新できるようにするための gui アプリを開発中です。(本当に基本的なetradeアプリか何かのようなものです)。私は言うことができるので、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ウィンドウがフリーズして永久に回転します。この特定の状況に関連する他のすべてのスレッドを読んでいて、さまざまなアドバイスを見てきました。メインスレッドでスリープを呼び出さないでください。root.update を使用せず、イベントを使用し、root.something.after(500, 関数) を呼び出して、実装しようとしました。私が残したのは、株価を取得するがそれらを更新しないフランケンシュタインのコードと、更新方法やコードのどこを呼び出すかわからないいくつかのメソッドです。
私が望んでいるのは、私が間違っていることの説明と、それを修正する方法についての提案です (長くなる可能性があります。申し訳ありません!)。私は本当に自分で問題を理解して修正したいと思っていますが、説明されている限り、コードソリューションは素晴らしいでしょう.
よろしくお願いします!!!
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()