将UI数据传递给`tkinter` GUI的最pythonic方法是什么?

时间:2015-05-14 18:55:31

标签: python user-interface python-3.x tkinter

作为一种自学Python的方法,我已经摒弃了一些旧的本科机械工程文本,并为一些简单的概念创建了一些计算器。假设我有一个计算器类(为了简洁起见非常简单):

from math import pi
import tkinter as tk


class Cylinder(object):

    """Abstraction of a cylinder primitive."""

    def __init__(self):
        """See class docstring."""
        self.radius = 0.0
        self.height = 0.0

    def calc_volume(self):
        """See class docstring."""
        self.volume = pi * self.height * self.radius**2

现在我想将它包装在tkinter gui中。在我的项目中可能有大量的计算器,我当然不想为每个计算器编写自定义包装器,因此我正在尝试开发一种内容不可知的方法。所以,我开始写作:

class CalcGUI(tk.Frame):

    """To do. Write me."""

    def __init__(self, master=None, calc_object=None):
        """See class docstring."""
        tk.Frame.__init__(self, master)
        self.grid()

        self.entries, self.entry_vars = {}, {}
        for num, item in enumerate(calc_object.__dict__):
            tk.Label(self, text=item).grid(row=num, column=0)
            self.entry_vars[item] = tk.StringVar()
            self.entries[item] = tk.Entry(self,
                                          textvariable=self.entry_vars[item])
            self.entries[item].grid(row=num, column=1)

这适用于简单的变量名称,例如radius,但是对于更复杂的项目,我不想混淆具有长self.coefficient_of_thermal_expansionself.average_air_velocity_of_a_coconut_laden_swallow等变量名称的计算器,所以我想要一种优雅的方式将我认为的UI信息传递给GUI,比如英文名称,预期单位等,并且我正在寻找一些最佳实践。我考虑过的一些选择:

  • 使用英文名称,值和单位的插槽制作所有变量tuplesnamedtuples
    • 我认为这会使计算逻辑过于复杂,实际上会降低可读性。
  • 创建包含计算器类的所有UI配置信息的类级别dict。
    • 这样可以保持计算器类中的可读性,但这意味着我在类中存储的东西并没有真正在类中使用(对我来说似乎是unPythonic)。
  • 创建一个单独的配置模块将设置为一切。
    • 这使得计算器类保持整洁,但可能会降低GUI模块内部的可读性。

其中哪些(如果有的话)将被视为Python中的最佳实践?

编辑为什么不是长变量? 考虑下面的光束偏转方程:

  • y = (3 * a - x) * (P * x**2) / (6 * E * I)

将它放在一个类方法中你可以编写类似的东西:

  • self.y = (3 * self.a - self.x) * (self.P * self.x**2) / (6 * self.E * self.I)

或长变量:

  • self.beam_deflection = ((3 * self.force_location - self.location_on_beam) * (self.point_force * self.location_on_beam**2) / (6 * self.modulus_of_elasticity * self.moment_of_inertia))

我个人认为第一种选择更具可读性。也就是说,没有理由我不能像以下那样对变量进行别名:E = self.modulus_of_elasticity

但这仍然只能解决一个难题。它不涉及单位或其他项目(例如,变量应作为条目或列表框输入的标志等)。

0 个答案:

没有答案