用户界面-Python MVC风格的GUI温度转换器


#The view (GuiTest.py)
import tkinter
import Controller
class MyFrame(tkinter.Frame):
    def __init__(self, controller):
        tkinter.Frame.__init__(self)
        self.pack()
        self.controller = controller
        #Output Label
        self.outputLabel = tkinter.Label(self)
        self.outputLabel["text"] = ("")
        self.outputLabel.pack({"side":"right"})
        #Entry Space
        self.entrySpace = tkinter.Entry(self)
        self.entrySpace["text"] = ("")
        self.entrySpace.pack({"side":"left"})
        #two convert buttons
        self.convertButton=tkinter.Button(self)
        self.convertButton["text"]= "Fahrenheit to Celsius"
        self.convertButton["command"]=self.controller.buttonPressed2
        self.convertButton.pack({"side":"left"})
        self.convertButton2=tkinter.Button(self)
        self.convertButton2["text"]= "Celsius to Fahrenheit"
        self.convertButton2["command"]=self.controller.buttonPressed1
        self.convertButton2.pack({"side":"left"})
        #Quit button
        self.quitButton = tkinter.Button(self)
        self.quitButton["text"] = "Quit"
        self.quitButton["command"] = self.quit
        self.quitButton.pack({"side":"right"})

模型

import tkinter
import GuiTest
import Controller
class Convert:
    def __init__(self):
        self.fahrenheit = 0
        self.celsius = 0
    def convertToCelsius(self, fahrenheit):
        self.celsius = float((self.fahrenheit - 32)) * (5/9)
        return self.celsius
    def convertToFahrenheit(self, celsius):
        self.fahrenheit = float((self.celsius * (9/5))) + 32
        return self.fahrenheit

控制器

import tkinter  
import GuiTest # the VIEW
import Counter    # the MODEL
class Controller:
    def __init__(self):    
    """
    This starts the Tk framework up
    """
        root = tkinter.Tk()
        self.model = Counter.Convert()
        self.view = GuiTest.MyFrame(self)
        self.view.mainloop()
        root.destroy()
    def buttonPressed1(self):
        result = str(self.model.convertToFahrenheit(self.celsius))
        self.view.outputLabel.config(text = result)
    def buttonPressed2(self):
        result = str(self.model.convertToCelsius(self.fahrenheit))
        self.view.outputLabel.config(text = result)
if __name__ == "__main__":
    c = Controller()

问题

在我的Temperature converter GUI程序中,一切都在工作,但无论我在Entry中键入什么值,它都会传递一个0值,因此当我将输入转换为fahrenheit时,celsius的值将为32和-17.7778。我做错了什么,或者如何将视图中的Entry值获取给我的控制器?非常感谢。

这里有两个错误:

1-在您的Counter.py文件和Convert类方法中,您没有返回正确的变量,而不是return celsius,您应该返回self.celsiusself.fahrenheit 也是如此

2-在Controller.py文件中:

self.view.outputLabel["text"] = self.model.convertToFahrenheit(celsius)这不会更新label,相反,您应该执行以下操作:

result = str(self.model.convertToFahrenheit(float(celsius))) #need to convert to string
self.view.outputLabel.config(text=result) #update the label with result

buttonPressed2方法也是如此

第1版:

最好更改Convert类中的方程式,以返回正确的float结果:

self.celsius = float((fahrenheit - 32.0) * (0.56))

self.fahrenheit = float((celsius * 1.8) + 32.0)

第2版:这就是Convert类的buttonPressed1方法:

def buttonPressed1(self):
        celsius = self.view.entrySpace.get()
        result = str(self.model.convertToFahrenheit(float(celsius)))
        self.view.outputLabel.config(text=result)

对于buttonPressed2为:

def buttonPressed2(self):
        fahrenheit = self.view.entrySpace.get()
        result = str(self.model.convertToCelsius(float(fahrenheit)))
        self.view.outputLabel.config(text=result)

相关内容

  • 没有找到相关文章

最新更新