<p><em>正如评论中指出的,您有一些架构缺陷(这是正常的,因为您正在学习),您可能会从<a href="https://codereview.stackexchange.com/">CodeReview</a>社区(它是stackexchange网络的另一个站点)得到有趣的反馈。</em></p>
<p>这里有几个选项可以用来执行您所称的<em>If语句</em>。事实上你
已经将转换包装在函数中拓宽了可能性。在</p>
<p>1)在if中列举所有组合</p>
<p>您已经开始了,但有一个区别:使用<code>fromUnit.get()</code>来访问tkinter变量的值<sup>1</sup>。在</p>
<pre><code>if (fromUnit.get(), toUnit.get()) == ('Celsius','Celsius'):
celsius_to_celsius()
if (fromUnit.get(), toUnit.get()) == ('Celsius','Fahrenheit'):
celsius_to_fahrenheit()
if (fromUnit.get(), toUnit.get()) == ('Celsius','Kelvin'):
celsius_to_kelvin()
</code></pre>
<p>2)嵌套if</p>
^{pr2}$
<p>3)使用字典(关联数组)存储函数</p>
^{3}$
<p>实际上,它使用嵌套字典。你也只能用一本字典</p>
<pre><code>converters = {
('Celsius', 'Celsius') : celsius_to_celsius,
('Celsius', 'Fahrenheit'): celsius_to_fahrenheit,
('Celsius', 'Kelvin'): celsius_to_kelvin,
}
converters [(fromUnit.get(), toUnit.get())] ()
</code></pre>
<p>4)您使用的一致命名方案允许生成函数名</p>
<pre><code>function_name = fromUnit.get().lower() + "_to_" + toUnit.get().lower()
globals()[function_name] ()
</code></pre>
<p>5)委托调度</p>
<p>通常,大组合if(或者存在的语言中的开关)是重构的一个吸引力。
例如,您可以对<code>convertFromUnit</code>或{<cd3>}(分别是<code>*toUnit</code>)执行初步工作。在</p>
<p>使用嵌套字典的机制与Python对象中使用的机制非常接近。在</p>
<pre><code>def fromUnitCallback():
global _converter
_converter = globals()[fromUnit.get()]()
def toUnitCallback():
global _function_name
_function_name = toUnit.get().lower()
def convert_Temp():
currentTemp = float(initialTemp.get())
_converter.set(currentTemp)
converted = getattr(_converter, _function_name) ()
convertedTemp.set(converted)
class Kelvin:
def __init__(self, val=0):
self.__kelvin = val
def kelvin(self):
return self.__kelvin
def celsius(self):
return self.__kelvin - 273.15
def fahrenheit(self):
return (self.__kelvin - 273.15)*1.8 + 32
def set(self, val):
self.__kelvin = val
class Celsius(Kelvin):
def __init__(self, val):
Kelvin.__init__(self)
self.set(val)
def set(self, val):
Kelvin.set(self, val + 273.15)
class Fahrenheit:
def __init__(self, val):
Kelvin.__init__(self)
self.set(val)
def set(self, val):
Kelvin.set((val - 32)*5/9 + 273.15)
</code></pre>
<p/><hr/>
<sup>1</sup>Tkinter变量是对象,即复合人工制品的嵌入值及其相关方法。除了它们可以是<code>traced</code>,也就是警告它们的值发生了变化。它们与tkinter小部件结合使用,以简化操作。在这里,您要将<code>fromUnit</code>的内容与文本字符串<code>'Celsius'</code>进行比较,因此您必须通过<code>get</code>方法询问<code>fromUnit</code>字符串。有关详细信息,请参见<a href="http://effbot.org/tkinterbook/variable.htm" rel="nofollow noreferrer">http://effbot.org/tkinterbook/variable.htm</a>