一般程序布局的优秀来源(最好是Python或C ++)

时间:2012-04-15 17:07:15

标签: c++ python user-interface structure

所以我可以用类做一些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,因为我正在做的就是知道,虽然它可能更通用(跨语言))

  • 当前的应用程序在结构方面是否有用,如果不是,那么我可以改进哪些经验法则?

1 个答案:

答案 0 :(得分: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小部件的子类,请确保至少通过object的子类化来使用新式类:http://realmike.org/blog/2010/07/18/introduction-to-new-style-classes-in-python/

您可能还希望嵌套代码的最后一部分,在经典的python习惯用法中运行事件循环:

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

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