我正在设计一个在摄氏和华氏之间转换的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()
答案 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按钮情况下的异常。