1

所以我可以用类做一些 C++ 控制台的东西(我认为没什么太花哨的),然后从 Python(很棒的语言,就像 C++ 没有后顾之忧)和 Tkinter 开始。

问题是我真的不知道带有 GUI 的程序通常是如何构造的。我知道您必须将界面与内部工作分开,但仅此而已。作为一个例子,我正在开发一个将 Excel 表转换为 LaTeX 表的小应用程序,到目前为止我有这个:

from Tkinter import *

class ExcelToLateX:
    def __init__(self,master):
        self.convert = Button(master,text="Convert",command=self.Conversion)
        self.convert.pack(side=BOTTOM,fill=X)
        self.input=Input(master,40)
        self.output=Output(master,40)
    def Conversion(self):
        self.output.Write(self.input.Read())


class Input:
    def __init__(self,master,x):
        self.u=Text(master,width=x)
        self.u.pack(side=LEFT)
        self.u.insert(1.0,"Paste Excel data here...")

    def Read(self):
        return self.u.get(1.0,END)


class Output:
    def __init__(self,master,x):
        self.v=Text(master,width=x)
        self.v.pack(side=RIGHT)
        self.v.insert(1.0,"LaTeX code")
    def Write (self,input):
        self.input=input
        if self.v.get(1.0,END)=="":
            self.v.insert(1.0,self.input)
        else:
            self.v.delete(1.0,END)
            self.v.insert(1.0,self.input)

#Test script
root=Tk()
Window=ExcelToLateX(root)
root.mainloop()

所以我有两个可以读取和写入内容的 Text 小部件和一个(目前)空转换类,它将获取 Excel 表格并输出 LaTeX 代码。我不知道这是否是要走的路(因此感谢任何评论/提示)。

所以简而言之,我有两个问题:

  • 是否有任何广为人知的来源提供有关具有 GUI 的程序的结构的信息?(最好是 Python 和 Tkinter,因为这就是我正在做的事情,尽管它可能更通用(跨语言))

  • 我当前的应用程序在结构方面有什么好处,如果没有,有哪些经验法则和我可以改进的地方?

4

1 回答 1

2

我只想对帽子发表一些简短的评论。我没有使用 Tkinter 的经验,所以我的知识来源于 PyQt4 的经验。

现在,您正在通过将单个小部件作为成员属性来为您的类使用组合。这显然可以工作,但一个有用的模式是子类化一个 GUI 小部件,然后通过添加更多子小部件和为该类添加父级来组成布局。请参阅我发现的这个随机 Tkinter 教程链接上的示例:http: //zetcode.com/tutorials/tkintertutorial/

class Example(Frame):
    def __init__(self, parent):
        super(Example, self).__init__(parent)
        ...

就像一般的 Python 约定一样,您应该尝试对类名使用大写,对类实例方法和变量使用 camelCase 或 under_score。正如您所拥有的那样,您将大写字母用于实例 ( Window =) 和方法 ( Write)

此外,如果您不打算继承 Tkinter 小部件,请确保至少通过从以下子类继承来使用新式类objecthttp ://realmike.org/blog/2010/07/18/introduction-to-new -style-classes-in-python/

您可能还希望将代码的最后一部分嵌套在经典 python 习语中运行事件循环的位置:

if __name__ == "__main__":
    root=Tk()
    window = ExcelToLateX(root)
    root.mainloop()

如果您将此模块作为库导入另一个应用程序,它会阻止您的应用程序立即执行。

于 2012-04-15T17:58:16.710 回答