希望这不属于“一般讨论话题”,因为我希望它更多地关注如何以高效的方式解决问题,而不是就GUI编程的一般方法进行大型辩论。
所以我开始使用tkinter进行GUI编程,长话短说,我的代码很快变得非常丑陋。我试图创建一个基于瓷砖的地图编辑器用于视频游戏。我的主要问题似乎是:
1. 回调函数无法返回值。 2. 在窗口之间轻松传输数据的能力有限。
我认为我之所以将这些视为问题,是因为我更多地使用函数而不是类。例如,我的“加载瓷砖集”窗口完全由函数处理:在主窗口中点击菜单选项调用函数来加载新窗口。在该窗口内,当查找图像时,我创建了一个打开文件对话框,并在按下回车键时修改显示图像的画布(以便绘制适当的网格)。函数,函数,函数。
对我来说看起来像是非常糟糕的做法是包含额外的参数来补偿。例如,当我创建一个瓷砖集时,应该将创建的TileSet类的实例发送回到主窗口,以便显示适当的信息。我有一个已加载的瓷砖集列表作为全局变量(更糟糕的做法:与我的根窗口有关的所有内容都在全局范围内!),因为回调函数无法返回值,我将该列表作为参数传递给我的“加载瓷砖集窗口”函数,然后再将参数传递给创建瓷砖集函数(当您单击窗口中的适当按钮时调用),在那里它实际上是需要的,以便我可以将新创建的瓷砖集添加到列表中。通过这样的函数“层次结构”传递参数似乎是一个可怕的想法。它变得混乱,对于编写模块化代码来说非常糟糕,而且似乎是不必要的。
我的解决问题的尝试是编写代表整个GUI的类,并且自定义窗口类(GUI类可以创建和引用)可以实际存储相关数据。这应该解决在窗口之间传输数据的问题。希望这也能减少我在回调中使用lambda函数的滥用。但是我想知道:这是最好的方法吗?或者至少接近了吗?我不想开始重写,然后最终得到另一个以不同方式笨拙和混乱的系统。我知道我的方法很糟糕,但我不知道最佳方法是什么。我得到了很多关于如何做特定事情的建议,但没有关于如何整体构建程序的建议。任何帮助都将不胜感激。
所以我开始使用tkinter进行GUI编程,长话短说,我的代码很快变得非常丑陋。我试图创建一个基于瓷砖的地图编辑器用于视频游戏。我的主要问题似乎是:
1. 回调函数无法返回值。 2. 在窗口之间轻松传输数据的能力有限。
我认为我之所以将这些视为问题,是因为我更多地使用函数而不是类。例如,我的“加载瓷砖集”窗口完全由函数处理:在主窗口中点击菜单选项调用函数来加载新窗口。在该窗口内,当查找图像时,我创建了一个打开文件对话框,并在按下回车键时修改显示图像的画布(以便绘制适当的网格)。函数,函数,函数。
对我来说看起来像是非常糟糕的做法是包含额外的参数来补偿。例如,当我创建一个瓷砖集时,应该将创建的TileSet类的实例发送回到主窗口,以便显示适当的信息。我有一个已加载的瓷砖集列表作为全局变量(更糟糕的做法:与我的根窗口有关的所有内容都在全局范围内!),因为回调函数无法返回值,我将该列表作为参数传递给我的“加载瓷砖集窗口”函数,然后再将参数传递给创建瓷砖集函数(当您单击窗口中的适当按钮时调用),在那里它实际上是需要的,以便我可以将新创建的瓷砖集添加到列表中。通过这样的函数“层次结构”传递参数似乎是一个可怕的想法。它变得混乱,对于编写模块化代码来说非常糟糕,而且似乎是不必要的。
我的解决问题的尝试是编写代表整个GUI的类,并且自定义窗口类(GUI类可以创建和引用)可以实际存储相关数据。这应该解决在窗口之间传输数据的问题。希望这也能减少我在回调中使用lambda函数的滥用。但是我想知道:这是最好的方法吗?或者至少接近了吗?我不想开始重写,然后最终得到另一个以不同方式笨拙和混乱的系统。我知道我的方法很糟糕,但我不知道最佳方法是什么。我得到了很多关于如何做特定事情的建议,但没有关于如何整体构建程序的建议。任何帮助都将不胜感激。
Button(root, text="foo", command=lambda arg="foo": callback(arg))
- Steven Rumbalski