我正在尝试使画布可滚动.但是,一旦我尝试设置滚动条以使用画布,tkinter似乎完全忽略了我最初为画布设置的尺寸.我已经尝试将它们全部打包在一个框架中,将画布设置为填充框架然后设置框架尺寸,但这会出现同样的问题,除非我将框架设置为填充窗口,这不是我想要的.基本上,我想要一个带有滚动条的固定大小的画布.我当前的代码看起来像这样(在python 3.1中):
from tkinter import *
root=Tk()
frame=Frame(root,width=300,height=300)
frame.grid(row=0,column=0)
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))
hbar=Scrollbar(canvas,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(canvas,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)
root.mainloop()
Run Code Online (Sandbox Code Playgroud) 希望这不属于"一般性讨论主题",因为我希望它能够以一种有效的方式解决这些问题,而不是关于哪种GUI编程的一般方法绝对最好的大辩论.
所以我已经用tkinter开始了一些GUI编程,长话短说我的代码很快变得非常难看.我正在尝试为视频游戏创建基于图块的地图编辑器.我的主要问题似乎是:
我认为我认为这些问题的原因是因为我使用的函数比使用类要多得多.例如,我的"加载tileset"窗口完全在功能上处理:单击主窗口中的菜单选项调用加载新窗口的函数.在该窗口中,我在查找图像时创建一个打开的文件对话框,并在按下回车键时修改显示图像的画布(以便在图像上绘制适当的网格).功能功能.
对我来说真正糟糕的做法是包含额外的参数来补偿.例如,当我创建一个tileset时,创建的TileSet类的实例应该被发送回主窗口,在那里可以显示适当的信息.我有一个加载的tilesets列表作为一个全局变量(更糟糕的做法:处理我的根窗口的所有内容都在全局范围内!yay!),并且由于回调函数不返回值,我将该列表作为参数传递到我的"加载tileset窗口"函数,然后将参数传递给create tileset函数(当你单击窗口中的相应按钮时调用),它实际上需要它,以便我可以将新创建的tileset添加到列表中.通过函数"层次结构"传递参数似乎是一个可怕的想法.它变得令人困惑,编写模块化代码非常糟糕,而且通常看起来没什么必要.
我解决这个问题的尝试是编写一个代表整个GUI的类,以及可以实际存储相关数据的自定义窗口类(GUI类可以创建和引用).这应该解决在窗口之间传输数据的问题.希望它能减少我在回调中无偿使用lambda函数.但我想知道:这是最好的方法吗?或者至少接近?我宁愿不开始重写,然后最终得到另一个系统,它只是以不同的方式草率和混乱.我知道我的方法很糟糕,但我真的不知道最好的方法是什么.我对如何做特定的事情有很多建议,但没有关于如何整体构建程序的建议.任何帮助将不胜感激.