【问题标题】:Python 2.7.5 Tkinter Alternate Input Appears BlankPython 2.7.5 Tkinter 备用输入显示为空白
【发布时间】:2013-11-10 23:41:24
【问题描述】:

我正在尝试制作一个货币转换器,它可以自动从 Internet 上的 JSON 文件中检索汇率。我想设计这个程序,如果它不能访问文件,它会让你手动输入费率。到目前为止,除了这部分之外,一切正常。它可以很好地从 JSON 文件中检索数据,但是当您手动输入时,它只是显示为空白。说到 Python 和 Tkinter,我完全是个菜鸟,所以如果我遗漏了一些简单的东西,我不会感到惊讶。

注意:顶部窗口之前的第一部分是实际代码的副本。窗口本身只是显示我遇到的问题的模型。

from Tkinter import *

#**Import Bitcoin market data.**
import json
import urllib2

try:
    btcMarketsJSON = urllib2.urlopen('http://api.bitcoincharts.com/v1/markets.json')
    marketData = json.load(btcMarketsJSON)
    mtGoxUSDdata = [i for i in marketData if i['symbol'] == 'mtgoxUSD']
    bitstampUSDdata = [i for i in marketData if i['symbol'] == 'bitstampUSD']
    mtGoxUSDask = mtGoxUSDdata[0]['ask']
    bitstampUSDask = bitstampUSDdata[0]['ask']
    btcMarketsJSON.close()

except:
    import tkMessageBox as MessageBox
    import tkSimpleDialog as SimpleDialog

    root = Tk()
    root.withdraw()

    if MessageBox.askyesno("Error", "Market data could not be retrieved. Exchange rate will have to be entered manually. Continue anyway?"):
        manualAsk = SimpleDialog.askfloat(" ", "Enter an ask price. This number will be used for all exchanges.")
        mtGoxUSDask = manualAsk
        bitstampUSDask = mtGoxUSDask
    else:
        import sys
        sys.exit()

#**Main Window**      
top = Tk()
top.title("Bitcoin/US Dollar Currency Converter")
top.geometry("+300+300")

selectedAsk = DoubleVar()
selectedAsk.set(mtGoxUSDask)

label = Label(top, textvariable=selectedAsk)
quitButton = Button(top, text="Quit", command=top.destroy)
label.pack()
quitButton.pack()

top.mainloop()

【问题讨论】:

    标签: python json python-2.7 tkinter


    【解决方案1】:

    root.destroy() 添加到except 子句的末尾就可以完成这项工作。至于这种行为的原因,我只能猜测。

    最可能的原因是,当我们执行 selectedAsk = DoubleVar(); selectedAsk.set(mtGoxUSDask) 时,root 仍然处于活动状态,这就是 label 无法正常运行的原因。

    【讨论】:

    • 成功了! :O 就像我怀疑的那样,这很简单。我仍然想知道为什么它会起作用。也许变量以某种方式绑定到根窗口......如果可能的话?但是后来我不明白程序的其余部分是如何识别它们的,而是将它们留空。
    • 我确信全局变量 mtGoxUSDask 不是原因,我验证了这一点。它与 2 个窗口(root 和 top)有关。最可能的原因是,当我们执行 selectedAsk = DoubleVar(); selectedAsk.set(mtGoxUSDask) 时,root 仍然处于活动状态,这就是 label 无法正常运行的原因。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2021-12-11
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多