Python3:GUI以后无法正确显示输出?

时间:2016-06-16 05:41:57

标签: python-3.x tkinter

我正在设计一个在摄氏和华氏之间转换的GUI应用程序。目前,主要有两个我无法解决的问题:

1)当我输入需要根据给定转换公式转换的整数时,tkinter中的标签无法正确显示输出。事实上,它显示了这样的事情:

<conversionModel.Conversion object at 0x1057b11d0>

这使得像我这样的初学者调试真的很困难。

2)有一个quitButton,我们可以{GUI}申请destroy()。问题是,当我通过单击窗口的红叉来关闭GUI时,Shell会说:

_tkinter.TclError: can't invoke "destroy" command: application has been destroyed

我检查了有关同一问题的其他问题的答案,结果是因为这个GUI应用程序在关闭之前被销毁了。我不知道如何解决这个特殊问题。

以下是以模型/视图/控制器形式编写的三段代码:

conversionModel.py中的模型:

class Conversion:

        """
        class Conversion is the Model for a celsius-fahrenheit conversion
        application. It converts celsius into fahrenheit and fahrenheit into
        celsius.
        """

        def toCelsius(self, temp):
            return (5 / 9) * (temp - 32)

        def toFahrenheit(self, temp):
            return ((9 / 5) * temp) + 32

convertView.py中的视图:

import tkinter

class MyFrame(tkinter.Frame):

def __init__(self, controller):
    tkinter.Frame.__init__(self)
    self.pack()
    self.controller = controller

    self.tempEntry = tkinter.Entry()
    self.tempEntry.insert(0, "0")
    self.tempEntry.pack({"side": "left"})        

    self.celsiusButton = tkinter.Button(self)
    self.celsiusButton["text"] = "Celsius"
    self.celsiusButton["command"] = self.controller.buttonToC
    self.celsiusButton.pack({"side": "left"})

    self.fahrenheitButton = tkinter.Button(self)
    self.fahrenheitButton["text"] = "Fahrenheit"
    self.fahrenheitButton["command"] = self.controller.buttonToF
    self.fahrenheitButton.pack({"side": "left"})

    self.labelForOutput = tkinter.Label(self)
    self.labelForOutput["text"] = 0
    self.labelForOutput.pack ({"side": "left"})

    self.quitButton = tkinter.Button(self)
    self.quitButton["text"] = "Quit"
    self.quitButton["command"] =  self.quit
    self.quitButton.pack({"side": "left"})

controller.py中的Controller:

import tkinter
import conversionView
import conversionModel

class Controller:

    def __init__(self):
        root = tkinter.Tk()
        self.model = conversionModel.Conversion()
        self.view = conversionView.MyFrame(self)
        self.value = float(self.view.tempEntry.get())
        self.view.mainloop()
        root.destroy()

    def buttonToC(self):
        self.model.toCelsius(self.value)
        self.view.labelForOutput["text"] = str(self.model) + " °C"

    def buttonToF(self):
        self.model.toFahrenheit(self.value)
        self.view.labelForOutput["text"] = str(self.model) + " °F"

if __name__ == "__main__":
    c = Controller()

1 个答案:

答案 0 :(得分:3)

对于#1,您需要在每次转换时阅读tempEntry控件,并捕获转换结果以进行打印。现在,您只能阅读tempEntry上的__init__控件,而str(self.model)只会打印出模型对象的名称。这应该有效:

def buttonToC(self):
    fahr = float(self.view.tempEntry.get())
    temp = self.model.toCelsius(fahr)
    self.view.labelForOutput["text"] = str(temp) + " °C"

def buttonToF(self):
    celsius = float(self.view.tempEntry.get())
    temp = self.model.toFahrenheit(celsius)
    self.view.labelForOutput["text"] = str(temp) + " °F"

对于#2,我对Tk还不熟悉,但还不知道为什么Quit按钮正常工作但是红色X在你开始调用root.destroy之前会破坏窗口,但这应该可以解决它:

self.view.mainloop()
 try:
    root.destroy()
except tkinter.TclError:
    pass

退出按钮需要销毁,但X按钮不需要并抛出异常。此代码只是忽略了X按钮情况下的异常。